时序约束优先级_VIVADO之时序约束

1 时钟约束

1.1 主时钟(primary clock)

主时钟应首先被定义,因为其他时序约束往往以主时钟为参照标准。主时钟的定义往往应定义在输入端口,而不是clock buffer的输出端口。如下图所示:

针对主时钟进入时钟专用单元,则对主时钟输入端进行约束,时钟专用单元输出时钟将以主时钟作为树根节点进行约束调整。

针对差分时钟信号输入,主时钟约束应在差分时钟正相端进行约束,而不是在正反相上均进行约束,以避免错误的CDC路径。

约束原语:

create_clock -name -period -waveform {} [get_ports ]

1.2 虚拟时钟(virtual clock)

虚拟时钟并没有连接到任何物理线网。虚拟时钟同样使用create_clock命令定义,但不定义源(get_port)。

虚拟时钟往往用于在下列情景中指定输入输出延迟约束 :

* 外部IO参考时钟并不是设计中的时钟

*I/O路径参考时钟来源于FPGA内部派生时钟,但内部派生时钟与主时钟的频率关系并不是整数倍。

*仅针对I/O指定不同的jitter和latency

虚拟时钟必须在用于约束I/O延迟之前被定义。

示例:create_clock -name clk_virt -period 10

1.3 衍生时钟(generated clock)

衍生时钟是设计中由时钟生成没款(MMCM,PLL等)或用户逻辑所产生的时钟模块。衍生时钟可衍生与主时钟或其他衍生时钟。衍生时钟衍生于其控制时钟(master clock),在进行约束时,并不是对衍生时钟的周期或波形做约束,而是描述时钟衍生单元如何对控制时钟(master clock)的转换。

控制时钟和主时钟的关系可以是:

*简单的时钟分频

*简单的时钟倍频

*分频与倍频的组合以获取一个非整数的频率变换(通常由MMCM和PLL)完成。

*移相或相位反转

*占空比转换

*上述的组合

约束原语:create_generated_clock

简单二分频示例:

create_clock -name clkin -period 10 [get_ports clkin]

#1 采用主时钟作为master clock create_generated_clock -name clkdiv2 -source [get_ports clkin] -divide_by 2\[get_pins REGA/Q]

#2 采用REGA的clock引脚作为源。 create_generted_clock -name clkdiv2 -source [get_pins REGA/C] -divide_by 2\[get_pins REGA/Q]

#3 使用-edges作为选项 create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -edges {1,3,5}

对于占空比改变或相移的约束:使用-edge_shift

-edge_shift不能与如下列命令同时使用:-divide_by -multiply_by -invert。

示例:

create_clock -name clkin -period 10 [get_ports clkin]

create_generated_clock -name clkshift -source [get_pins mmcm0/CLKIN] -edges{1 2 3}\-edge_shift {2.5 0 2.5} [get_pins mmcm0/CLKOUT]

-edge_shift的值可以是正数也可以是负数。

-multiply_by和divide_by可同时使用以产生非整数倍频/分频。

create_generated_clock -name \

-source \

-multiply_by \

-divide_by \

衍生时钟路径上组合逻辑的约束:-combinational;

示例:

假定master_clock驱动一个基于寄存器的二分频时钟电路和一个二选一驱动器的时钟选择器用于选择master和二分频时钟,对于主时钟到衍生时钟有时序路径也有组合路径,对于组合逻辑路径可以进行-combinational约束

create_generated_clock -name clkout -source [get_pins mmcm0/CLKIN] -combinational [get_pins MUX/O]

1.3.1 自动衍生时钟

在定义了master_clock后,对于Clock modifying Blocks所输出产生的时钟,VIVADO可以自动进行约束。

对于7系列设备,CMB包含MMCM/PLL,BUFR,PHASER。对于UltraScale系列,CMBS包含MMCM/PLL*,BUFGGT/BUFGCE_DIV,GT*_COMMON/ GT*_CHANNEL/ IBUFDS_GET3,BITSLICE_CONTROL/RX*_BITSLICE,ISERDESE3。

衍生时钟的重命名:

create_generated_clock -name new_name [-source master_pin] [-master_clock master_clk] source_object

