riple

Stay Hungry, Stay Foolish.

FPGA时序问题一例——同步接口和输出寄存器布局位置约束

0
阅读(3686)

一、出问题的同步接口介绍

下图是一个芯片的同步接口时序图,这里给出的是向芯片寄存器写入数据的时序图。

简单介绍一下接口时序。该接口的同步时钟是BCLK,由FPGA提供,最高50MHz。除去SRDYN信号是该芯片驱动以外,所有信号都由FPGA驱动。除去ADSN信号外,所有信号都和BCLK有一定的建立、保持时间关系。

FPGA和芯片的握手关系如下:

1. 该次写传输从FPGA驱动ADSN有效开始,芯片在ADSN的上升沿捕获访问地址。
2. FPGA驱动SWR信号置高(和BCLK的关系是t5、t6)。
3. FPGA驱动CYCLEN信号有效(和BCLK的关系是t3、t4),SWR信号高电平被芯片捕获,芯片确认此次传输是写入操作。
4. 芯片驱动SRDYN信号有效(和BCLK的关系是t9、t10),作为对CYCLEN信号的反馈。
5. FPGA驱动RDYRTN信号有效(和BCLK的关系是t11、t12),Write Data被芯片捕获(Write Data和BCLK的关系是t7、t8)。
6. 芯片驱动SRDYN信号无效,写传输结束。

二、时序问题的表现

我在设计该接口时,采用了FPGA片内的PLL。由PLL输出两路同频同相的50MHz时钟,一路驱动片内同步逻辑,一路驱动时钟输出引脚BCLK。之所以采用PLL,是为了在需要的时候可以调整两路时钟的相位关系,补偿时钟信号和总线信号到达的时间差。

这里我有一个假设,即在理想情况下,两路时钟在片内和片外都没有相位差,这样一来,用FPGA片内寄存器的Tco就可以保证总线信号的保持时间,而建立时间会很宽裕。现在看来,这一假设是很冒险的:这一假设只有在FPGA片内才能成立,布局布线工具可以保证满足FPGA内部寄存器的建立保持时间;在片外,PCB的布线、连接件都会影响信号的传播时间,布局布线工具虽然可以考虑这些因素,但是很难得到这些因素的准确数值;还有一点很重要,就是FPGA寄存器输出端到FPGA引脚的延时,在后面会详细说明这一点。

上板实测时,采用内部和外部逻辑分析仪分别观察了总线信号的时序关系,发现不需要进行相位补偿就可以满足芯片的时序要求。经过小批量的数据传输测试,也没出现问题。

接下来,由于项目进展的需要,在FPGA开发板和芯片测试板之间增加了一块转接板。同时,FPGA内部的相关逻辑也完成了,压力测试也跑起来了。问题逐渐在压力测试中暴露出来——写入芯片缓冲区的数据会不规则地出现连续的0值,而缓冲区的地址指针递增无误。

看起来,是芯片接口的数据总线出现了问题。

三、时序问题的定位

我从数据总线驱动的源头一直查到数据总线选择器的控制输入,检查过程中既采用了代码审查的方式查找可能的逻辑错误,也采用了内部逻辑分析仪观察关键信号,还检查了时序分析的结果,都没有发现问题。最后,采用外部逻辑分析仪确认FPGA没有向总线上输出过错误模式的数据。这时,我开始怀疑是芯片接口出现了时序问题。

在采用内部逻辑分析仪调试的过程中,每次观察信号发生变化重新编译后,问题出现的频率也会产生变化。有时候问题反复出现,有时候问题又不出现了。

我采用外部逻辑分析仪对问题重现频率最高的版本进行了观察,发现上述时序图中的RDYRTN信号相对于BCLK会出现保持时间不够的情况,而其它接口信号的时序正常。数据出错的问题得到了初步定位,缓冲区指针递增正确的现象也得到了解释。

四、时序问题的解决

解决保持时间不够的问题预先有准备,调节PLL输出的两路时钟的相位差即可。但是问题真的这么简单吗?不是。这里存在三个因素会影响接口时序。

