set_multicycle_path的常用场景及命令速记:
1、相同时钟或相同周期同步时钟
set_multicycle_path N -setup -from CLK1 -to CLK2
set_multicycle_path N-1 -hold -from CLK1 -to CLK2
2、同步分频时钟,快采慢
set_multicycle_path N -setup -start -from CLK1 -to CLK2
set_multicycle_path N-1 -hold (-start)-from CLK1 -to CLK2
3、同步分频时钟,慢采快
set_multicycle_path N -setup (-end)-from CLK1 -to CLK2
set_multicycle_path N-1 -hold -end -from CLK1 -to CLK2
在波形分析中,-start移动default launch edge(setup向左,hold向右),-end移动default capture edge(setup向右,hold向左)。
在STA分析中一些data path长度超过一个时钟周期时,我们可以针对这条path使用multicycle path,改变捕获数据的周期数。
如下示例,setup check时发现UFF0/Q到UFF1/D的data path长度差不多三个时钟周期(如图1),设置multicycle path将每个时钟周期采集一次数据(Default capture)改为每三个周期采集一次数据(New capture edge)。
create_clock - name CLKM - period 10 [ get_ports CLKM]set_multicycle_path 3 - setup - from [ get_pins UFF0/Q] - to [ get_pins UFF1/D]

图1
- Startpoint: UFF0 (rising edge-triggered flip-flop clocked by CLKM)
- Endpoint: UFF1 (rising edge-triggered flip-flop clocked by CLKM)
- Path Group: CLKM
- Path Type: max
- SCENARIO:FUNC_SLOW_CMAX-40
- Point Incr Path
- ---------------------------------------------------------------
- clock CLKM (rise edge) 0.00 0.00
- clock network delay (propagated) 0.11 0.11
- UFF0/CK (DFF ) 0.00 0.11 r
- UFF0/Q (DFF ) <- 0.14 0.26 f
- UNOR0/ZN (NR2 ) 0.04 0.30 r
- UBUF4/Z (BUFF ) 0.05 0.35 r
- ... (...) 28.00 28.00
- UFF1/D (DFF ) 0.00 28.35 r
- data arrival time 28.35
- clock CLKM (rise edge) 30.00 30.00
- clock network delay (propagated) 0.12 30.12
- clock uncertainty -0.30 29.82
- UFF1/CK (DFF ) 29.82 r
- library setup time -0.04 29.78
- data required time 29.78
- ---------------------------------------------------------------
- data required time 29.78
- data arrival time -28.35
- ---------------------------------------------------------------
- slack (MET) 1.43
此时hold check沿默认在setup capture edge的前一个有效沿(这里是上升沿触发),但是这样hold check就无法met,所以还需要给hold check设置一个set_multicycle_path。让UFF1/CK的hold check提前两个周期(如图2)。
set_multicycle_path 2 -hold -from [get_pins UFF0/Q] -to [get_pins UFF1/D]

图2
- Startpoint: UFF0 (rising edge-triggered flip-flop clocked by CLKM)
- Endpoint: UFF1 (rising edge-triggered flip-flop clocked by CLKM)
- Path Group: CLKM
- Path Type: min
- SCENARIO:FUNC_FAST_CMIN125
- Point Incr Path
- ---------------------------------------------------------------
- clock CLKM (rise edge) 0.00 0.00
- clock source latency 0.00 0.00
- CLKM (in) 0.00 0.00 r
- UCKBUF0/C (CKB ) 0.03 0.03 r
- UCKBUF1/C (CKB ) 0.03 0.06 r
- UFF0/CK (DFF ) 0.00 0.06 r
- UFF0/Q (DFF ) <- 0.07 0.13 r
- UNOR0/ZN (NR2 ) 0.01 0.14 f
- UBUF4/Z (BUFF ) 0.03 0.17 f
- ... (...) 14.00 14.00
- UFF1/D (DFF ) 0.00 14.17 f
- data arrival time 14.17
- clock CLKM (rise edge) 0.00 0.00
- clock source latency 0.00 0.00
- CLKM (in) 0.00 0.00 r
- UCKBUF0/C (CKB ) 0.03 0.03 r
- UCKBUF2/C (CKB ) 0.03 0.06 r
- UFF1/CK (DFF ) 0.00 0.06 r
- clock uncertainty 0.02 0.08
- library hold time 0.01 0.09
- data required time 0.09
- ---------------------------------------------------------------
- data required time 0.09
- data arrival time -14.17
- ---------------------------------------------------------------
- slack (VIOLATED) 14.08
总结来说,大多数设计中让setup check延迟到第N个周期采集数据,那么就需要让hold check提前N-1个周期,回到与launch edge同沿检查。(正常同步时钟setup check N=1,即capture edge在launch edge的下一个时钟周期有效沿,N-1=0,即hold check与launch edge同沿检查。)
还是上面的例子,如果只是让setup check延迟两个周期(N=3),不让hold check提前(N-1=2)两个周期会怎样?(如图3)hold check在setup check capture edge的前一个上升沿。hold check无法met。