newname和sourceobject必须被制定。sourceobject指衍生时钟的对象(CMB output pin,GT output pin for UltraScale等)。当有多个时钟传递至source pin时应制定-source和-master_clock。

If any of the -edges/-edge_shift/-divide_by/-multiply_by/-combinational/-duty_cycle /-invert options is passed to the create_generated_clock command, the generated clock is not renamed. Instead a new generated clock is created with the specified characteristics.

自动衍生的时钟重命名只能在它的发源处重命名,不能经过任何原语器件。主时钟和用户定义的时钟不能被重命名。

The auto-derived clocks can be renamed at any time inside the XDC, even after they have been referenced by some timing constraints。

时钟重命名可以在XDC文件中任何地方重命名。

1.4 时钟组(clock group)

默认情况下,vivado分析各时钟下所有的路径(除非制定或使用clock group 或false path约束)。

时钟组约束set_clock_groups将关断指定的时钟组之间的时序分析,但并不关断时钟组内各时钟之间的时钟约束。set_false_path约束是单向的,但set_clock_group时序分析忽略是双向的。

set_clockgroups在有至少有两个有效非空时钟组是才有效。可以使用schematic viewer,clock_network_report观察决定哪些时钟不能一块儿分析。

对于异步时钟和不可预测时钟(unexpandable clocks,在1000个内时钟沿无法对齐),可采用set_clock_groups进行约束(set_clock_groups优先级比常规的时序例外高,若想分析两个异步时钟之间的的一些路径则不应该使用时钟组约束,应只使用timeing_exceptions)。

示例:

主时钟clk0经由MMCM产生usrclk和itfclk。第二个主时钟clk1有GTP恢复产生并由MMCM 产生时钟gtclkrx和gtclktx。

通过-asynchronous创建异步时钟组

set_clock_groups -name async_clko_clk1 -asynchronous -group {clk0 usrclk itfclk} \

-group {clk gtclkrx,gtclktx}

也可通过get_clocks -include_generated_clocks去动态的追踪衍生时钟:

set_clock_groups -name async_clk0_clk1 -asynchronous \

-group [get_clocks -include_generated_clocks clk0]\

-group [get_clocks -include_generated_clocks clk1]

1.4.1 排外性时钟组(exclusive clock groups)

有些设计模块中根据工作模式的不同通过BUFGMUX和BUFGCTRL实现多个时钟的切换,这种时钟称为排外性时钟,时钟不会同时存在。可通过-logically_exclusive或-physically_exclusive进行约束。

示例:

MMCM产生时钟clk0,clk1,两者通过一个BUFGMUX产生时钟clkmux驱动整个设计。

默认情况下,vivado会分析clk0和clk1之间的路径,即使两者不会同时存在于设计中。可进行如下约束:

set_clock_groups -name exclusive_clk0_clk1 -physically_exclusive \

-group clk0 -group clk1

在FPGA中,-logically_exclusive和-physically_exclusive没有差别,尽在ASIC中有区别

1.5 Clock Latency,Jitter,and Uncertainty

1.5.1 Clock Latency

片内的时钟延迟有vivado自动计算,可通过set_clock_latency约束片外时钟延时(用于源同步信号中的源时钟)。

示例

# Minimum source latency value for clock sysClk (for both Slow and Fast corners)

set_clock_latency -source -early 0.2 [get_clocks sysClk]

# Maximum source latency value for clock sysClk (for both Slow and Fast corners)

set_clock_latency -source -late 0.5 [get_clocks sysClk]

1.5.1 Clock Jitter

时钟抖动分为input jitter(源时钟本身属性)和system jitter(电源噪声、板级噪声及其他额外系统抖动造成)。通过set_input_jitter、set_system_jitter可分别对input jitter和system jitter进行约束。system jitter 是对全部时钟的约束。

2 I/O延迟约束

2.1 输入延迟

命令格式:set_input_delay

输入延时可正可负,取决于时钟和数据的相位关系。

参考时钟可以是设计时钟也可以是虚拟时钟(纯组合逻辑电路)。

2.1.1 最大与最小延时命令选项

-max,-min选项指定输入最大最小延时。最大延时一般用于保持时间分析,最小延时一般用于建立时间分析。若没有该选择项,则最大最小延时设为相同值。