问题一:BCLK的相位没有调整到最佳,没能使芯片按照BCLK采样控制信号时得到最大的采样窗口,甚至使部分接口信号的采样位置处于临界状态,时序问题时有发生。这是该接口表现出来的主要的时序问题。

问题二:在调试过程中出现过编译条件改变后会导致时序情况恶化或好转的现象,这表明在该时序问题中还存在除BCLK之外的其他因素。通过比较时序表现差异很大的两次编译结果的Timing Closure Floorplan,发现RDYRTN引脚的驱动逻辑的布局位置有很大的差别,进而导致驱动逻辑到输出引脚的延时在两次编译后出现最大1.5ns的差异,这一差异是该时序问题对编译条件敏感的主要原因。如果不解决该问题,会导致通过调整BCLK相位获得的采样窗口在不同的编译条件下发生移动,调整BCLK 相位的效果会打折扣;该问题还会导致接口上各个信号的输出延时不一致,按照一个信号的观察结果调整BCLK的相位可能会顾此失彼。

问题三:调整BCLK相位后,BCLK与FPGA片内时钟会产生一个相位差,芯片按照BCLK驱动的信号SRDYN被FPGA片内时钟采样时,该相位差就会影响SRDYN信号在FPGA端的采样窗口。这一问题在调整BCLK相位后表现很明显。

首先,解决了问题二。在FPGA驱动的接口信号的输出端都引入了一个寄存器,然后通过Quartus II的Assignment Editor工具给这几个寄存器都加入了Fast Output Register的约束,在Timing Closure Floorplan中观察编译后的结果发现这些寄存器都被布局到输出引脚对应的IO cell中的寄存器位置,该寄存器到输出引脚的延时都是0ns,可以保证所有接口输出引脚延迟一致。

接下来,解决了问题一。给FPGA内部时钟加入了120度的相移。该数值是实际观察接口时序得到的最佳值,可以保证各个信号与BCLK的最大采样窗口。

最后,解决了问题三。对SRDYN信号在FPGA端进行了跨时钟域处理,采用两级寄存器同步了该信号。

经过上述修改的电路彻底消除了在该接口的时序问题,可以通过压力测试。

五、避免和解决该问题的方法归纳

1. 同步接口的时钟相位问题需要在设计前充分考虑,建议采用PLL,在设计实现后最好采用示波器或逻辑分析仪实测,并进行调整,保证最大的采样窗口。外部电路发生改变后,需要重复调整过程。

2.在上述接口中,由于引入了信号驱动时钟和接口时钟的相位差,所以芯片反馈的时钟需要进行跨时钟域处理。两级寄存器同步即可。 即使不引入相位差,也最好采用跨时钟域处理。

3.Signal Tap II提供了内部信号良好的可观测性,但是也会对内部信号的运行产生干扰,表现在影响内部信号的布局和布线上。该影响会导致芯片时序发生变化。这一影响也可以作为检验电路时序余量的依据。

4.在编译后执行时序分析,如果时序分析的结果有很大的时序余量,内部逻辑发生时序问题的可能性可以排除。但不能排除接口电路的时序问题。

5.为了控制输出信号的时序,在设计的顶层对所有组合逻辑驱动的输出信号都要加入一级寄存器,这样才能方便地进行布局约束和时序分析。

6.在同步接口中,对同步时钟和总线信号有确定的时序要求。满足这一要求,既可以采用调整同步时钟相位的方法,也可以采用约束输出信号输出延时的方法,两种方法需要结合使用。调整信号输出延时仅采用逻辑方法是不够的,还需要在物理层面对信号的布局布线进行约束。下图就是采用Fast Output Register约束的效果,其中0-3区的LEDS[0]引脚的扇入寄存器就被约束到了IO cell中,扇入延时为0;而0-2区的LEDS[1]信号没有采用该约束,扇入延时达到了5.694ns;同样,0-1区的LEDS[2]的扇入延时为 4.866ns。

推荐强文一篇:系统时序基础理论

Baidu
map