图3
- Startpoint: UFF0 (rising edge-triggered flip-flop clocked by CLKM)
- Endpoint: UFF1 (rising edge-triggered flip-flop clocked by CLKM)
- Path Group: CLKM
- Path Type: min
- SCENARIO:FUNC_FAST_CMIN125
- Point Incr Path
- ---------------------------------------------------------------
- clock CLKM (rise edge) 0.00 0.00
- clock source latency 0.00 0.00
- CLKM (in) 0.00 0.00 r
- UCKBUF0/C (CKB ) 0.03 0.03 r
- UCKBUF1/C (CKB ) 0.03 0.06 r
- UFF0/CK (DFF ) 0.00 0.06 r
- UFF0/Q (DFF ) <- 0.07 0.13 r
- UNOR0/ZN (NR2 ) 0.01 0.14 f
- UBUF4/Z (BUFF ) 0.03 0.17 f
- ... (...) 14.00 14.00
- UFF1/D (DFF ) 0.00 14.17 f
- data arrival time 14.17
- clock CLKM (rise edge) 0.00 20.00
- clock source latency 0.00 20.00
- CLKM (in) 0.00 20.00 r
- UCKBUF0/C (CKB ) 0.03 20.03 r
- UCKBUF2/C (CKB ) 0.03 20.06 r
- UFF1/CK (DFF ) 0.00 20.06 r
- clock uncertainty 0.02 20.08
- library hold time 0.01 20.09
- data required time 20.09
- ---------------------------------------------------------------
- data required time 20.09
- data arrival time -14.17
- ---------------------------------------------------------------
- slack (VIOLATED) -5.92
data path从低速时钟到高速时钟,clock 定义如下示例, 默认的launch与capture edge如图5 。
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]

图5
假设data path长度超过三个CLKP的周期,此时setup check过与紧张,设置muticycle path让capture edge向前三个周期。如图6 。
set_multicycle_path 4 - setup \- from [ get_clocks CLKM] - to [ get_clocks CLKP] -end

图6
此时hold check过与紧张,需要将hold check退回到launch edge位置。如图7。
set_multicycle_path 3 - hold \- from [ get_clocks CLKM] - to [ get_clocks CLKP] - end

图7
data path从告诉时钟到低速时钟,clock定义示例如下,默认的setup、hold check如图8 。
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]

图8
setup check有四种情况,setup1、setup2、setup3和setup4,其中时序最紧的是setup4,对应setup check的四种launch edge,hold check 也有四种情况,最紧的是launch和capture clock都在20ns时刻,相当于0ns的时刻。
如上示例假设data path长度超过1个CLKP的时钟周期,那么就需要设置multicycle path让setup check的launch edge提前一个CLKP的时钟周期,如图9。
set_multicycle_path 2 - setup \- from [ get_clocks CLKP] - to [ get_clocks CLKM] - start

图9
此时对应hold check launch在15ns,capture clock在20ns,需要将hold check的launch edge延迟一个时钟周期,即launch clock和capture clock都在20ns处,相当于在0ns处进行hold check,如图10设置如下 。
set_multicycle_path 1 - hold \- from [ get_clocks CLKP] - to [ get_clocks CLKM] - start

图10