2.1.2 时钟下降沿指定选项

-clock_fall指定输入延迟约束以时钟下降沿作为时钟参照点。默认情况下,VIVADO仅以时钟上升沿作为参照时钟。

2.1.3 增加延迟输入延迟约束

-add_delay选项一般用于引脚输入约束已存在,想再次指定额外的时序约束。一般用于约束具有多个时钟或时钟边沿相关的引脚约束(DDR、inout等)。

示例

# defines an input delay relative to a previously defined sysClk for both min and max analysis.create_clock -name sysClk -period 10 [get_ports CLK0]

set_input_delay -clock sysClk 2 [get_ports DIN]

#defines an input delay relative to a previously defined virtual clockcreate_clock -name clk_port_virt -period 10

set_input_delay -clock clk_port_virt 2 [get_ports DIN]

#defines a different input delay value for min analysis and max analysis to sysClkcreate_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]

#纯组合逻辑电路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.2 输出延时

约束指令:set_output_delay.

同set_input_delay,-clock是指令约束必选项,同时输出延迟约束包含-min,-max,-clock_fall,-add_delay

示例:

# defines an output delay relative to a previously defined sysClk for both min and max analysis

create_clock -name sysClk -period 10 [get_ports CLK0]

set_output_delay -clock sysClk 6 [get_ports DOUT]

#defines an output delay relative to a previously defined virtual clock.

create_clock -name clk_port_virt -period 10

set_output_delay -clock clk_port_virt 6 [get_ports DOUT]

#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

3 时序例外(Timing Exceptions)

3.1 多周期路径(Multicycle Paths)

常用于逻辑电路中需要多于一个时钟周期才能稳定达到目标寄存器,若控制电路允许这种情况,可使用多时钟周期路径约束(多用于建立时间分析,保持时间可视情况保持原状)。

约束原语:set_multicycle_path [-setup|-hold] [-start|-end][-from ] [-to ] [-through ]

对于setup分析,num_cycles默认为1,对于hold分析,mun_cycles默认为0.

默认情况下,保持时间的检查是以建立时间的检查为前提,即总是在建立时间的前一个时钟周期确定保持时间检查,可参考文献:Vivado: 如何理解多周期路径约束​xilinx.eetrend.com

路径分析以目的端时钟作为参考.若更改为以源端时钟作为分析对象,使用-start选项.相似的,多周期保持路径以源端时钟分析,若更改为保持要求以目的端时钟为准,则使用-end选项.

对于-setup:表示该多周期路径所需要的时钟周期个数;

对于-hold:表示相对于缺省捕获沿(设定捕获沿的前一个时钟周期),实际捕获沿(往往与触发沿保持同步位置)应回调的时钟周期个数;

*参考时钟周期的选取:

-end表示参考时钟为捕获端(收端)所用时钟,对于-setup缺省为-end;

-start表示参考时钟为发送端(发端)所用时钟,对于-hold缺省为-start;

若源时钟和目的时钟具有相同的周期,则-end,-start没有什么不同.-start和-end对触发沿和捕获沿的影响如下:

对于-start,hold沿将以latch沿为基础向后移动,setup分析将以捕获沿为基础,向前移动N个源时钟周期时钟定位latch沿;对于-end,hold沿将以移动后的hold沿为基准向前移动,setup分析将以latch沿为基础,向后移动N个目的时钟周期定位捕获沿.

3.1.1 单时钟域的多周期时钟约束Multicycle Constraint in SIngle Clock Domain

默认的建立与保持关系如下图所示:默认的建立与保持沿关系

示例:带使能的双周期时钟路径

下列约束建立一个新的建立关系

set_multicycle_path 2 -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]

在建立新的建立约束关系时,保持时间关系也将自动的调整(移至捕获时钟沿的前一个时钟沿),下图展示了仅约束setup多周期约束后建立与保持关系的变化:

由于带有使能,data0_reg没有必要再保持一个时钟周期,Xilinx推荐更改保持关系为原来的状态,通过增加-hold约束,

set_multicycle_path 1 -hold -end -from [get_pins data0_reg/C] \ -to [get_pins data1_reg/D]

此时,建立与保持关系如下所示:

对于建立与保持关系,触发沿是不改变的.

