当前位置:文档之家› set input delay

set input delay

set input delay
set input delay

Set input delay

1.input delay的由来

分析电路连接:

图1

图2

(1)Tclk1:时钟源osc产生的时钟到达ASSP时钟脚的延迟。

由于这个延时的存在,到达assp的时钟与osc时钟源的相位关系如图2所示为:

图3

(2)Tco:时钟沿有效到数据输出有效的时间间隔,可得到到达assp时钟端

口和assp 的数据输出的相位关系:

图4

(3) pcb data T _:pcb 走线延迟

(4) ext clk T 2 :osc 时钟源到达fpga 管脚的延时。

经过上面四个延迟,到达fpga 数据管教的数据和osc ,FPGA.CLK 的相位关系如图5:

图5

最终由图5可知,相对于FPGA.CLK ,数据到达fpga 的数据端的延迟时间为:

Input Delay = Tclk1+ Tco+pcb data T _-ext clk T 2 (1)

2. max_delay 和min_delay

首先说明一点,为了满足reg2的建立和保持时间,fpga 的布局布线工具会调整图1中的int data T 和in clk T 2,也就是说为了满足reg2的时序要求,这两个时间是可以改变的。

由于Tclk1,pcb data T _,ext clk T 2是由pcb 走线决定,为固定值,只有Tco 有max 和min 之分,当Tco 取max 值时得到max delay ,当Tco 取min 值时,得到min delay 。

Max delay = Tclk1+ Tco (max )+pcb data T _-ext clk T 2 (2) Min delay = Tclk1+ Tco (min )+pcb data T _-ext clk T 2 (3)

那么把max delay 和min delay 加到时序约束中有什么样的作用呢???

max delay 和min delay 都是delay ,描述的是数据到达fpga 的数据脚延时了时钟沿到达fpga 时钟脚多少时间。

图6,如果在timequest 中设置max delay 越大,就告诉了布局布线器数据相对edge 延时越大,布局布线器就认为延时大,为了满足setup time (综合器知道fpga 自身的setup time ),它调整数据和edge 的相对相位变化幅度就越

大(布局布线器就通过调整int data T 和in clk T 2),调整时钟延时in clk T 2就越大,保证了setup time ,但减少了保持时间,所以设置delay 时间不能太大。

图6

min delay 为了满足reg2数据的hold 时间,让到达reg2的时钟延时时间有一个最小的延时。这样布局布线器就通过约束让in clk T 2比较小。Min delay 不

能太小,否则建立时间不能满足。

max delay 和min delay 就是一对相互矛盾体。外部器件输入到FPGA 的数据也必须满足建立保持时间要求,输入最大延时通俗的理解就是外部器件的数据到达FPGA 端口的最晚时间,这个最晚时间可不能太晚,必须考虑FPGA 内部锁存这个数据的建立时间Tsu 。如果数据晚到时钟的锁存沿前的Tsu 时间还没有到达,那么时钟就无法锁存这个数据了。那么就会出现时序违规了,所以,这个输入最大延时需要满足的第一个条件就是Tsu+输入最大延时<时钟周期TCLK (如图8的第一个公式)。如图7:

同理,这个数据要到达FPGA 最快的时间称之为输入最小延时。这个最快时间也不能太快,试想想,如果在时钟的发射沿外部器件里的数据在非常短的时间内通过了外部器件的Tco 和PCB 走线,到达FPGA 端口时,假设此时FPGA 正处于上一个从外部器件传递来的数据的保持时间Th 内,那么新到达的数据势必会破坏了前一个数据的保持时间,这也会造成时序违规。这么说来,这个输入最小延时也不能太小,也必须满足一定的条件,这个条件就是:Th<输入最小延时(如图8的第二个公式)。

图8

总之把数据到达fpga 的max delay 和min delay 加到时序约束中,fpga 会约束int data T 和in clk T 2,尽量去满足reg2的建立和保持时间。

3.timequest

Timequest应用例子

打开timequest/constraint/set input delay 1. 例子1

(1)timequest设置

max delay

min delay

生成的指令:

set_input_delay -add_delay -max -clock [get_clocks {clk}] 3.000 [get_ports {i_address[0]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 1.000 [get_ports {i_address[0]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 3.000 [get_ports {i_address[1]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 1.000 [get_ports {i_address[1]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 3.000 [get_ports {i_address[2]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 1.000 [get_ports {i_address[2]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 3.000 [get_ports {i_address[3]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 1.000 [get_ports {i_address[3]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 3.000 [get_ports {i_address[4]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 1.000 [get_ports {i_address[4]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 3.000 [get_ports {i_address[5]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 1.000 [get_ports {i_address[5]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 3.000 [get_ports {i_address[6]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 1.000 [get_ports {i_address[6]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 3.000 [get_ports {i_address[7]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 1.000 [get_ports {i_address[7]}]

Setuput波形图

Hold波形图

2. 例子2 Set max delay

Set min delay

生成的语句:

set_input_delay -add_delay -max -clock [get_clocks {clk}] 2.000 [get_ports {i_address[0]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 0.500 [get_ports {i_address[0]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 2.000 [get_ports {i_address[1]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 0.500 [get_ports {i_address[1]}]

set_input_delay -add_delay -max -clock [get_clocks {clk}] 2.000 [get_ports {i_address[2]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 0.500 [get_ports {i_address[2]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 2.000 [get_ports {i_address[3]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 0.500 [get_ports {i_address[3]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 2.000 [get_ports {i_address[4]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 0.500 [get_ports {i_address[4]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 2.000 [get_ports {i_address[5]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 0.500 [get_ports {i_address[5]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 2.000 [get_ports {i_address[6]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 0.500 [get_ports {i_address[6]}] set_input_delay -add_delay -max -clock [get_clocks {clk}] 2.000 [get_ports {i_address[7]}] set_input_delay -add_delay -min -clock [get_clocks {clk}] 0.500 [get_ports {i_address[7]}]

波形图:setup

Hold:

上面两种情况都为最差的情况(大概就是slack 最小吧),但无论如何,在不同的max delay 和min delay 情况下,都会有不同的int data T 和in clk T 2(起码有一个不同)

相关主题
文本预览
相关文档 最新文档