FPGA时序分析实用指南
1.
基本时序分析
a)
时钟周期
时钟周期分析是最简单的一个, 也是最容易理解的一个分析, 硬件对应的基本道理是寄存器输出延迟 + 逻辑操作延时 + 连线延迟 + 建立时间 必须小于时钟周期, 上面的式子即定义了最短的时钟周期, 也即信号的最高工作频率. 在一些实际情况下, 上面的式子会有一些变化, 比如考虑时钟的抖动, 不同信号状态下传输的延迟不一样, 等. 一般情况下, 分析最坏情况即可. 一般情况下, 时钟周期都是作为全局约束添加的. 在FPGA工作当中, 只需要加一个简单的时钟周期约束即可. 在实际项目当中, 可能会遇到有多个相关时钟, 在Quartus II中, 可以设置时钟之间的相对关系, 然后只需要设置基本的时钟约束即可. 可以在 Assignments à Settings à Timing Analysis Settings à Classical timing analyzer à Individual clock中设置. 对Quartus比较熟悉的也可以通过.qsf文件设置, 具体语法可以参考原有的设置, 一般情况下, 只要稍作修改就可以了. 直接编辑.qsf文件的好处是对于添加多个类似的约束比较快. 在ISE中, 可以使用 User constraints à create timing constraints, 通过图形界面设置, 也可以直接编辑.ucf文件实现. 同样, 具体语法可以参考现成的文件.
b)
输入setup
输入数据的setup要求是初学者经常搞糊涂的一个约束. 其实Quartus和ISE里边对输入setup的定义都非常清晰, 也即, 从外部来看, 只要满足时钟和数据一定的关系, FPGA内部可以保证不会出现亚稳态现象(即采在数据的沿上). 下面这幅图给出了Tsu的定义.
在Quartus中, 这个参数是Tsu, 其准确定义如下: The length of time for which data that feeds a register via its data or enable input(s) must be present at an input pin before the clock signal that clocks the register is asserted at the clock pin. 具体计算公式如下: tSU = <pin to register delay> + <micro setup delay> - <clock to destination register delay>. 确切的说, 这个定义应该是从外部看到的FPGA的时序要求. 比如Tsu为 0.5ns, 那么只要数据在0.5ns之前建立, 数据送入FPGA应该不会出现问题. Tsu可以是全局约束, 也可以是局部约束. 全局约束可以通过Assignments à Settings à Timing Analysis Settings à Classical timing analyzer中的Tsu来设置, 局部约束可以通过Assignment Editor来添加.
在ISE中, 叫做Offset In Before或者Pad to setup, 准确定义如下: The minimum time for input signals to be stable before they can be sampled correctly on the next active clock edge. 具体计算公式为: Slack = Requirement - (Data Path - Clock Path + uncertainty)
举个例子来说, 如果时序报告给出数值为4.468ns, 那么这意味着数据必须在时钟沿之前4.468ns建立, 换而言之, 只要外部送入数据在4.468ns之前建立, FPGA内部采用不会出问题. 具体的计算方法如同Altera. Offset in Before可以是全局约束, 也可以局部约束, 在Constraint Editor可以设置.
在实际使用过程中, 通常大部分情况下, 数据和时钟都是每个周期有效. 因此, 数据到底在哪个时钟周期被寄存器捕获其实并不重要, 关键是所有的相关数据(比如一个总线的数据[7:0])必须保证在一个时钟周期内采样. 因此, 如何避开会造成亚稳态以及如何使得相关的数据的Tsu尽量保持一致, 是解决数据输入FPGA的时序问题的关键. 比如, 假定输入FPGA的数据在时钟沿的1ns处发生变化, 那么Tsu应当避开这个1ns附近这个区域. 只要按照上述原则操作, 时序裕量都会是够的. 在一些特殊情况下, 比如有使能信号传递, 或者是数据的时钟周期必须严格对其, 或者是时钟抖动特别大, 则需要更加仔细的考虑时序约束.
c)
Tco
Tco是Clock to output的延时. 道理如同Tsu, 只不过是换个角度看问题, 即作为驱动源来看待的问题. 也是从外部观察的. 下面这幅图给出了Tco的定义
在Quartus中, 这个参数是Tco, 其准确定义如下: The maximum time required to obtain a valid output at an output pin that is fed by a register after a clock signal transition on an input pin that clocks the register. 意思是相对于输入时钟管脚而言, 从寄存器输出的数据(到达pin)最长多长时间可以稳定. 具体的计算公式如下:
tCO = <clock to source register delay> + <micro clock to output delay> + <register to pin delay>. Tco可以是局部约束, 也可以是全局约束. 具体设置方法和Tsu类似.
在ISE中, 这个参数是Offset out after或者称为Clock to Pad, 其准确定义如下: The clock-to-output, or OFFSET OUT, delay of the FPGA is the total delay encountered from the time a clock edge arrives at the input pin of the device to the time data becomes valid at the output pin of the device. 具体计算公式为Slack = Requirement – (Clock Arrival + Clock Path + Data Path + Clock Uncertainty). Offset Out After可以为全局约束或者是局部约束, 在constraint editor工具或者直接编辑UCF文件均可设置. 下面的一个报告给出了一个示例:
OFFSET = OUT 4 ns AFTER COMP "ClkIn";
Largest slack: 0.667 ns; Smallest slack: 0.667 ns; Relative Skew: 0.0 ns;
+-----------------------------------------------+-------------+-------------+
|PAD | Slack |Relative Skew|
+-----------------------------------------------+-------------+-------------+
|DataOut<0> | 0.667| 0.0 |
+-----------------------------------------------+-------------+-------------+ 即要求的Tco为4ns, 实际的Tco为3.333ns, 寄存器输出的最大延迟不超过3.33ns.
在实际应用中, 还需考虑其他的一些因素, 比如时钟布线的策略, 比如星形结构, Daisy Chain结构等等. 不同的策略分析的方法有所差别 |