若不增加-hold,在implementation过程中将插入大量的延时以满足保持时间约束,因而需要增加-hold约束.

在单时钟域或具有相同波形的双时钟域,当一个N周期的建立多周期,N-1个保持多周期的约束示例如下所示:

set_multicycle_path N -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]

set_multicycle_path N-1 -hold -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]

3.1.2 单时钟域带相移的多周期时钟约束

3.1.2.1 目的时钟超前源时钟

示例: CLK1为源时钟,CLK2为目的时钟,CLK2超前0.3ns.

由于时钟相移,建立与保持分析可能不像预期那样,如下图所示:

此种情况下,由于0.3ns相移,建立余量只有0.3ns,这使得几乎不可能满足时序收敛,另一方面,有3.7秒的保持余量,太过丰富.

这种情况下,应设置多周期时钟约束:

set_multicycle_path 2 -setup -from [get_clocks CLK1] -to [get_clocks CLK2]

将捕获沿向前移1个时钟周期,保持沿将自动移动,无需在施加-hold约束.此时时序关系如下图所示:

3.1.2.2 目的时钟滞后源时钟

对于目的时钟之后源时钟,无需施加多时钟周期约束.若目的时钟超前太多,则需施加(个人以为超前太多可归于上一种情况).

3.1.3 慢时钟域到快时钟域的多周期时序约束

示例:

带有时钟使能的慢时钟域到快时钟域,CLK2时钟频率为CLK1时钟频率的3倍.若没有多时钟周期约束,STA分析将按照下图进行分析:

施加建立多时钟周期约束:

set_multicycle_path 3 -setup -from [get_clocks CLK1] -to [get_clocks CLK2]

此时建立与保持关系如下图所示:

由于没有施加保持关系,因而需要在路径上添加大量的延时,将会增加面积和功耗.

施加-hold约束:

set_multicycle_path 2 -hold -from [get_clocks CLK1] -to [get_clocks CLK2]

此时建立与保持关系分析如下图所示:

对于慢时钟域到快时钟域,定义N周期建立多时钟周期约束,N-1周期保持约束,定义原语:

set_multicycle_path N -setup -from [get_clocks CLK1] -to [get_clocks CLK2]

set_multicycle_path N-1 -hold -end -from [get_clocks CLK1] -to [get_clocks CLK2]

3.1.4 快时钟域到慢时钟域的多周期时序约束

在没有多时钟周期约束的情况下,STA将按照下图进行分析约束:

建立约束:

set_multicycle_path 3 -setup -start -from [get_clocks CLK1] -to [get_clocks CLK2]

set_multicycle_path 2 -hold -from [get_clocks CLK1] -to [get_clocks CLK2]

建立与保持关系约束将变为如下图所示:

快时钟域到慢时钟域的约束:

set_multicycle_path N -setup -start -from [get_clocks CLK1] -to [get_clocks CLK2]

set_multicycle_path N-1 -hold -from [get_clocks CLK1] -to [get_clocks CLK2]

3.1.5 小结

3.2 伪路径(False Paths)

伪路径定义为:

1 从逻辑上考虑,与电路正常工作不相关的那些路径,比如测试逻辑,静态或准静态逻辑(rom).

2 从时序上考虑,我们在综合时不需要分析的那些路径,比如跨时钟域的路径,异步双端口RAM等.

伪路径的优势:减少工具运行优化时间,增强实现结果,避免在不需要进行时序约束的地方画较多时间而忽略了真正需要进行优化的地方.

约束原语:

set_false_path [-setup] [-hold] [-from ] [-to ] \ [-through ]

-from的节点应是有效的起始点.有效的起始点包含时钟对象,时序单元的clock引脚,或者input(or inout)原语.

-to的节点应包含有效的终结点.一个有效的终结点包含时钟对象,output(or inout)原语端口,或者时序功能单元的数据输入端口

-through的节点应包括引脚,端口,或线网.当单独使用-through时,应注意所有路径中包含-through节点的路径都将被时序分析工具所忽略.

-through的先后顺序非常重要!!!

示例:

set_false_path -through cell1/pin1 -through cell2/pin2

set_false_path -through cell2/pin2 -through cell1/pin1

