FPGA时序约束与收敛技巧实战 - 第1节
一、时序分析基础:建立时间与保持时间
各位同学,咱们今天聊聊时序分析最核心的两个概念——建立时间和保持时间。说实话,我刚开始学FPGA那会儿,觉得这两个概念就是背定义、应付考试。直到有一次,我调试一块高速AD采集板,数据老是出错,折腾了三天才发现是保持时间违例。从那以后,我再也不敢小看这两个基础概念了。
1.1 建立时间(Setup Time)
建立时间,说白了就是数据在时钟有效沿到来之前,必须提前稳定下来的最短时间。你想想看,寄存器内部是由一堆晶体管组成的,数据信号进来后需要时间让内部电路稳定。如果数据来得太晚,寄存器可能采到错误的值。
定义:建立时间(Tsu)是指在时钟有效沿到达之前,数据输入必须保持稳定的最小时间。
我在项目中遇到过这样一个案例:一个100MHz的设计,综合后时序报告显示建立时间违例了0.3ns。当时我以为是代码写得太复杂,后来发现是时钟偏斜(clock skew)没处理好。嗯,这里要注意,建立时间违例通常可以通过降低频率、优化逻辑级数或者调整时钟相位来解决。
1.2 保持时间(Hold Time)
保持时间呢,刚好跟建立时间相反。它指的是时钟有效沿到来之后,数据还必须保持稳定的最短时间。为什么会这样?因为时钟沿采完数据后,寄存器内部的锁存器需要一点时间把数据锁住。如果数据变化太快,锁存器还没来得及关门,数据就跑了。
定义:保持时间(Th)是指在时钟有效沿到达之后,数据输入必须保持稳定的最小时间。
注意:保持时间违例比建立时间违例更难处理。建立时间违例可以降频,但保持时间违例跟频率无关。我曾经在一个设计中,保持时间违例了0.1ns,加了好几级缓冲器才修好。所以布局布线时就要提前考虑。
1.3 建立时间与保持时间的关系
这两个时间其实是一对矛盾体。你想想看,建立时间要求数据早到,保持时间要求数据晚走。那数据到底该什么时候来?
我个人的理解是:数据必须在时钟沿前后各留出一段安全窗口。这个窗口的前半段叫建立时间,后半段叫保持时间。只要数据在这个窗口内保持稳定,寄存器就能正确采样。
| 参数 | 符号 | 典型值(以Xilinx 7系列为例) | 说明 |
|---|---|---|---|
| 建立时间 | Tsu | 0.1~0.3 ns | 时钟沿前数据需稳定 |
| 保持时间 | Th | 0.0~0.2 ns | 时钟沿后数据需稳定 |
| 时钟到输出 | Tco | 0.2~0.5 ns | 时钟沿后数据输出延迟 |
二、时序路径的组成
搞清楚了建立时间和保持时间,咱们来看看时序路径。FPGA里的时序路径一共就四种,说白了就是信号从哪来到哪去。我习惯把它们分成四类来理解:
2.1 输入到寄存器(Input to Register)
这条路径从FPGA的输入引脚开始,经过输入缓冲、布线,最终到达第一个寄存器的数据输入端。我在做ADC接口设计时,经常要约束这类路径。因为外部芯片的数据输出延迟是固定的,你得保证数据到达FPGA内部寄存器时,能满足建立时间和保持时间。
个人经验:对于输入到寄存器的路径,我一般会加一个input delay约束。这个值怎么设?看外部器件的datasheet,找到最大输出延迟和最小输出延迟,然后换算成FPGA侧的约束。
2.2 寄存器到寄存器(Register to Register)
这是最经典的路径,也是我们最常分析的。信号从一个寄存器出发,经过组合逻辑,到达下一个寄存器。说白了,这条路径的延迟决定了你的设计能跑多快。
路径延迟 = Tco(时钟到输出)+ Tlogic(组合逻辑延迟)+ Trouting(布线延迟)+ Tsu(建立时间)
我刚开始做设计时,总觉得组合逻辑层数多一点没关系。直到有一次,一个32位加法器级联了8层,综合后频率死活上不了200MHz。后来拆成流水线,每层只做4位加法,频率直接飙到400MHz。所以,寄存器到寄存器的路径,关键就是控制组合逻辑的深度。
2.3 寄存器到输出(Register to Output)
这条路径从内部寄存器的时钟端开始,经过寄存器输出、输出缓冲,最终到达FPGA的输出引脚。这类路径的约束通常是为了满足外部器件的时序要求。
我记得有一次做DDR3接口,输出数据的建立时间和保持时间要求非常严格。我不得不把输出寄存器放在IOB(输入输出块)里,利用IOB自带的寄存器来减少输出延迟。嗯,这里要注意,IOB里的寄存器和普通逻辑里的寄存器,延迟差别很大。
2.4 输入到输出(Input to Output)
这条路径比较特殊,它不经过任何寄存器,直接从输入引脚到输出引脚。说白了就是纯组合逻辑路径。这类路径在设计中尽量少用,因为时序很难收敛。
避坑指南:我曾经在一个设计中,为了省一个时钟周期,把输入信号直接组合后输出。结果时序分析报告显示这条路径的延迟有5ns,而时钟周期才10ns。虽然没违例,但余量太小。后来我加了一级寄存器,虽然多了一个时钟周期延迟,但时序余量大了很多,设计也更可靠。
三、知识体系结构图
下面这张图是我自己总结的时序分析知识体系,把今天讲的内容串起来。你仔细看看,就能明白这四种路径之间的关系。
四、总结
今天咱们把时序分析的基础打牢了。建立时间和保持时间是所有时序约束的根基,四种时序路径覆盖了FPGA设计中的所有数据流动场景。我个人觉得,理解这些概念最好的方法就是动手做一个小设计,然后用时序分析工具跑一遍,看看每条路径的延迟是多少。
记住一句话:时序分析不是跑完工具就完事了,你得能看懂报告,知道哪里出了问题,怎么去修。这才是真正的功力。
课后练习:找一个你之前做过的设计,打开时序报告,看看四种路径分别有哪些。重点关注建立时间和保持时间的余量,如果余量小于0.1ns,想想怎么优化。
可可精品资料库