VIVADO时序约束之Input Delay(set_input_delay)

前言

I/O Delay约束主要有两个命令:set_input_delay和set_output_delay。

I/O Delay约束的主要目的同时钟约束一样,是告诉编译器,外部输入输出信号与参考时钟之间的相位关系,便于综合器能够真实和准确的对IO接口的信号进行时序分析,同时也有利于综合器的布局布线。

注意:I/O Delay约束和 IDELAYE、ODELAYE原语是完全不同的,前者是用于编译器进行时序分析的,后者是对数据进行延时的(由于建立时间和保持时间不满足,导致在接收数据有错时,需要对数据进行延迟,以满足建立时间和保持时间)。换言之,前者是时序分析手段,后者是电路调试手段。

一、input delay

输入信号是在时钟沿后多长时间到达模块的port上

"set_input_delay"命令是用于指定输入端口(PIN)的数据输入相对于设计中参考时钟边沿的延迟。 输入延迟值以ns为指定单位,可以为正值,也可以为负值,具体取决于设备接口处的时钟和数据的相对相位关系。

这里特别强调的是FPGA芯片的PIN到内部IOB是有pin delay的,但是set_input_delay指定的延迟是不包含pin delay的值。即set_input_delay所指的延迟是下图中Tco+td_bd-Tc_d-tc_bd的值。
在这里插入图片描述
说明:
上图为IO接口的时序分析模型,模型可分为3部分,分别是上游芯片,PCB走线,下游芯片(这里主要指FPGA)。上图中的时序参数含义分别如下:

时序参数含义
Tco上游芯片输出数据管脚相较于扇出节点时钟发射沿延时
Tc_d上游器件输出管脚处时钟,相较于扇出节点时钟延时
Td_bd数据在PCB上的走线延时
Tc_bd时钟在PCB上的走线延时
pin_delayFPGA的封装引脚pin到内部IOB的延迟
Td_fiFPGA内部数据通路上,IOB到FPGA内部D触发器的路径延迟
Tc_fiFPGA内部随路时钟通路上,IOB到FPGA内部D触发set_input_delayinput_delay

二、set_input_delay语法

set_input_delay  [-clock <args>] [-reference_pin <args>] [-clock_fall] [-rise]
                 [-fall] [-max] [-min] [-add_delay] [-network_latency_included]
                 [-source_latency_included] [-quiet] [-verbose] <delay>
                 <objects>
选项含义
-clock相对时钟,默认使用上升沿,也可以使用-clock_fall指定使用下降沿
-reference_pin指定延迟与出现在指定引脚或端口上的时钟的有效边沿有关,而不是与时钟有关。
-clock_fall指定延迟是相对于时钟的下降沿
-rise指定应用于指定端口上的上升转换的输入延迟。 默认是对上升和下降转换应用延迟(用于指定数据的,非时钟的)。
-fall指定应用于指定端口上的下降转换的输入延迟。 默认是对上升和下降转换应用延迟(用于指定数据的,非时钟的)。
-max表示指定的输入延迟仅在计算最大(最长)路径延迟时使用(建立时间)。
-min表示指定的输入延迟仅在计算最小(最短)路径延迟时使用(保持时间)。
-add_delay将指定的延迟约束添加到端口,以与端口上已定义的任何其他 set_input_delay 约束共存。 默认行为是替换现有的延迟。
-network_latency_included表示参考时钟的时钟网络延迟包含在延迟值中。 除非指定的输入或输出延迟值包括源延迟或网络延迟,否则 Vivado 时序分析器会考虑在时钟延迟之后到达捕获触发器的时钟边沿。
-source_latency_included指示相对时钟的源延迟包含在指定的延迟值中。
-quiet忽略命令错误
-verbose命令执行期间暂停消息限制
delay延时值
objects端口列表

三、用法举例

示例一: 创建一个时钟周期为10ns的sysClk 时钟,然后设定端口DIN相对于时钟sysClk 上升沿的最大和最小延迟为2ns:

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

示例二: 创建一个虚拟时钟clk_port_virt ,周期为10ns,然后设定端口DIN相对于时钟clk_port_virt 下降沿的最大和最小延迟为2ns:

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

示例三: 定义输入端口reset相对于wbClk_IBUF_BUFG_inst/O输出的时钟的输入延迟为2ns,其中wbClk_IBUF_BUFG_inst/O输出时钟的时钟源为wbClk:

set_input_delay -clock wbClk 2 -reference_pin [get_pin wbClk_IBUF_BUFG_inst/O] reset  

示例四: 定义输入端口DIN相对时钟sysClk不同的相对延迟,用于最大路径分析和最小路径分析:

create_clock -name sysClk -period 10 [get_ports CLK0]
set_input_delay -clock sysClk -max 4 [get_ports DIN]
set_input_delay -clock sysClk -min 1 [get_ports DIN]

示例五: 限制I/O端口之间的纯组合逻辑路径,首先定义一个虚拟时钟,用于约束输入和输出延迟,例如设定DIN端口到DOUT端口的纯组合逻辑的延迟为5ns(10ns-1ns-4ns):

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数据的input delay约束:

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