上述第一条约束将会忽略先经过pin1,再经过pin2的路径约束,而第二条语句会忽略先经过pin2,再经过pin1的路径,两者并不等价.

false_path的约束是单向的,而非双向的.

3.3 最大最小延迟(Min/Max Delays)

最大最小延迟可重新指定路径的最大最小延迟.

最大延迟(Maximum delay)可重写路径的默认setup(recovery)要求.

最小延迟可以重定义路径的默认hold要求.

约束原语:

set_max_delay [-datapath_only] [-from ][-to ][-through ]

set_min_delay [-from ] [-to ][-through ]

-from:有效的起始节点包含:时钟,input(input)端口,或时序单元(寄存器,RAM)的时钟引脚.

-to:有效的终止节点包含:时钟,output(inout)端口或时序单元的数据端口.

-through:有效的节点包含:引脚,端口,线网.

-datapath_only选项可在裕量计算时不考虑时钟偏斜,需和-from一同使用.在不使用带-datapath_only选项时,设置最大延迟不改变最小约束要求,保持约束(hold check)将保持默认值.当使用带datapath_only选项约束时,路径的保持要求检查(hold check)将被忽略(内建set_false_path -hold 约束),换言之,路径的保持关系检查将不做分析.同样的,建立最小延迟约束也不改变路径的setup检查.-datapath_only可用于跨时钟域信号需要设置最大延迟时使用.

跨时钟域信号最大延迟约束设置(这种情况下不应再设置时钟组):

set_max_delay -datapath_only -from \ -to

3.4 条件分析(case analysis)

但正常工作模式下的某些输入是不会发生的,例如ResetN在正常工作模式是1,如果考虑它为0对单元延时的影响,无疑是不必要的。条件分析常用于在上电后信号保持不变或复用逻辑中仅在某些情况下才有效的情况.可用于BUFGMUX,LUT, F8MUX, the Reset pin of the FF, and the Enable pin of the FF.更多的是应用于bufgmux.

约束原语:set_case_analysis

的值可以是0,1,zero,one,rise,rising,fall,falling.表明指定的信号仅在给定情况下才会分析,其他情况将不会分析.

示例:下图中在S设定值后仅clk_2沿路径向后传送,可施加约束:

create_clock -name clk_1 -period 10.0 [get_pins clock_sel/I0]

create_clock -name clk_2 -period 15.0 [get_pins clock_sel/I1]

set_case_analysis 1 [get_pins clock_sel/S]

3.5 禁止时序分析(disabling timing)

通过set_disable_timing约束可以禁止某些路径的时序分析.只能禁止逻辑单元的input到output端口.可用于指定组合反馈逻辑,分布式ram等某些路径的禁止时序分析.

约束原语:

set_disable_timing [-from ] [-to ] [quiet][-verbose]

-from,-to的参数只能是引脚名和非VIVADO工具对象的名称.同时引脚名称必须匹配元件库中的名称,而不是设计中的引脚名.

示例:

set_disable_timing -from WCLK -to O [get_cells inst_fifo_gen /gdm.dm /gpr1.dout_i_reg[*]]

上述约束将禁止所有inst_fifo_gen /gdm.dm /gpr1.dout_i_reg[*]寄存器WCLK到O的时序分析.

-from,-to是可选的.若仅指定-from,则所有源自-from指定位置为出发点的路径都将被忽略,若仅指定-to,则所有终结至-to节点的路径都将被禁止时序分析.若-from,-to都没有指定,则所有的时序路径都将被忽略.

4 跨时钟域约束(Clock Domain Constraints)

跨时钟域包含同步跨时钟域和异步跨时钟域,这取决于触发沿与捕获沿之间的关系和CDC路径上的时序例外约束。例如同步时钟之间被约束以false path将不会再进行时序分析,将被当成异步时钟域处理。

跨时钟域的路径可以通过set_false_path或set_clock_groups约束全部忽略掉,也可以通过set_max_delay -datapath_only选项做部分路径分析.多比特跨时钟域信号也可以使用set_bus_skew约束.

总线偏斜约束用于指定跨时钟域信号之间最大的偏斜要求。不同于传统的时钟偏斜,它对应于不同路径信号之间的所允许的最大捕获时间。

