http://xilinx.eepw.com.cn/news/list/t/10
http://xilinx.eepw.com.cn/news/article/a/1476
http://www.cnblogs.com/linjie-swust/archive/2012/03/01/FPGA.html
https://www.cnblogs.com/freshair_cnblog/archive/2012/09/12/2681060.html
http://bbs.eetop.cn/thread-396769-1-1.html
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就是这样得来的。
一条完整的时序路径,从源触发器的C端开始,经过Tcko和路径传输延时再到目的触发器的D端结束。放在系统同步的接口时序上,传输延时则变成板级传输延时(还要考虑skew),所以上述 -max 后的数值是Tcko的最大值加上板级延时的最大值而来,而-min后的数值则是由两个最小值相加而来。
源同步接口
为了改进系统同步接口中时钟频率受限的弊端,一种针对高速I/O的同步时序接口应运而生,在发送端将数据和时钟同步传输,在接收端用时钟沿脉冲来对数据进行锁存,重新使数据与时钟同步,这种电路就是源同步接口电路(Source Synchronous Interface)。
源同步接口最大的优点就是大大提升了总线的速度,在理论上信号的传送可以不受传输延迟的影响,所以源同步接口也经常应用DDR方式,在相同时钟频率下提供双倍于SDR接口的数据带宽。
DDR源同步边沿对齐输入接口
已知条件如下:
-
时钟信号 src_sync_ddr_clk的频率: 100 MHz
-
数据总线: src_sync_ddr_din[3:0]
-
上升沿之前的数据skew (skew_bre ) :6 ns
-
上升沿之后的数据skew (skew_are ) :4 ns
-
下降沿之前的数据skew (skew_bfe ) :3 ns
-
下降沿之后的数据skew (skew_afe ) :7 ns
可以这样计算输入接口约束:因为已知条件是数据相对于时钟上升沿和下降沿的skew,所以可以分别独立计算;上升沿的 -max 是上升沿之后的数据skew (skew_are ),对应的-min 就应该是负的上升沿之前的数据skew (skew_bre );下降沿的 -max 是下降沿之后的数据skew (skew_afe ),对应的-min 就应该是负的下降沿之前的数据skew (skew_bfe )。
所以最终写入XDC的Input约束应该如下所示:
出现负值并不代表延时真的为负,而是跟数据相对于时钟沿的方向有关。
请一定牢记set_input_delay中 -max/-min的定义,即时钟采样沿到达之后最大与最小的数据有效窗口(set_output_delay中 -max/-min的定义与之正好相反,详见后续章节举例说明)。
虚拟时钟
在FPGA做系统同步输入接口的情况下,很多时候上游器件送入的数据并不是跟某个FPGA中已经存在的真实的时钟相关,而是来自于一个不同的时钟,这时就要用到虚拟时钟(Virtual Clock)。
举例来说,上游器件用一个100MHz的时钟送出数据到FPGA,实际上这个数据每两个时钟周期才变化一次,所以可以用50MHz的时钟来采样。FPGA有个100MHz的输入时钟,经过MMCM产生一个50MHz的衍生时钟,并用其来采样上游器件送来的同步数据。当然,系统级的设计上,必须有一定的机制来保证上游器件中的发送时钟和FPGA中的接收时钟的时钟沿对齐。
此时,我们可以借助虚拟时钟的帮助来完成相应的Input接口约束。
Input接口类型和约束
FPGA做Output的接口时序同样也可以分为系统同步与源同步。在设置XDC约束时,总体思路与Input类似,只是换成要考虑下游器件的时序模型。另外,在源同步接口中,定义接口约束之前,需要用set_generated_clock先定义送出的随路时钟。
系统同步接口
与Input的系统同步接口一样,FPGA做Output接口的系统同步设计,芯片间只传递数据信号,时钟信号的同步完全依靠板级设计来对齐。所以设置约束时候要考虑的仅仅是下游器件的Tsu/Th和数据在板级的延时。
上图是一个SDR上升沿采样系统同步接口的Output约束示例。其中,-max后的数值是板级延时的最大值与下游器件的Tsu相加而得出,-min后的数值则是板级延时的最小值减去下游器件的Th而来。
源同步接口
与源同步接口的Input约束设置类似,FPGA做源同步接口的Output也有两种方法可以设置约束。
方法一我们称作Setup/Hold Based Method,与上述系统同步接口的设置思路基本一致,仅需要了解下游器件用来锁存数据的触发器的Tsu与Th值与系统板级的延时便可以设置。方法二称作Skew Based Method,此时需要了解FPGA送出的数据相对于时钟沿的关系,根据Skew的大小和时钟频率来计算如何设置 Output约束。
具体约束时可以根据不同的已知条件,选用不同的约束方式。一般而言,FPGA作为输出接口时,数据相对时钟的Skew关系是已知条件(或者说,把同步数据相对于时钟沿的Skew限定在一定范围内是设计源同步接口的目标),所以方法二更常见。
如果板级延时的最小值(在源同步接口中,因为时钟与信号同步传递,所以板级延时常常可以视作为0)小于接收端寄存器的Th,这样计算出的结果就会在 -min 后出现负数值,很多时候会让人误以为设置错误。其实这里的负数并不表示负的延迟,而代表最小的延迟情况下,数据是在时钟采样沿之后才有效。同样的,-max后的正数,表示最大的延迟情况下,数据是在时钟采样沿之前就有效了。
这便是接口约束中最容易混淆的地方,请一定牢记set_output_delay中 -max/-min的定义,即时钟采样沿到达之前最大与最小的数据有效窗口。
如果我们在纸上画一下接收端的波形图,就会很容易理解:用于setup分析的 -max之后跟着正数,表示数据在时钟采样沿之前就到达,而用于hold分析的 -min之后跟着负数,表示数据在时钟采样沿之后还保持了一段时间。只有这样才能满足接收端用于锁存接口数据的触发器的Tsu和Th要求。
方法二 Skew Based Method
为了把同步数据相对于时钟沿的Skew限定在一定范围内,我们可以基于Skew的大小来设置源同步输出接口的约束。此时可以不考虑下游采样器件的Tsu与Th值。
我们可以通过波形图来再次验证 set_output_delay中 -max/-min的定义,即时钟采样沿到达之前最大与最小的数据有效窗口。
1.3 输入最大最小延时
外部器件发送数据到FPGA系统模型如图1.3所示。对FPGA的IO口进行输入最大最小延时约束是为了让FPGA设计工具能够尽可能的优化从输入端口到第一级寄存器之间的路径延迟,使其能够保证系统时钟可靠的采到从外部芯片到FPGA的信号。
图1.3 FPGA数据输入模型
输入延时即为从外部器件发出数据到FPGA输入端口的延时时间。其中包括时钟源到FPGA延时和到外部器件延时之差、经过外部器件的数据发送Tco,再加上PCB板上的走线延时。如图1.4所示,为外部器件和FPGA接口时序。
图1.4 外部器件和FPGA接口时序
1. 最大输入延时
最大输入延时(input delay max)为当从数据发送时钟沿(lanuch edge)经过最大外部器件时钟偏斜(Tclk1),最大的器件数据输出延时(Tco),再加上最大的PCB走线延时(Tpcb),减去最小的FPGA时钟偏移(FTsu)的情况下还能保证时序满足的延时。这样才能保证FPGA的建立时间,准确采集到本次数据值,即为setup slack必须为正,如图1.1的所示,计算公式如下式所示:
Setup slack =(Tclk + Tclk2(min))–(Tclk1(max) +Tco(max) +Tpcb(max) +FTsu)≥0
推出如下公式:
Tclk1(max) + Tco(max) + Tpcb(max) –Tclk2(min) ≤ Tclk + FTsu
由Altera官方数据手册得知:
input delay max = Board Delay (max) – Board clock skew (min) + Tco(max)
结合本系统参数公式为:
input delay max = Tpcb(max) – (Tclk2(min)–Tclk1(max)) + Tco(max)
2. 最小输入延时
最小输入延时(input delay min)为当从数据发送时钟沿(lanuch edge)经过最小外部器件时钟偏斜(Tclk1),最小器件数据输出延时(Tco),再加上最小PCB走线延时(Tpcb),此时的时间总延时值一定要大于FPGA的最大时钟延时和建立时间之和,这样才能不破坏FPGA上一次数据的保持时间,即为hold slack必须为正,如图1.1的所示,计算公式如下式所示:
Hold slack = (Tclk1(min) + Tco(min) + Tpcb(min))–(FTh + Tclk2(max))≥ 0
推出如下公式:
Tclk1(min) + Tco(min) + Tpcb(min) – Tclk2(max) ≥ FTh
由Altera官方数据手册得知:
input delay max = Board Delay (min) - Board clock skew (min) + Tco(min)
结合本系统参数公式为
input delay max = Tpcb(min) – (Tclk2(max)–Tclk1(min)) + Tco(min)
由公式4和公式8得知,进行输入最大最小延时的计算,我们需要估算4个值:
(1) 外部器件输出数据通过PCB板到达FPGA端口的最大值和最小值Tpcb,PCB延时经验值为600mil/ns,1mm = 39.37mil;
(2) 外部器件接收到时钟信号后输出数据延时的最大值和最小值Tco;
(3) 时钟源到达外部器件的最大、最小时钟偏斜Tclk1;
(4) 时钟源到达FPGA的最大、最小时钟偏斜Tclk2;
当外部器件时钟为FPGA提供的时候,Tclk1和Tclk2即合成Tshew,如图1.5所示:
图1.5 FPGA输出时钟模型
1.4 输出最大最小延时
FPGA输出数据给外部器件模型如图1.6所示。对FPGA的IO口进行输出最大最小延时约束是为了让FPGA设计工具能够尽可能的优化从第一级寄存器到输出端口之间的路径延迟,使其能够保证让外部器件能准确的采集到FPGA的输出数据。
图1.6 FPGA输出延时模型
输出延时即为从FPGA输出数据后到达外部器件的延时时间。其中包括时钟源到FPGA延时和到外部器件延时之差、PCB板上的走线延时以及外部器件的数据建立和保持时间。如所示,为FPGA和外部器件接口时序图。
图1.7 FPGA输出延时
1. 最大输出延时
由Altera官方数据手册得知:
Output delay max = Board Delay (max) – Board clock skew (min) + Tsu
由公式得知,最大输出延时(output delay max)为当从FPGA数据发出后经过最大的PCB延时、最小的FPGA和器件时钟偏斜,再加上外部器件的建立时间。约束最大输出延时,是为了约束IO口输出,从而使外部器件的数据建立时间,即为setup slack必须为正,计算公式如下式所示:
Setup slack =(Tclk + Tclk2(min))–(Tclk1(max) +FTco(max) +Tpcb(max) +Tsu)≥0
推导出如下公式:
FTco(max) + Tpcb(max) –(Tclk2(min) – Tclk1(max))+Tsu ≤Tclk
再次推导,得到如下公式:
FTco(max) + Output delay max ≤Tclk
由此可见,约束输出最大延时,即为通知编译器FPGA的FTco最大值为多少,根据这个值做出正确的综合结果。
2. 输出最小延时
由Altera官方数据手册得知:
Output delay min = Board Delay (min) – Board clock skew (max) –Th
由公式得知,最小输出延时(output delay min)为当从FPGA数据发出后经过最小的PCB延时、最大的FPGA和器件时钟偏斜,再减去外部器件的建立时间。约束最小输出延时,是为了约束IO口输出,从而使IO口输出有个最小延时值,防止输出过快,破坏了外部器件上一个时钟的数据保持时间,导致hlod slack为负值,不能正确的锁存到数据,最小输出延时的推导计算公式如下式所示:
Hold slack = (Tclk1(min) + FTco(min) + Tpcb(min))–(Th + Tclk2(max))≥ 0
推导出如下公式:
FTco(min) + Tpcb(min) – (Tclk2(max) – Tclk1(min))– Th ≥ 0
再次推导,得出如下公式:
FTco(min) + Output delay min ≥ 0
由公式得知,约束输出最大延时,即为通知编译器FPGA的FTco最小值为多少,根据这个值做出正确的综合结果。
由公式10和公式14得知,进行输出最大最小延时的计算,我们需要估算4个值:
(1) FPGA输出数据通过PCB板到达外部器件输入端口的最大值和最小值Tpcb,PCB延时经验值为600mil/ns,1mm = 39.37mil;
(2) 时钟源到达外部器件的最大、最小时钟偏斜Tclk2;
(3) 时钟源到达FPGA的最大、最小时钟偏斜Tclk1;
(4) 外部器件的建立时间Tsu和保持时间Th;
当外部器件时钟为FPGA提供的时候,Tclk1和Tclk2即合成Tshew,如图1.8所示:
图1.8 FPGA提供时钟模型