UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

取消
显示结果 
搜索替代 
您的意思是: 
Xilinx Employee
Xilinx Employee
10,373 次查看
注册日期: ‎04-24-2013

【Vivado使用误区与进阶】XDC约束技巧—— I/O篇(下)

XDC约束技巧之I/O篇 (下)


        《XDC约束技巧之时钟篇》中曾对I/O约束做过简要概括,相比较而言,XDC中的I/O约束虽然形式简单,但整体思路和约束方法却与UCF大相径庭。加之FPGA的应用特性决定了其在接口上有多种构建和实现方式,所以从UCF到XDC的转换过程中,最具挑战的可以说便是本文将要讨论的I/O约束了。

 

         《XDC约束技巧之I/O篇(上)》 详细描述了如何设置Input接口约束后,我们接着来聊聊怎样设置Output接口约束,并分析UCF与XDC在接口约束上的区别。

 

Input接口类型和约束 

        

         FPGA做Output的接口时序同样也可以分为系统同步与源同步。在设置XDC约束时,总体思路与Input类似,只是换成要考虑下游器件的时序模型。另外,在源同步接口中,定义接口约束之前,需要用create_generated_clock先定义送出的随路时钟。

 

系统同步接口

 

         与Input的系统同步接口一样,FPGA做Output接口的系统同步设计,芯片间只传递数据信号,时钟信号的同步完全依靠板级设计来对齐。所以设置约束时候要考虑的仅仅是下游器件的Tsu/Th和数据在板级的延时。

 

 

io15.png

 

         上图是一个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来添加针对时钟下降沿的约束值

 

io16.png

 io17.png

 

         如果板级延时的最小值(在源同步接口中,因为时钟与信号同步传递,所以板级延时常常可以视作为0)小于接收端寄存器的Th,这样计算出的结果就会在 -min 后出现负数值,很多时候会让人误以为设置错误。其实这里的负数并不表示负的延迟,而代表最小的延迟情况下,数据是在时钟采样沿之后才有效。同样的,-max后的正数,表示最大的延迟情况下,数据是在时钟采样沿之前就有效了。

 

         这便是接口约束中最容易混淆的地方,请一定牢记set_output_delay中 -max/-min的定义,即时钟采样沿到达之前最大与最小的数据有效窗口。

 

         如果我们在纸上画一下接收端的波形图,就会很容易理解:用于setup分析的 -max之后跟着正数,表示数据在时钟采样沿之前就到达,而用于hold分析的 -min之后跟着负数,表示数据在时钟采样沿之后还保持了一段时间。只有这样才能满足接收端用于锁存接口数据的触发器的Tsu和Th要求。

 

io19.png

 

方法二 Skew Based Method

 

         为了把同步数据相对于时钟沿的Skew限定在一定范围内,我们可以基于Skew的大小来设置源同步输出接口的约束。此时可以不考虑下游采样器件的Tsu与Th值。

 

io18.png

 

 

io21.png

io22.png

 

 

         我们可以通过波形图来再次验证 set_output_delay中 -max/-min的定义,即时钟采样沿到达之前最大与最小的数据有效窗口。

 

io20.png 

 

 

DDR接口的约束设置

        

         DDR接口的约束稍许复杂,需要将上升沿和下降沿分别考虑和约束,以下以源同步接口为例,分别就Setup/Hold Based 方法和Skew Based方法举例。

 

方法一Setup/Hold Based Method

 

io24.PNG

 

已知条件如下:

  • 时钟信号 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约束应该如下所示:

 

io36.PNG

 

 

方法二 Skew Based Method

 

io23.PNG

 

已知条件如下:

  • 时钟信号 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约束应该如下所示:

 

io37.PNG   

         对以上两种方法稍作总结,就会发现在设置DDR源同步输出接口时,送出的数据是中心对齐的情况下,用Setup/Hold Based 方法来写约束比较容易,而如果是边沿对齐的情况,则推荐使用Skew Based方法来写约束。

 

 

在Vivado中设置接口约束 

       

         FPGA的接口约束种类多变,远非一篇短文可以完全覆盖。在具体设计中,建议用户参照Vivado IDE的Language Templates  。其中关于接口约束的例子有很多,而且也是按照本文所述的各种分类方法分别列出。

 

         具体使用时,可以在列表中找到对应的接口类型,按照模板所示调整成自己设计中的数据,然后可以方便地计算出实际的约束值,并应用到FPGA工程中去。

 

io10_s.jpg 

 

         自2014.1版开始,Vivado还提供一个Constraints Wizard可供用户使用。只需打开综合后的设计,然后启动Wizard,工具便可以根据读到的网表和设计中已有的XDC时序约束(也可以任何约束都不加而开始用Wizard)一步步指引用户如何添加Timing约束,包括时钟、I/O 以及时序例外约束等等。

 

         Constraints Wizard的调出方法和界面如下图所示。

 

io14_s.jpg

 

 

UCF与XDC的区别 

  

         

         《XDC约束技巧》开篇描述XDC基础语法时候曾经提到过设置接口约束时UCF与XDC的区别,简单来讲,UCF是原生的FPGA约束,所以分析问题的视角是FPGA本身,而XDC则是从系统设计的全局角度来分析和设置接口约束。


         以最基础的SDR系统同步接口来举例。输入侧的设置,UCF用的是OFFSET = IN,而XDC则是set_input_delay 。

 

io27.png

 

io28.png 

 


         输出侧的设置,UCF用的是OFFSET =OUT,而XDC则是set_output_delay 。

 

io29.png

 

io30.png 

 

 

         如果需要从旧设计的UCF约束转到XDC约束,可以参考上述例子。以一个采样周期来看,UCF中与XDC中设置的接口约束值加起来正好等于一个周期的值。

 

小结 

  

         

         这一系列《XDC约束技巧》的文章至此暂时告一段落。其实读懂这几篇涵盖了时钟、CDC以及接口约束的短文,基本上已经足够应对绝大多数的FPGA设计约束问题。当然在这么短的篇幅内,很多问题都无法更加深入地展开,所以也提醒读者,需要关注文中推荐的各类Xilinx 官方文档,以及Vivado本身自带的帮助功能与模板。

 

         希望各位能从本文中吸取经验,少走弯路,尽快地成为Vivado和XDC的资深用户,也希望本文能真正为您的设计添砖加瓦,达到事半功倍的效果。

 

 

 

 

small.jpg

Ally Zhou  2015-3-13 于Xilinx上海Office

1 条回复1
Xilinx Employee
Xilinx Employee
10,367 次查看
注册日期: ‎04-24-2013

回复: 【Vivado使用误区与进阶】XDC约束技巧—— I/O篇(下)

点击查看 《XDC约束技巧之I/O篇(上)》介绍XDC中I/O约束的基础,并详细描述了如何设置Input接口约束

0 项奖励