vivado 寄存器输出到寄存器输入 建立时间_Vivado使用误区与进阶系列(五)XDC约束技巧之I/O篇(下)...

XDC约束技巧之CDC篇

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

本文摘自《Vivado使用误区与进阶》,作者为Xilinx工具与方法学应用专家Ally Zhou。

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

01

Output 接口类型和约束

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

系统同步接口

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

b3ea11e0ef10f9dfe3a2ea8c7f74ec52.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 Based Method 的计算公式如下,可以看出其跟系统同步输出接口的设置方法完全一样。如果 换成 DDR 方式,则可参考上一篇 I/O 约束方法中关于 Input 源同步 DDR 接口的约束,用 两个可选项 -clock_fall 与 -add_delay 来添加针对时钟下降沿的约束值。

e78b45befc48bdd1dada40332ccf60da.png

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

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

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

1932a77f848747a778d995735271ea8f.png

方法二 Skew Based Method

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

81c093cf46abc4e64d576d3101717b82.png

02

DDR 接口的约束设置

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

方法一 Setup/Hold Based Method

对于单根跨时钟域路径,一般采用简单同步器(Simple Synchronizer),就是由至少两级CE端和Reset/Clear端接死的寄存器序列来处理。

1aadc377219872b62412a5c3cbfccdf7.png

已知条件如下: 

时钟信号 src_sync_ddr_clk 的频率:100 MHz

随路送出的时钟 src_sync_ddr_clk_out 的频率:100 MHz

数据总线:src_sync_ddr_dout[3:0] ;

接收端的上升沿建立时间要求 ( tsu_r )         :0.7 ns;

接收端的上升沿保持时间要求 (thd_r )         :0.3 ns;

接收端的下降沿建立时间要求 (tsu_f)         :0.6 ns;

接收端的下降沿保持时间要求 (thd_f )         :0.4 ns;

板级走线延时:0 ns。

可以这样计算输出接口约束:已知条件包含接收端上升沿和下降沿的建立与保持时间要求,所以可以分别 独立计算。上升沿采样数据的 -max 是板级延时的最大值加上接收端的上升沿建立时间要求(tsu_r),对应的 -min 就应该是板级延时的最小值减去接收端的上升沿保持时间要求(thd_r);下降沿采样数据的 -max 是板级 延时的最大值加上接收端的下降沿建立时间要求(tsu_f),对应的-min 就应该是板级延时的最小值减去接收端 的下降沿保持时间要求(thd_f)。所以最终写入 XDC 的 Output 约束应该如下所示:

bf18b2a1f9e2bba5a3aacede85593beb.png

方法二 Skew Based Method

a31d739d0f5051208c82ba8d06eeb8cd.png

已知条件如下:

时钟信号 src_sync_ddr_clk 的频率:100 MHz

随路送出的时钟 src_sync_ddr_clk_out 的频率:100 MHz

数据总线:src_sync_ddr_dout[3:0] ;

    上升沿之前的数据 skew ( bre_skew ) :0.4 ns;

    上升沿之后的数据 skew ( are_skew ) :0.6 ns;

    下降沿之前的数据 skew ( bfe_skew ) :0.7 ns;

    下降沿之后的数据 skew ( afe_skew ) :0.2 ns。

    可以这样计算输出接口约束:时钟的周期是 10ns,因为是 DDR 方式,所以数据实际的采样周期是时钟周 期的一半;上升沿采样的数据的 -max 应该是采样周期减去这个数据的发送沿(下降沿)之后的数据 skew 即 afe_skew,而对应的-min 就应该是上升沿之前的数据 skew 值 bre_skew ;同理,下降沿采样数据的 -max  应该是采样周期减去这个数据的发送沿(上升沿)之后的数据 skew 值 are_skew,而对应的-min 就应该是下 降沿之前的数据 skew 值 bfe_skew 。

    所以最终写入 XDC 的 Output 约束应该如下所示:

所以建议的做法是不设 set_clock_groups约束,转而采用 set_max_delay来约束这些跨时钟域 路径。以写入侧举例,一个基本的原则就是约束从cell1到cell2的路径之间的延时等于或略小于cell2 的驱动时钟一个周期的值。读出侧的约束同理。

b4474995dffc42bf155515e9aa8d324f.png

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

02

在 Vivado 中设置接口约束

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

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

d479af9fd26584a952842428bde6c610.png

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

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

c5e7e611ba89d4b3d48e61aff50591d4.png

02

UCF 与 XDC 的区别

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

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

43176ba00789da708c97aa2f5d3b7d99.png

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

小结

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

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

更多精彩看这里:

Vivado使用误区与进阶系列(一)十分钟教会你UltraFast(1)

Vivado使用误区与进阶系列(一)十分钟教会你UltraFast(2)

Vivado使用误区与进阶系列(二)XDC约束技巧之时钟篇

Vivado使用误区与进阶系列(三)XDC约束技巧之CDC篇

Vivado使用误区与进阶系列(四)XDC约束技巧之I/O篇(上)

b9842307b59e1a619ab1acdb9ed9623b.png
使用vivado进行FPGA设计时,时钟约束是非常重要的一环。以下是一些vivado使用误区进阶的时钟约束技巧: 1. 误区:忽略时钟路径延时。有时候,我们只关注数据路径的延时,而忽略了时钟路径的延时。实际上,在时钟数据中,时钟信号的传输延迟也会对设计产生影响。因此,在进行时钟约束时,要确保将时钟路径延时考虑在内。 2. 进阶使用CLOCK_DEDICATED_ROUTE。CLOCK_DEDICATED_ROUTE是vivado提供的一个约束,它可以确保时钟信号的专用路径。通过使用CLOCK_DEDICATED_ROUTE约束,可以避免时钟信号与其他信号共用路径,提高时钟传输的稳定性和可靠性。 3. 进阶使用CLOCK_DELAY。CLOCK_DELAY约束可以用来控制时钟信号的传输延时。通过在xdc约束文件中指定CLOCK_DELAY属性,可以向vivado指示需要在时钟路径上添加一定的延时。这对于时钟分频或者是时钟与其他信号同步时非常有用。 4. 进阶:时钟分组。当设计中存在多个时钟域时,可以使用时钟分组来对这些时钟进行分类和管理。通过将相关的时钟信号分组放置到同一个时钟域中,并对这个时钟域应用相应的时钟约束,可以有效地减少时钟域间的干扰和时序问题。 5. 进阶使用时钟域约束。时钟域约束可以用来限定不同时钟域的时序关系。通过在xdc约束文件中指定时钟域约束,可以确保时钟同步和时序要求得到满足。时钟域约束可以包括时钟互联关系、时钟路径延时要求等。 总之,在使用vivado进行FPGA设计时,合理且准确地进行时钟约束是非常重要的。通过避免一些常见误区,如忽略时钟路径延时,以及灵活运用一些进阶的时钟约束技巧,可以提高设计的性能和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值