【ug903】FPGA时序约束学习(2)-如何约束输入输出延迟

本文详细介绍了FPGA设计中的时序约束,包括如何约束主时钟、虚拟时钟、输入输出延迟以及跨时钟域的约束。重点讨论了输入延迟的最小和最大值对建立和保持时间的影响,以及输出延迟对保持和建立时间的计算方法。同时,提供了具体的Vivado命令示例,帮助理解如何设置这些约束。
摘要由CSDN通过智能技术生成

时序约束系列:

  1. 如何约束时钟
    主时钟、虚拟时钟、生成时钟、时钟组、时钟不确定性
  2. 如何约束输入输出延迟
    输入延迟、输出延迟
  3. 如何约束时序例外
    多周期路径、输入输出延迟、虚假路径、最大最小延迟
  4. 如何约束跨时钟域
    总线偏斜

生前何必久睡,死后自会长眠。😃

要在设计中准确地建模外部上下游的时序,必须为输入和输出端口提供时序信息。Vivado IDE只在FPGA内识别时序,所以必须用下面的命令执行FPGA边界之外的延迟。

  • set_input_delay
  • set_output_delay

1 输入延迟(Input Delay)


20220608 补充基本概念的学习

① 输入延迟到底约束个什么东西?

为了确保从端口输入的数据能被正确的进行 STA。工具需要直到端口的数据相对于时钟什么时候到来。

在这里插入图片描述

参考上述模型,就是需要告诉FPGA,I1点的数据啥时候到,也就是告诉FPGA这条虚拟的时序路径中,从F1 的tcq,经过逻辑云C1 和 C2 的延时,这样 STA 工具就可以对这条路径进行分析。

而I1到达的时间点是一个范围,所以需要约束最小和最大延迟时间。

最小延迟时间:指定信号可以改变的最小时间,在这个时间之前,输入信号还没有到达输入端口。所以最小时间可以保证 F2 的 hold 要求。

最大延迟时间:指定信号可以改变的最大时间,在这个时间之后,输入信号在输入端口就稳定了。所以最大时间可以 保证 F2 的 setup 要求。

在这里插入图片描述

注意,这个时间可以是负值,set_input_delay -min 为负值表示信号可能在时钟沿来之前到达输入端口。
set_input_delay -max 为负值表示信号可能在时钟沿来之前已稳定并到达输入端口。

② 具体的 hold 与 setup 关系怎么计算呢?

假设在I1处的最小延时时间为 3ns,通过逻辑云 C3 有 4ns 的延迟,那么到达 F2 的最早有效时间是 7ns 。所以触发器的hold时间只要小于 7ns ,新数据就不会干扰之前数据的捕获。

同理,假设在I1处的最小延时时间为 5ns,通过逻辑云 C3 有 4ns 的延迟,那么到达 F2 的最晚有效时间是 9ns ,即 9ns 之后数据就一定稳定。如果 setup 时间为 0.5ns。那么只要时钟信号到达 F2 的时间大于 9.5ns 就可以满足 setup 关系了。


set_input_delay命令指定相对于设计接口的时钟边缘的输入端口上的输入路径延迟。

对于不同板子,输入延迟表示以下相位差:

  • 从外部芯片通过电路板传播到FPGA的输入封装引脚的数据。
  • 相应板载参考时钟。

因此,输入延迟值可以是正的或负的,这取决于设备接口上的时钟和数据相对相位。

1.1 使用输入延迟选项

虽然-clock选项在Synopsys Design Constraints (SDC)标准中是可选的,但它是Vivado IDE所必需的。相对时钟可以是设计时钟,也可以是虚拟时钟。

推荐:当使用虚拟时钟时,使用与设计时钟相关的输入端口相同的波形。这样,时间路径要求就比较真实了。使用虚拟时钟可以方便地建模不同的抖动或源延迟场景,而无需修改设计时钟。

输入延迟选项:

  • -min -max
  • -clock_full
  • -add_delay

1.1.1 最小和最大输入延迟命令选项

-min和-max选项指定不同的值:

  • 最小延迟分析(等待/移除)
  • 最大延迟分析(建立/恢复)。

如果两者都不使用,则输入延迟值同时应用于min和max。

1.1.2 时钟下降输入延迟命令选项

-clock_fall选项指定输入延迟约束适用于由相对时钟的下降时钟边缘启动的时序路径。如果没有这个选项,Vivado IDE只假定相对时钟的上升边缘。

不要将-clock_fall选项与-rise和-fall选项混淆。这些选项指的是数据边缘,而不是时钟边缘。

1.1.3 添加延迟输入延迟命令选项

add_delay选项必须在以下情况下使用:

  • 存在一个最大(或最小)输入延迟约束
  • 且希望在同一端口上指定第二个最大(或最小)输入延迟限制。

这个选项通常用于约束一个相对于多个时钟边缘的输入端口,例如,DDR接口。

