首页 > 技术知识 > 正文

  上一篇我们讲过set_input_delay:

set_input_delay如何约束?

什么是output_delay?

顾名思义,output_delay就是指输出端口的数据相对于参数时钟边沿的延时。

对于系统同步,FPGA和下游器件是同一个时钟源,output delay的设置方式如下图所示:

什么是output_delay?-什么是okr绩效管理模式image-20220922214836390 什么是output_delay?-什么是okr绩效管理模式1image-20220923191831151

对于我们常用的源同步场景,output delay的设置方式如下图所示:

什么是output_delay?-什么是okr绩效管理模式2什么是output_delay?-什么是okr绩效管理模式3image-20220923191055430

set_output_delay语法

set_output_delay[‑clock][‑reference_pin][‑clock_fall] [‑rise][‑fall][‑max][‑min][‑add_delay][‑network_latency_included] [‑source_latency_included][‑quiet][‑verbose] Name Description [-clock] Relative clock [-reference_pin] Relative pin or port [-clock_fall] Delay is relative to falling edge of clock [-rise] Specifies rising delay [-fall] Specifies falling delay [-max] Specifies maximum delay [-min] Specifies minimum delay [-add_delay] Dont remove existing input delay [-network_latency_included] Specifies network latency of clock already included [-source_latency_included] Specifies source latency of clock already included [-quiet] Ignore command errors [-verbose] Suspend message limits during command execution Delay value List of ports

下面来详细说明一下:

-clock:input_delay一般是相对时钟而言的,而且默认是相对于上升沿,我们可以通过clock_fall参数来指定下降沿,这里的时钟可以是虚拟时钟;

-reference_pin:指定相对于某个pin上的时钟边沿,跟-clock的参数其实是一个意思,毕竟时钟也是通过pin输入进来的;

-clock_fall:指定相对于时钟下降沿

-rise:指定端口的上升转换的输入延迟

-fall:指定端口的下降沿的输入延迟

-max:最大延迟

-min:最小延迟,我们做input delay主要就是约束这两个参数

-add_delay:以增量的方式添加延迟,如果不加该参数,默认行为是替换现有的延时

-network_latency_included:表示参考时钟的网络延迟也包含在延迟中

-source_latency_included:跟上一个参数类似的含义,该参数表示时钟的源端延迟包含在延时中

-quiet:忽略指令的错误信息,即便指令错了也依然返回TCL_OK

-verbose:命令执行期间忽略消息数量的限制,就是说会返回该指令的所有的message

delay:延迟值

objects:端口列表

Vivado Timing Constraints Wizard

还是一样通过Vivado的Timing Constraints Wizard工具来进行约束会方便很多:

什么是output_delay?-什么是okr绩效管理模式4

对应的约束如下:

set_output_delay-clock[get_clocks{clk}]-min-add_delay-1.0[get_ports{led[*]}] set_output_delay-clock[get_clocks{clk}]-max-add_delay2.0[get_ports{led[*]}]

可以看出,对于源同步系统,output delay其实就是下游器件的建立时间和保持时间的要求。

Examples

1.输出数据比时钟延迟3ns的delay:

create_clock-nameclk-period10[get_portsclk_in] set_output_delay-clockclk3[get_portsDOUT]

2.输入数据相对于时钟的下降沿有2ns的delay:

set_output_delay-clock_fall-clockclk2[get_portsDOUT]

3.设置延迟5ns,同时参数时钟的网络延迟也包含在内:

set_output_delay5.0-clockclk-network_latency_included[get_portsDOUT]

4.双沿时钟的约束,对上升沿和下降沿都需要进行约束

create_clock-nameclk_ddr-period6[get_portsDDR_CLK_OUT] set_output_delay-clockclk_ddr-max2.1[get_portsDDR_OUT] set_output_delay-clockclk_ddr-max1.9[get_portsDDR_OUT]-clock_fall-add_delay set_output_delay-clockclk_ddr-min0.9[get_portsDDR_OUT] set_output_delay-clockclk_ddr-min1.1[get_portsDDR_OUT]-clock_fall-add_delay

具体案例

比如某器件手册的输出时钟与数据的setup和hold要求如下图:

什么是output_delay?-什么是okr绩效管理模式5

该时钟双沿采样,在时钟边沿到来后,结合output_delay的最大最小延迟的定义,可以知道:

最大延迟为Tsetup

最小延迟为-Thold

但需要注意的是,输出延迟的时钟位置,一般输出时钟都会经过一级BUFG,再作为数据的随路时钟输出,那我们就需要在输出的pad上先create_generate一个时钟,然后output delay是相对于该时钟进行的。

什么是output_delay?-什么是okr绩效管理模式6image-20220924171932035

因此output delay的约束如下:

crate_clock-nameclk_in-period10[get_portsclk_p] create_generated_clock-name{tx_clk}-source[get_ports{clk_tx}]-multiply_by1-divide_by1{get_portsclk_p}-master_clock[get_clocks{clk_in}]-add_delay set_output_delay-clock[get_clocksclk_tx]-min-0.8[get_portsDOUT]-add_delay set_output_delay-clock[get_clocksclk_tx]-max1.0[get_portsDOUT]-add_delay set_output_delay-clock[get_clocksclk_tx]-min-0.8[get_portsDOUT]-clock_fall-add_delay set_output_delay-clock[get_clocksclk_tx]-max1.0[get_portsDOUT]-clock_fall-add_delay

因此,只要记住:

min_delay就是下游器件的 -hold time

max_delay是下游器件的setup time

如果是双沿的话,就是半个时钟周期,而且还需要对时钟的下降沿进行约束

审核编辑:彭静

猜你喜欢