时序约束之 set_multicyle_path (1)

在launch clk和capture clk在同一时钟域的情况下。下图摘自ug903.

时序约束之 set_multicyle_path (1)

默认情况下,setup和hold的关系如下:

时序约束之 set_multicyle_path (1)

设定约束:(使得setup edge后移3个Tcapture_clk,此时时序分析工具会默认将hold edge在setup edge的前1个Tcapture_clk)

set_multicycle_path  3  -setup  -from [get_pins  UFF0/Q]  -to  [get_pins UFF1/D]

如上约束在默认情况下,hold检查的沿应该是在T=20ns时刻(较setup capture edge早一个cycle)。这种检查机制好不好呢?显然不好。为什么呢?(可以自己画波形,其实波形已经在图3中了)。从图中看到这样的hold 检查方式,会导致hold可能过度悲观,很难满足hold time的要求。

时序约束之 set_multicyle_path (1)

因此,我们需要像单cycle check的情况一样,即hold检查的沿应该和launch clk的edge一致(T=0时刻)。这样我们的hold time check比较容易满足,也比较科学。那么如何实现这种想法呢?我们引进了如下约束命令:

set_multicycle_path  2 -hold -end   -from [get_pins  UFF0/Q]  -to  [get_pins UFF1/D]

这里面的数字“2”是指将默认的hold check edge往前推2个时钟周期,即从原来的T=20ns时刻往前移到T=0ns时刻。

因此,在我们给设计写约束文件时(定义multicycle path时),需要同时定义如下命令:

set_multicycle_path  N  -setup  -from [get_pins  UFF0/Q]  -to  [get_pins UFF1/D]

set_multicycle_path  N-1  -hold -end  -from [get_pins  UFF0/Q]  -to  [get_pins UFF1/D]

如果只定义了-setup 3 而没有定义-hold时,工具hold check时, 默认的 clock edge为capture  edge(setup timing check时)前一个cycle的那个edge。

时序约束之 set_multicyle_path (1)

此图摘自ug903.

备注:-start选项对应launch clk edge的移动,-end选项对应capture clk edge的移动。在缺省的情况下,默认setup 对应 -end,hold对应 -start。