STA中multi_cycle与false_path的深入讨论:细节解析

前提概念:什么是数据路径?clk路径?require_time ? arrive_time?slack_time?不做赘述

1、为什么要对某些路径设置multi_cycles:

在某些情况下,两个触发器之间的数据路径可能需要一个以上的时钟周期才能传播通过逻辑。在这种情况下,这条组合逻辑路 径会被定义为多周期路径(multicycle path
)。虽然数据还是会在每个时钟沿上都被捕获触发器捕获,但我们需要告知
STA
在指定数量的时钟周期之后才会出现
有效
的捕获时钟沿。

数据路径最多需要三个时钟周期,因此应指定三个周期的多周期建立时间检查,多周期建立时间约束:

create_clock -name CLKM -period 10 [get_ports CLKM]

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

多周期路径上的保持时间检查。在最常见的情况下,我们希望保持时间检查保持不变(与单周期路径一 致),
这样可使数据在三个时钟周期之内任意进行改变。只有指定多周期保持时间为3-1=
2
,才可以获得与单周期建立时间检查情况相同的保持时间检查。这是因为在没有这样的多周期保持时间约束的情况下,默认的保持时间检查是在建立时间捕获沿的前一个有效时钟沿上执行的,这显然不是我们希望的。我们需要将执行保持时间检查的时钟沿移动到默认保持时间检查时钟沿之前的两个周期,因此指定了多周期保持时间为
2
。通过多周期保持时间约束,数据路径的最小延迟可以小于一个时钟周期:

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

假如不设置多周期保持时间约束:

在捕获沿之前的一个时钟沿对保持时间进行了检查(默认状态),这导致了较大的保持时间违例。实际上,该保持时间检查将要求组合逻辑中的最小延迟至少为两个时钟周期。

2、为什么要设置false_path?

当设计的功能运行时,某些时序路径可能不真实(或不可能)存在或者功能对其时序不在乎,在执行
STA
时可以将这些路径设置为伪路径(
false path),这样就可以关闭这些路径,那么
STA
就不会对这些伪路径去进行分析了。

伪路径可能是从一个时钟域到另一个时钟域、从触发器的时钟引脚到另一触发器的输入引脚、通过一个单元的引脚、通过多个单元的引脚或这些情况的组合 。当通过单元的引脚指定了伪路径后,通过该引脚的所有路径都将被忽略,无需进行时序分析。

辨别出伪路径的好处在于减少了分析空间,从而使分析可以专注于真实存在的路径,这同样有助于减少分析时间。但是,过多使用-through选项去指定伪路径同样会降低分析的速度。

set_false_path -from [get_clocks SCAN_CLK] -to [get_clocks CORE_CLK]

set_false_path -through [get_pins UMUX0/S]

set_false_path -through [get_pins SAD_CORE/RSTN]

set_false_path -to [get_ports TEST_REG*]

set_false_path -through UINV/Z -through UAND0/Z

要在两个时钟域之间设置伪路径,请使用:

set_false_path -from [get_clocks clockA] -to [get_clocks clockB]

而不要使用:

set_false_path -from [get_pins {regA_ * }/CK] -to [get_pins {regB_ * }/D]

后者这种方式要慢得多。

另一个建议是尽可能少使用
-through
选项,因为它增加了运行时不必要的复杂性。仅在绝对有必要且没有替代方法可以指定该伪路径的情况下,才可以使用-through
选项。

从优化的角度来看,还有一个建议是不要将一条多周期路径约束为伪路径。如果需要在已知或可预测的时刻对信号进行采样,则无论时间间隔多大,都应使用多周期路径约束,以使路径具有一定的约束条件并进行优化以满足多周期约束。如果把一条许多时钟周期后进行采样的路径指定为了伪路径,则对设计中其余逻辑路径的优化可能会使该路径变长,甚至超出所需的时间。

注意:建立时间检查和保持时间检查是针对同一工艺角(
corner
)。在最坏情况的慢速工艺角

下wc_corner,建立时间检查最难满足(裕量最小),而在最佳情况的快速工艺角下best_corner,保持时间检查最难满足(裕量最小)。一般pr后netlist,setup容易满足,即修干净,但是hold 不容易修的很干净,没有完全clean,所以在chip_TO前后,时间紧迫情况下,post_sim优先sim_bc_corner的sdf。

半周期:half_cycle

设计中同时具有负边沿触发的触发器和正边沿触发的触发器,则设计中可能存在半周期路径(half-cycle path
)。半周期路径可能是从一个触发器的上升沿到另一个触发器的下降沿,或者反过来。

这样会导致setup_check加严,只有半个周期,hold_check放松,放宽了半个周期。

