时序约束之 set_multicyle_path (1)
在launch clk和capture clk在同一时钟域的情况下。下图摘自ug903.
默认情况下,setup和hold的关系如下:
设定约束:(使得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的要求。
因此,我们需要像单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。
此图摘自ug903.
备注:-start选项对应launch clk edge的移动,-end选项对应capture clk edge的移动。在缺省的情况下,默认setup 对应 -end,hold对应 -start。