文档的说法是,set_input_delay和set_output_delay描述的是数据在端口处与某时钟的时序关系。这样的说法是很表面的。input/output其实是模拟数据在端口外的延时,实际上这是端口的一个外部约束条件,目的是为了约束FPGA输入端口到内部寄存器数据输入端或者内部寄存器输出端到FPGA输出端口之间允许的延时(因为这中间可能有组合逻辑),理解这一点非常重要。
既然模拟的是数据在外部的情况,那么弄清楚这个延时是相对于哪个时钟而言的就很重要(这里也是泛泛而谈,后面有详细一点的分析)。很显然,这里的对象时钟是虚拟时钟virtual
clock。
对于任何一种情况,有一点必须要保证:必须保证接收端能接收到数据。在推导过程中,这一条是隐含的前提。
二、set_input_delay的推导
对于set_input_delay,虚拟时钟是Launch,为保证FPGA能采样到数据,对源寄存器与目的寄存器之间的路径延时是有限制的。假如延时太大,FPGA端的建立时间可能不满足;延时太小,FPGA端的保持时间可能不满足。因此,计算max时考虑的是建立时间的情况,计算min时考虑的是保持时间的情况。
考虑保持时间时,可得如下关系:
Launch + Tco_ext + Td_ext + Td_in + uTsu =
Latch
假如Td_in为Td_in_max,如果时钟周期不变,外界最糟糕的情况是,(Tco_ext
+ Td_ext)的值也为最大。SDC对输入时max的定义如下:
set_input_delay –max {Tco_ext + Td_max}
实际上这并不是FPGA内部的延时,这只是FPGA内部延时的相关量,因为很明显内部的延时是Td_in。为什么不直接使用内部延时呢?因为那样的话涉及到的变量太多,而这两个参数,在板卡和板卡环境确定之后,几乎是不会变化的。这个相关量的意义是,Td_in想往上增大是要受到这个相关量的约束的。
考虑建立时间时,可得:
Launch + Tco_ext + Td_in + Td_ext + Tsrc =
Latch + uThd
假如Td_in为Td_in_min,外界最糟糕的情况是(Tco_ext +
Td_ext)的值也为最小。SDC对输入是min的定义如下:
set_input_delay –min {Tco_ext +
Td_min}
当然这也是相对量。
有一点应该说明,-max和-min不会同时达到极限值,因为Td不会同时既为max又为min。因此,假如su或者hd有一个时序不收敛,内部的路径延时是有调整空间的。
三、set_output_delay的推导
对于set_output_delay,虚拟时钟是Latch。
考虑外部寄存器的建立时间,可得:
Launch + uTco + Td_in + Td_ext + Tsu_ext =
Latch
假如Td_in为Td_in_max,最糟糕的情况是(Td_ext +
Tsu_ext)也为最大。SDC对输出时max的定义如下:
set_output_delay –max {Td_max + Tsu_ext}
考虑外部寄存器的保持时间,可得:
Launch + uTco + Td_in + Td_ext + Tsrc = Latch
+ Thd_ext
假如Td_in为Td_in_min,最糟糕的情况是Td_ext亦为最小。SDC对输出是min的定义如下:
set_output_delay –min {-Thd_ext +
Td_ext_min}
至于为什么不写成(Thd_ext –
Td_ext_min),是为了计算时与max一致。在验证建立时间是否满足时,在Latch确定了的情况下,需要Latch减去max得到Data Required
Time。在验证保持时间时,为了计算一致,希望也用Latch减去min来得到Data Required Time,而这时Required的计算应写为
Latch + Thd_ext – Td_ext_min
变换一下可得
Latch – (-Thd_ext + Td_ext_min)
min就是这样得来的。