Constraint I/O Delay
About Constraining I/O Delay
为了精确对外部时序进行建模,必需要给出input和output端口的时序信息。因为Vivado仅能给出FPGA内部的时序信息,所以工程师需要用以下命令具体指出FPGA外部的时序延迟信息。
• set_input_delay
• set_output_delay
Input Delay
set_input_delay
命令指出数据输入端口相比较于时钟的延迟信息,输入延迟表示以下两者相位的不同:
-
数据从外部芯片传输通过PCB板线路输入FPGA的输入引脚的时间
-
参考时钟通过PCB板的时间
因此输入input delay可以是正也可以是负,这取决于数据和时钟的相位关系。一般情况下,由于数据是多根,尽管PCB工程师会做等长处理,但仍然存在传输的时间先后差距,即最大和最小到达FPGA端口的时间,用这个时间减去参考时钟的时间,即为最大或最小延迟,一般情况下我们不考虑时钟的最大最小延迟,因为时钟线一般是差分,且系统中仅会存在少量的时钟源信号(相比较于数据传输线)。
Using Input Delay Options
尽管-clock
选项在SDC标准上是可选择的,但Vivado是必要的,因为参考时钟可能是design clock
或virtual clock
。
输入延迟命令如下:
-
Min and Max Input Delay Command Options
-
Clock Fall Input Delay Command Option
-
Add Delay Input Delay Command Option
Min and Max Input Delay Command Options
-min
和-max
选项指定如下的不同:
-
最小延迟分析(hold/removal)
-
最大延迟分析(setup/recovery)
如果两者都没有使用,那么输入的数值将会应用到max和min两者。
Clock Fall Input Delay Command Option
-clock_fall
选项将会指出输入延迟约束应用到参考时钟的下降沿,如果没有操作这个选项,那么Vivado工具将会默认把延迟约束应用到参考时钟上升沿。
但是不要混淆-clock_fall
与-rise
以及-fall
,-rise
以及-fall
用来约束数据的边沿而不是时钟边沿。
Add Delay Input Delay Command Option
-add_delay操作在以下条件使用:
-
max或min输入(input delay)约束存在
-
你想在同一端口指定次max或min输入约束延迟
这个选项一般用于输入端口的参考时钟采样超过一个时钟沿,比如,DDR接口。你可以把input delay约束应用到输入或者双向端口,但不包括时钟输入端口,当然,也不能用于内部的pin。
Use of set_input_delay Command Options
下面的示例展示典型的set_input_delay命令的使用方法。
示例一
这个示例定义了一个相对于先前定义的sysClk时钟的输入延迟,用于最小和最大分析。(约束数值同时应用到最大和最小)
> create_clock -name sysClk -period 10 [get_ports CLK0]
> set_input_delay -clock sysClk 2 [get_ports DIN]
示例二
这个示例定义了一个相对于先前定义的virtual clock
。
> create_clock -name clk_port_virt -period 10
> set_input_delay -clock clk_port_virt 2 [get_ports DIN]
示例三
这个示例定义了相关与sysClk的input delay,分别应用到最大分析和最小延迟分析。
> 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端口之间的纯组合路径,必须在I/O端口上定义一个相对于先前定义的virtual clock
的输入和输出延迟。
这个示例定义了DIN
和DOUT
之间的约束:5 ns (10 ns - 4 ns - 1 ns)
> create_clock -name sysClk -period 10
> set_input_delay -clock sysClk 4 [get_ports DIN]
> set_output_delay -clock sysClk 1 [get_ports DOUT]
示例五
这个示例定义了DDR clock的输入延迟约束数值
> 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
这个示例建立一个数据由外部clk_ddr
时钟上升沿和下降沿驱动的约束,数据到内部触发器端口,flip-flop对时钟上升沿和下降沿都敏感。
公众号:AriesOpenFPGA