bus skew约束目的在于限制源端向目的端发送数据所需要的源端时钟数。该数目取决于跨时钟路径上的同步电路。bus skew 约束往往用于:

格林码传输

配置寄存器

带有CE、MUX、或MUX 保持电路的多比特跨时钟实现

bus skew并不是一个时序例外,相反其是一个时序声明。因而它并不影响时序例外的优先级。bus skew往往用于route_design。

约束原语:

set_bus_skew [-from ] [-to ] [-through ]

-from选项包含有效的起始点。有效起始点包含输入(或inout)端口,或时序单元(寄存器,ram等)的时钟输入端口。

-to选项包含时钟,输出(或inout)端口,时序单元的数据输入端口

-through选项包含pins,ports,nets。

推荐-from和-to都使用,同时定义详尽的约束,避免包含进多余的路径。不建议直接设置源端时钟到目的端时钟之间的总线约束,应具体到信号。

总线偏斜的值应该是实际可靠的。推荐设置值应大于源端和目的时钟周期最小值的一半。同时该值也依赖跨时钟域上的拓扑逻辑电路。

示例:

跨时钟域的时钟使能电路如下图所示,时钟使能信号同步电路上包含四个同步寄存器:

这种情况下,总线偏斜值根据同步寄存器个数进行调整,因为寄存器个数反映了什么时候目的端时钟使能。假设源端时钟周期5ns,目的端时钟周期2.5ns,此时约束为

set_bus_skew -from [get_cells src_hsdata_ff_reg*] -to [get_cells dest_hsdata_ff_reg* ] 10.000

同时为避免在布局过程源端和目的端位置间距太大,可施加set_max_delay约束:

set_max_delay -datapath_only -from [get_cells src_hsdata_ff_reg*] -to [get_cells dest_hsdata_ff_reg*] 10.000

示例二:

如下图所示异步时钟域之间的格林码传输。由于必须确保在目的时钟域同一时间只有一位发生跳转,因而总线偏移应不超过一个目的端时钟周期。

set_bus_skew -from [get_cells src_gray_ff_reg*] -to [get_cells { dest_graysync_ff_reg[0]* }] 2.500

set_max_delay -datapath_only -from [get_cells src_gray_ff_reg*] -to [get_cells

{dest_graysync_ff_reg[0]*}] 5.000(从慢时钟域到快时钟域,仅需确保源端变化能被目的端采到即可)

5 XDC约束优先级

xdc约束指令是按照顺序解释执行的,相应的,同样的约束指令,最后一条约束生效。

时序例外优先级:时序例外优先级从高到低为:Clock Grroups,False Path,Maximum Delay Path(set_max_delay)和(set_min_delay),多时钟周期约束(set_multicycle_path).

set_bus_skew约束并不影响上述优先级且不与上述约束冲突。原因在于set_bus_skew并不是某条路径上的约束,而是路径与路径之间的约束。

针对同样的约束例外,约束定义的越细致,则其优先级越高。针对各种对象的优先级为:Ports,pins,cells,clocks。clock相比于ports,pins,cells优先级最低。路径指示声明的优先级从高到低分别为:-from -through -to,-from -to,-from -through,-from, -through -to,-to,-through。优先级先考虑对象类型才考虑路径指示。

示例:

> set_max_delay 12 -from [get_clocks clk1] -to [get_clocks clk2]

> set_max_delay 15 -from [get_clocks clk1]

上述约束中,第一条约束优先级高,第二条约束clk1到clk2的约束将会被重写。

> set_max_delay 12 -from [get_cells inst0] -to [get_cells inst1]

> set_max_delay 15 -from [get_clocks clk1] -through [get_pins hier0/p0] -to

[get_cells inst1]

-throuh并不影响优先级,约束器将会采用最严的约束,因而从inst0到inst1的约束将会被指定为第一条。

> set_max_delay 4 -through [get_pins inst0/I0]

> set_max_delay 5 -through [get_pins inst0/I0] -through [get_pins inst1/I3]

两条约束都存在,但inst/i0将采用最严的第一条约束。

应避免对同一对象添加多条约束。推荐使用report_exceptions指令来检查有效的例外约束。

你可能感兴趣的:(时序约束优先级)