转自:http://xilinx.eepw.com.cn/news/article/a/1476
http://xilinx.eepw.com.cn/news/article/a/1477
初学者不用死记xdc的语言写法,应先了解思想,然后用vivado 工具中的template生成即可。
XDC约束技巧—— I/O篇(上)
I/O约束的语法
XDC中可以用于I/O约束的命令包括set_input_delay / set_output_delay和set_max_delay / set_min_delay 。其中,只有那些从FPGA管脚进入和/或输出都不经过任何时序元件的纯组合逻辑路径可以用set_max_delay / set_min_delay来约束,其余I/O时序路径都必须由set_input_delay / set_output_delay来约束。如果对FPGA的I/O不加任何约束,Vivado会缺省认为时序要求为无穷大,不仅综合和实现时不会考虑I/O时序,而且在时序分析时也不会报出这些未约束的路径。
本文以下章节将会着重讨论XDC接口约束和时序分析的基础,介绍如何使用set_input_delay / set_output_delay对FPGA的I/O时序进行约束。
Input约束
上图所示set_input_delay的基本语法中,
上述这些选项是定义Input约束时必须写明的,还有少数几个可选项,如 -add_delay 和 -clock_fall用于DDR接口的约束。
Output约束
上图所示set_output_delay的基本语法中,
Setup/Hold时序分析
我们知道约束是为了设计服务,而设置好的约束必须在时序报告中加以验证。所以,怎样理解时序分析中的检查规则就成了重中之重,这一点对I/O约束来说尤为重要。理解时序分析工具如何选取路径分析的发送端(Launch)和接收端(Capture)时钟沿(Clock Edges),在Setup和Hold分析时又有怎样的具体区别,以及这些数字在时序报告中如何体现等等是设置正确I/O约束的基础。
更具体的时序分析方法以及如何深入解读时序报告等内容将会在后续另开主题文章详述,这里仅就Setup/Hold分析时对时钟边沿的选择加以描述,便于以下章节的展开。
Setup时序分析
同步电路设计中,一般情况下,数据在时钟上升沿发送,在下一个时钟上升沿接收,发送的时钟沿称作Launch Edge,接收沿称作Capture Edge。时序分析中的Setup Check跟Capture Edge的选择息息相关。
在SDR接口的setup分析中,工具如下图这样识别发送和接收时钟沿。
而在DDR接口的setup分析中,因为数据是双沿采样,所以发送和接收时钟沿变成上升(下降)沿发送,下降(上升)沿接收。
Hold时序分析
Hold Check主要是为了保证数据在接收(采样)端时钟沿之后还能稳定保持一段时间,对Hold分析而言,同一 个时钟沿既是Launch Edge也是Capture Edge,这一点对SDR和DDR(不论是中心对齐还是边沿对齐)都一样。
Input接口类型和约束
由于历史的原因,相当一部分FPGA设计仍然在系统中起到胶合逻辑(Glue Logic)的作用,当然,如今的FPGA中嵌入了高速串行收发器和嵌入式处理器等,早就不仅仅局限于系统设计的配角,反而成为了其中的主角甚至是明星。但数据接口的同步一直是 FPGA设计中的常见问题,也是一个重点和难点,很多设计不稳定都是因为数据接口的同步有问题。
FPGA的数据接口同步根据系统级设计方式来讲可以分为系统同步和源同步两种。
系统同步接口
系统同步接口(System Synchronous Interface)的构建相对容易,以FPGA做接收侧来举例,上游器件仅仅传递数据信号到FPGA中,时钟信号则完全依靠系统板级来同步。时钟信号在系统级上同源,板级走线的延时也要对齐。正因为这样的设计,决定了数据传递的性能受到时钟在系统级的走线延时和skew以及数据路径延时的双重限制,无法达到更高速的设计要求,所以大部分情况也仅仅应用SDR方式。
对系统同步接口做Input约束相对容易,只需要考虑上游器件的Tcko和数据在板级的延时即可。下图是一个SDR上升沿采样系统同步接口的Input约束示例。
设置和分析I/O约束一定要有个系统级思考的视角,如上右图所示,Launch Edge对应的是上游器件的时钟,而Capture Edge则对应FPGA的输入时钟,正因为是系统同步时钟,所以可以将其视作完全同步而放在一张图上分析,这样一来,就可以用一般时序分析方法来看待问题。
一条完整的时序路径,从源触发器的C端开始,经过Tcko和路径传输延时再到目的触发器的D端结束。放在系统同步的接口时序上,传输延时则变成板级传输延时(还要考虑skew),所以上述 -max 后的数值是Tcko的最大值加上板级延时的最大值而来,而-min后的数值则是由两个最小值相加而来。
源同步接口
为了改进系统同步接口中时钟频率受限的弊端,一种针对高速I/O的同步时序接口应运而生,在发送端将数据和时钟同步传输,在接收端用时钟沿脉冲来对数据进行锁存,重新使数据与时钟同步,这种电路就是源同步接口电路(Source Synchronous Interface)。
源同步接口最大的优点就是大大提升了总线的速度,在理论上信号的传送可以不受传输延迟的影响,所以源同步接口也经常应用DDR方式,在相同时钟频率下提供双倍于SDR接口的数据带宽。
源同步接口的约束设置相对复杂,一则是因为有SDR、DDR、中心对齐(Center Aligned)和边沿对齐(Edge Aligned)等多种方式,二则可以根据客观已知条件,选用与系统同步接口类似的系统级视角的方式,或是用源同步视角的方式来设置约束。
如上图所示,对源同步接口进行Input约束可以根据不同的已知条件,选用不同的约束方式。一般而言,FPGA作为输入接口时,数据有效窗口是已知条件,所以方法2更常见,Vivado IDE的Language Templates中关于源同步输入接口XDC模板也是基于这种方法。但不论以何种方式来设置Input约束,作用是一样,时序报告的结果也应该是一致的。
针对上图所示中心对齐源同步SDR接口时序,分别按照两种方式来约束,需要的已知条件和计算方式虽然不同,但却可以得到完全一样的结果。
DDR接口的约束设置
DDR源同步接口的约束稍许复杂,需要将上升沿和下降沿分别考虑和约束,以下以源同步接口为例,分别就输入接口数据为中心对齐或边沿对齐的方式来举例。
DDR源同步中心对齐输入接口
已知条件如下:
时钟信号 src_sync_ddr_clk的频率: 100 MHz
数据总线: src_sync_ddr_din[3:0]
上升沿之前的数据有效窗口 ( dv_bre ) :4 ns
上升沿之后的数据有效窗口 ( dv_are ) : 6 ns
下降沿之前的数据有效窗口 ( dv_bfe ) :7 ns
下降沿之后的数据有效窗口 ( dv_afe ) : 2 ns
可以这样计算输入接口约束:DDR方式下数据实际的采样周期是时钟周期的一半;上升沿采样的数据(Rise Data)的 -max 应该是采样周期减去这个数据的发送沿(下降沿)之前的数据有效窗口值dv_bfe,而对应的-min 就应该是上升沿之后的数据有效窗口值dv_are ;同理,下降沿采样的数据(Fall Data)的 -max 应该是采样周期减去这个数据的发送沿(上升沿)之前的数据有效窗口值dv_bre,而对应的-min 就应该是下降沿之后的数据有效窗口值dv_afe 。
所以最终写入XDC的Input约束应该如下所示:
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的定义与之正好相反,详见后续章节举例说明)。
在这个例子中,数据是边沿对齐,只要有jitter跟skew的存在,最差情况下,数据有效窗口在到达时钟采样沿之前就已经结束,所以会有负数出现在-min之后。因此,在实际应用中,FPGA用作输入的边沿对齐DDR源同步接口的情况下,真正用来采样数据的时钟会经过一个MMCM/PLL做一定的相移,从而把边沿对齐变成中心对齐。
另外,在经过MMCM/PLL相移后的采样时钟跟同步接口输入的时钟之间需要做set_false_path的约束(如下述例子)而把那些伪路径从时序报告中剔除,这里不再详述。
虚拟时钟
在FPGA做系统同步输入接口的情况下,很多时候上游器件送入的数据并不是跟某个FPGA中已经存在的真实的时钟相关,而是来自于一个不同的时钟,这时就要用到虚拟时钟(Virtual Clock)。
举例来说,上游器件用一个100MHz的时钟送出数据到FPGA,实际上这个数据每两个时钟周期才变化一次,所以可以用50MHz的时钟来采样。FPGA有个100MHz的输入时钟,经过MMCM产生一个50MHz的衍生时钟,并用其来采样上游器件送来的同步数据。当然,系统级的设计上,必须有一定的机制来保证上游器件中的发送时钟和FPGA中的接收时钟的时钟沿对齐。
此时,我们可以借助虚拟时钟的帮助来完成相应的Input接口约束。
篇幅所限,对XDC中I/O约束的设计思路、分析方法以及如何具体设置Input接口约束的讨论就到这里,下一篇我们接着分析如何设置Output接口约束,看看 Vivado中有什么方式可以帮助用户准确便捷地定义接口时序约束。此时,我们可以借助虚拟时钟的帮助来完成相应的Input接口约束。
XDC 约束技巧之IO篇(下)
继《XDC约束技巧之I/O篇(上)》 详细描述了如何设置Input接口约束后,我们接着来聊聊怎样设置Output接口约束,并分析UCF与XDC在接口约束上的区别。
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限定在一定范围内是设计源同步接口的目标),所以方法二更常见。
Vivado IDE的Language Templates中关于源同步输出接口的XDC约束模板包含了以上两种方式的设置方法。
方法一Setup/Hold Based Method
Setup/Hold Method的计算公式如下,可以看出其跟系统同步输出接口的设置方法完全一样。如果换成DDR方式,则可参考上一篇I/O约束方法中关于Input源同步DDR接口的约束,用 两个可选项-clock_fall与 -add_delay来添加针对时钟下降沿的约束值。
如果板级延时的最小值(在源同步接口中,因为时钟与信号同步传递,所以板级延时常常可以视作为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的定义,即时钟采样沿到达之前最大与最小的数据有效窗口。
DDR接口的约束设置
DDR接口的约束稍许复杂,需要将上升沿和下降沿分别考虑和约束,以下以源同步接口为例,分别就Setup/Hold Based 方法和Skew Based方法举例。
方法一Setup/Hold Based Method
已知条件如下:
时钟信号 src_sync_ddr_clk的频率: 100 MHz
随路送出的时钟src_sync_ddr_clk_out的频率: 100 MHz
数据总线: src_sync_ddr_dout[3:0]
接收端的上升沿建立时间要求 ( tsu_r ) :7 ns
接收端的上升沿保持时间要求 (thd_r ) :3 ns
接收端的下降沿建立时间要求 (tsu_f) :6 ns
接收端的下降沿保持时间要求 (thd_f ) :4 ns
板级走线延时:0 ns
可以这样计算输出接口约束:已知条件包含接收端上升沿和下降沿的建立与保持时间要求,所以可以分别独立计算。上升沿采样数据的 -max 是板级延时的最大值加上接收端的上升沿建立时间要求(tsu_r),对应的-min 就应该是板级延时的最小值减去接收端的上升沿保持时间要求(thd_r);下降沿采样数据的 -max 是板级延时的最大值加上接收端的下降沿建立时间要求(tsu_f),对应的-min 就应该是板级延时的最小值减去接收端的下降沿保持时间要求(thd_f)。
所以最终写入XDC的Output约束应该如下所示:
方法二 Skew Based Method
已知条件如下:
时钟信号 src_sync_ddr_clk的频率: 100 MHz
随路送出的时钟src_sync_ddr_clk_out的频率: 100 MHz
数据总线: src_sync_ddr_dout[3:0]
上升沿之前的数据skew ( bre_skew ) :4 ns
上升沿之后的数据skew ( are_skew ) :6 ns
下降沿之前的数据skew ( bfe_skew ) :7 ns
下降沿之后的数据skew ( afe_skew ) :2 ns
可以这样计算输出接口约束:时钟的周期是10ns,因为是DDR方式,所以数据实际的采样周期是时钟周期的一半;上升沿采样的数据的 -max 应该是采样周期减去这个数据的发送沿(下降沿)之后的数据skew即afe_skew,而对应的-min 就应该是上升沿之前的数据skew值bre_skew ;同理,下降沿采样数据的 -max 应该是采样周期减去这个数据的发送沿(上升沿)之后的数据skew值are_skew,而对应的-min 就应该是下降沿之前的数据skew值bfe_skew 。
所以最终写入XDC的Output约束应该如下所示:
对以上两种方法稍作总结,就会发现在设置DDR源同步输出接口时,送出的数据是中心对齐的情况下,用Setup/Hold Based 方法来写约束比较容易,而如果是边沿对齐的情况,则推荐使用Skew Based方法来写约束。
在Vivado中设置接口约束
FPGA的接口约束种类多变,远非一篇短文可以完全覆盖。在具体设计中,建议用户参照Vivado IDE的Language Templates 。其中关于接口约束的例子有很多,而且也是按照本文所述的各种分类方法分别列出。
具体使用时,可以在列表中找到对应的接口类型,按照模板所示调整成自己设计中的数据,然后可以方便地计算出实际的约束值,并应用到FPGA工程中去。
自2014.1版开始,Vivado还提供一个Constraints Wizard可供用户使用。只需打开综合后的设计,然后启动Wizard,工具便可以根据读到的网表和设计中已有的XDC时序约束(也可以任何约束都不加而开始用Wizard)一步步指引用户如何添加Timing约束,包括时钟、I/O 以及时序例外约束等等。
Constraints Wizard的调出方法和界面如下图所示。
UCF与XDC的区别
《XDC约束技巧》开篇描述XDC基础语法时候曾经提到过设置接口约束时UCF与XDC的区别,简单来讲,UCF是原生的FPGA约束,所以分析问题的视角是FPGA本身,而XDC则是从系统设计的全局角度来分析和设置接口约束。
以最基础的SDR系统同步接口来举例。输入侧的设置,UCF用的是OFFSET = IN,而XDC则是set_input_delay 。
输出侧的设置,UCF用的是OFFSET =OUT,而XDC则是set_output_delay 。
如果需要从旧设计的UCF约束转到XDC约束,可以参考上述例子。以一个采样周期来看,UCF中与XDC中设置的接口约束值加起来正好等于一个周期的值。
小结
这一系列《XDC约束技巧》的文章至此暂时告一段落。其实读懂这几篇涵盖了时钟、CDC以及接口约束的短文,基本上已经足够应对绝大多数的FPGA设计约束问题。当然在这么短的篇幅内,很多问题都无法更加深入地展开,所以也提醒读者,需要关注文中推荐的各类Xilinx 官方文档,以及Vivado本身自带的帮助功能与模板。
希望各位能从本文中吸取经验,少走弯路,尽快地成为Vivado和XDC的资深用户,也希望本文能真正为您的设计添砖加瓦,达到事半功倍的效果。