你可以只对输入或双向端口应用输入延迟约束,不包括时钟输入端口,它会被自动忽略。不能对内部引脚应用输入延迟约束。

1.2 例子

例子:为路径DIN 同时约束相对于 sysClk 最小最大延迟

create_clock -name sysClk -period 10 [get_ports CLK0]
set_input_delay -clock sysClk 2 [get_ports DIN]

例子:为路径DIN 同时约束相对于虚拟时钟最小最大延迟

create_clock -name clk_port_virt -period 10
set_input_delay -clock clk_port_virt 2 [get_ports DIN]

例子:在端口DIN和DOUT之间的组合路径上设置了一个5ns (10ns - 4ns - 1ns)约束
为了约束I/O端口之间的纯组合路径,必须在I/O端口上定义相对于先前定义的虚拟时钟的输入和输出延迟。

create_clock -name sysClk -period 10 [get_ports CLK0]
set_input_delay -clock sysClk 4 [get_ports DIN]
set_output_delay -clock sysClk 1 [get_ports DOUT]

例子:约束相对于DDR时钟的输入延迟

create_clock -name clk_ddr -period 6 [get_ports DDR_CLK_IN]
set_input_delay -clock clk_ddr -max 2.1 [get_ports DDR_IN]
set_input_delay -clock clk_ddr -max 1.9 [get_ports DDR_IN] -clock_fall -add_delay
set_input_delay -clock clk_ddr -min 0.9 [get_ports DDR_IN]
set_input_delay -clock clk_ddr -min 1.1 [get_ports DDR_IN] -clock_fall -add_delay

2 输出延迟(Output Delay)


20220608 补充基本概念的学习

① 输出延迟约束个啥?
输入延时是要知道别人产生的信号到我的芯片之前别人花了多久时间,我才能知道剩多少给我用。而输出延时是要知道数据从端口输出之后别人需要花多少时间,我才好算着时间来布局布线。

在这里插入图片描述

最小时间:指定输出信号从输出端口输出后需要传输的最小时间。
最大时间:指定输出信号从输出端口输出后需要传输的最大时间。

注意,这个时间可以是负值,负值表示电路单元内部的输出信号需要有一些延迟。

② 具体的 hold 与 setup 关系怎么计算呢?

假设 O1 外需要的最小时间为 3ns,如果电路单元内部到输出端口 O1 的延迟是 -3ns,即数据比时钟快 3ns。那么路径结束时的最终延迟为 0ns,所以新数据不会干扰之前的数据,因为时钟沿到来时新数据才有效。等效于 O1 直接作为一个虚拟的触发器的输入,其 hold 要求是 -3ns。所以逻辑云 C1 的最小延迟为 -3ns。
上述情况可能不太方便理解,按照一般的情况,设触发器F2 hold 关系为 5ns 。假设 O1 外需要的最小时间为 3ns,即等效于 O1 直接作为一个虚拟的触发器的输入,其 hold 要求是 2ns。也就是说逻辑云 C1 的最小延时为 2ns。

假设对于信号 O1 的最大要求时间为 7ns,即信号被下一级触发器捕获之前还需要经过 7ns 。等效于 O1 直接作为一个虚拟的触发器的输入,其 setup 要求是 7ns,则如果时钟周期为 10ns ,那么逻辑云 C1 的最大延迟为 3ns。


set_output_delay命令指定输出端口相对于设计接口时钟边缘的输出路径延迟。

当考虑到应用板时,该延迟表示以下两个信号之间的相位差:

  1. 从FPGA的输出引脚通过电路板传播到另一个设备的数据
  2. 相应板载参考时钟。

输出延迟值可以是正的或负的,取决于FPGA外部的时钟和数据相对相位

2.1 使用输出延迟选项

  • -min -max
  • -clock_fall
  • -add_delay

与输入延迟类似

2.2 例子

  1. 同时约束相对于 sysClk 的最小和最大延迟分析

    create_clock -name sysClk -period 10 [get_ports CLK0]
    set_output_delay -clock sysClk 6 [get_ports DOUT]
    
  2. 约束相对于 DDR 时钟的最小(保持)和最大(建立)时序分析

    create_clock -name clk_ddr -period 6 [get_ports DDR_CLK_IN]
    set_output_delay -clock clk_ddr -max 2.1 [get_ports DDR_OUT]
    set_output_delay -clock clk_ddr -max 1.9 [get_ports DDR_OUT] -clock_fall -add_delay
    set_output_delay -clock clk_ddr -min 0.9 [get_ports DDR_OUT]
    set_output_delay -clock clk_ddr -min 1.1 [get_ports DDR_OUT] -clock_fall -add_delay
    

Revision

datarevision
220608增加了基本概念的解释
  • 8
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lu-ming.xyz

觉得有用的话点个赞吧 :)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值