示例七: 对STARTUPE3 内部pin(UltraScale+器件)的input delay约束:

//重命名STARTUP/CCLK自动衍生的时钟名为clk_sck,时钟源为axi_quad_spi_0/ext_spi_clk,频率为时钟源的1/2
create_generated_clock -name clk_sck -source [get_pins -hierarchical *axi_quad_spi_0/ext_spi_clk] [get_pins STARTUP/CCLK] -edges {3 5 7}
set_input_delay -clock clk_sck -max 7 [get_pins STARTUP/DATA_IN[*]] -clock_fall
set_input_delay -clock clk_sck -min 1 [get_pins STARTUP/DATA_IN[*]] -clock_fall

四、实操演示

以SiI9293 MHL/HDMI接收器芯片为例,利用vivado的时序约束向导进行input delay约束,下图为硬件环境模型:
在这里插入图片描述
通过查阅SiI9293的芯片资料手册,可以获取芯片并行数据输出接口Q和随路时钟ODCK之间的时序关系:
在这里插入图片描述
时序约束中假设PCB布线等长时间差很小,可以忽略不计,由上可知在148.5MHz的频率下,数据在时钟上升沿前4.2ns稳定,并在时钟上升沿后的0.4ns后,开始输出下一个并行数据,结合vivado的时序约束向导中的input delays 页面,进行输入延时约束:
在这里插入图片描述
界面中tco_min对应的延时值为手册中的Tck2out(min),tco_max 对应芯片手册中的Tck2out(max)
vivado的时序约束向导中的input delays约束方法2:
在这里插入图片描述
界面中dv_bre对应的延时值为手册中的Tsu,dv_are 对应芯片手册中的Thd
XDC约束语法如下:

set_input_delay -clock [get_clocks {sli9293_odck}] -min 0.4 [get_ports {sli9293_q[*]}]
set_input_delay -clock [get_clocks {sli9293_odck}] -max 2.534 [get_ports {sli9293_q[*]}]

五、总结

min = hold time
max = T - setup time
max - min = 数据抖动时间

参考资源链接:[Vivado XDC约束技巧之I/O篇:时序约束与实现](https://wenku.youkuaiyun.com/doc/6412b791be7fbd1778d4ac24?utm_source=wenku_answer2doc_content) 在使用Vivado进行FPGA设计时,掌握XDC约束的使用是至关重要的,尤其是在进行时序分析时。XDC约束通过一系列命令来指导工具如何处理时序问题,确保设计满足特定的时间要求。下面将结合具体的XDC命令和时序分析的要求,给出一个应用示例。 首先,我们需要了解set_input_delayset_output_delay这两个命令。set_input_delay用于设置输入端口的时序要求,而set_output_delay用于设置输出端口的时序要求。这两个命令的基本语法如下: set_input_delay -clock [clock_name] -max [max_delay] -min [min_delay] [input_ports] set_output_delay -clock [clock_name] -max [max_delay] -min [min_delay] [output_ports] 在实际应用中,你可能会遇到这样的情况:输入信号需要在特定的时钟边沿前到达FPGA的输入端口,而输出信号则需要在特定的时钟边沿后被驱动。例如,假设有一个外部时钟clk_ext,频率为100MHz,即周期为10ns,我们需要为FPGA的输入端口input_port设置一个最大延时为2ns,最小延时为1ns的约束,以确保信号能在时钟的上升沿前到达: set_input_delay -clock clk_ext -max 2.0 -min 1.0 [get_ports input_port] 对于输出端口,假设有一个输出信号output_port需要在下一个时钟周期的上升沿后至少1.5ns输出: set_output_delay -clock clk_ext -max 1.5 [get_ports output_port] 除了对输入输出端口直接进行时序约束外,还可以使用set_max_delayset_min_delay命令来指定不经过时序元件的组合逻辑路径的时序要求。例如,如果某个组合逻辑路径在实现时被识别为问题路径,我们可以指定其最大延迟为5ns: set_max_delay -from [get_ports input_port] -to [get_ports output_port] 5.0 使用这些命令时,需要确保为所有关键的输入输出端口添加约束,并针对每一个端口具体分析其在实际电路中的时序要求。同时,也需要注意FPGA的板级走线和外部器件可能引入的延时。 在进行时序分析时,Vivado会根据这些约束进行检查,确保设计满足时序要求。如果发现违反约束的路径,Vivado会报告相关的时序违规,并且可以提供修复建议。 为了更深入地掌握XDC约束时序分析技巧,建议阅读《Vivado XDC约束技巧之I/O篇:时序约束与实现》一书。这本书详细介绍了XDC约束在I/O时序控制方面的高级应用,将帮助你更好地理解XDC约束的细节以及如何有效地应用于你的FPGA设计中,从而提升设计的整体性能和可靠性。 参考资源链接:[Vivado XDC约束技巧之I/O篇:时序约束与实现](https://wenku.youkuaiyun.com/doc/6412b791be7fbd1778d4ac24?utm_source=wenku_answer2doc_content)
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值