所以在设计中可以采用负电平有效(即hold值,锁存值)的latch_up_cell来向下一级寄存器借一部分时间,来改善hlod的vialition。

应用场景:

例如:1、在串chain的过程中,由于option设置,两条不同clk的 chain的末端会存在跨时钟域的问题,如果两个clk_skew很大或者很小,导致Tdata会比Tclk_skew小,导致hold_via发生,下一级寄存器会拿到当拍的值,而不是上一拍的值。所以可以采用latch_up_cell的锁存特性来修复。前提是clk2的延迟不能太大,不能超过clk1的高电平时间范围,就可以用latch-up_cell修复。

2、ip-chain的集成过程中,会存在一条chain上有正负延寄存器,此时也需要用它来修复。

特殊路径:跨时钟域下的exception_path:分为多种情况优先

1、不同clk_domain ,但频率相同

create_clock -name CLKM -period 10 -waveform {0 5} [get_ports CLKM]

create_clock -name CLKP -period 10 -waveform {0 5} [get_ports CLKP]

set_multicycle_path 2 -from [get_pins UFF0/CK] -to [get_pins UFF3/D]

默认为
-setup
选项。以上约束指定多周期建立时间为
2
且多周期保持时间为
0(默认值),会有hold的违例,若要消除,则设置hold的multi_cycle:

set_multicycle_path 2 -from [get_pins UFF0/CK] -to [get_pins UFF3/D] -setup

set_multicycle_path 1 -from [get_pins UFF0/CK] -to [get_pins UFF3/D] -hold

2.从slow_clk 到fast_clk:

create_clock -name CLKM -period 20 -waveform {0 10} [get_ports CLKM]

create_clock -name CLKP -period 5 -waveform {0 2.5} [get_ports CLKP]

当数据发起触发器和捕获触发器的时钟频率不同时,
STA
会首先确定一个公共基本周期(
common base period)。

假设该设计的目的不是在
CLKP
的下一个有效沿上就捕获数据,而是在每第4
个捕获沿上捕获数据。该假设给触发器之间的组合逻辑路径提供了
4

CLKP
周期的时间,即
20ns

我们可以通过设置以下多周期路径约束来做到这一点:

set_multicycle_path 4 -setup -from [get_clocks CLKM] -to [get_clocks CLKP] -end

在大多数设计中,这不是理想的时序检查,应将保持时间检查一直移回到数据发起沿所在位置。因此,我们可以约束多周期保持时间为3

set_multicycle_path 3 -hold -from [get_clocks CLKM] -to [get_clocks CLKP] -end

-end
选项意味着我们想将终点(或捕获边沿)移回指定的周期数,即捕获时钟的周期

数。代替
-end
的另一种选项
-start
指定了要移动的发起时钟周期数,
-end
选项指定了要移动的捕获时钟周期数。
-end
是多周期建立时间约束的默认值,-start
是多周期保持时间约束的默认值。

所以对于慢速到快速时钟域之间 的路径,多周期路径约束的一个好经验是使用-end
选项。使用此选项,可以根
据快速时钟的时钟周期
来调整建立时间(往前走)和保持时间检检查(往后走)。

2、fast_clk到slow_clk:

create_clock -name CLKM -period 20 -waveform {0 10} [get_ports CLKM]

create_clock -name CLKP -period 5 -waveform {0 2.5} [get_ports CLKP]

setup_4是最严格的检查,通常,设计人员可以将从快时钟域到慢时钟域的数据路径指定为多周期路径。如果想要放宽建立时间检查,比如为数据路径提供两个快时钟周期,则此多周期路径约束如下:

set_multicycle_path 2 -setup -from [get_clocks CLKP] -to [get_clocks CLKM] -start

set_multicycle_path 1 -hold -from [get_clocks CLKP] -to [get_clocks CLKM] -start

约束多周期建立时间为2
会将发起沿移动到默认发起沿之前的一个时钟沿,即在
10ns
而不是

默认的
15ns
处。多周期保持时间约束确保了在
0ns
处发起沿发起的数据,不会被
0ns
处的捕获沿捕获到。

与从慢速时钟域到快速时钟域的路径不同,在从快速时钟域到慢速时钟域的路径中,多周期路径约束的一个好经验是使用
-start选项,然后再根据快速时钟调整建立时间和保持时间检查。

注意:建立时间检查和保持时间检查的示例报告是针对同一工艺角(
corner
)的。通常,在最坏情况的慢速工艺角下,建立时间检查最难满足(裕量最小),而在最佳情况的快速工艺角下,保持时间检查最难满足(裕量最小)。作者:DFT_bug_king

物联沃分享整理
物联沃-IOTWORD物联网 » STA中multi_cycle与false_path的深入讨论:细节解析

发表回复