时序检查的最基本的两个指标:setup和hold check. 一旦一个时钟加在FF的时钟断,setup和hold check就会自动加在该FF的时序检查中。其中worst_case
对应setup check.其中best_case对应hold check。
setup timing check 检查max constraint, Tlaunch + Tck2q + Tdp < Tcapture +Tcycle - Tsetup.
Tlaunch和Tcapture分别是clock tree到launch FF和capture FF时钟端的延时。其中左侧也称为data arriving time,右侧称为data requiring time.
当data requiring time - data arrving time为正时,slack为正,否则setup violated。
所有的Path Group按时钟clock来进行分组。
在时序报告中,还会有clock uncertainty和clock network delay两项参数。分别由clock source的jitter和network的propagated产生。
SDC定义:create_clock -name CLKM -period 10 -waveform {0 5} [get_ports CLKM]
set_clock_uncertainty -setup 0.3 [all_clocks] (参数由lib决定)
set_clock_transition -rise 0.2 [all_clocks]
set_clock_transition -fall 0.15 [all_clocks]
1)clock latency可以分为两类:clock source latency也叫做insertion delay,propagated delay from clock source to clock definition point.
clock network delay,propagated from clock definition point to FF clock.
其中clock network latency用来在CTS之前的clock path 建模。一旦CTS完成,clock network latency会被忽略。
SDC命令:set_clock_latency (-source) -rise 0.7 [get_clocks CLKM]
set_clock_latency (-source) -fall 0.65 [get_clocks CLKM]
2)Input to FF Path。
因为input的关系,时序报告中会有一个input external delay, 这个input delay可以挂接在virtual clock或real clock中,
create_clock -name VIRTUAL_CLKM -period -waveform {0 5} set_input_delay -clock VIRTUAL_CLKM -max 2.55 [get_ports INA]
2.55可以通过指定input port的driving cell,然后根据input transaction和output capacitance来确定。
set_driving_cell -lib_cell BUFF -library lib013lwc [get_ports INA]。
set_input_transition -rise 0.3 [get_ports CLKM]
set_input_transition -fall 0.45 [get_ports CLKM]
set_input_delay -clock VIRTUAL_CLKM -max 3.6 [get_ports INB]
该input delay加在data arriving time一端。
3)FF to output path
因为output的关系,时序报告中会有一个output external delay, 这个output delay可以挂接在virtual clock或real clock中,
set_output_delay -clock VIRTUAL_CLKP -max 5.1 [get_ports ROUT] set_load 0.02 [get_ports ROUT],set_load表示额外的load。
注意这个output external delay是加在data requiring time一侧的。
频率直方图(Frequency Histogram):对于一个optimized design来说,zero slack line会尽可能的靠近左,也就是说,slack多数为正。
还有一个指标是直方图的拱顶,代表最多数的slack水平,如果越靠近左,timing越是严峻。
Hold Timing Check:保证一个正在改变输出的FF不会覆盖掉该FF的当前值,在capture FF还未收到该值时。
检查同一个时钟active edge下,launch FF到capture FF的时间。所以hold check与时钟周期无关。
检查max constraint, Tlaunch + Tck2q + Tdp < Tcapture +Thold. 即在不考虑时钟延时问题时,路径延时大于hold时间。好让寄存器中
的锁存器无法在当前时钟锁存该值,而等到下一时钟。
左侧同样是data arrving time,右侧是data requiring time。data requiring time - data arrving time为负时,slack为负,此时
hold check满足,否则hold check violated。
当launch FF和capture FF不是一个时钟源时,如果Capture FF的clock edge在launch FF clock之前,则时钟对于hold
check来说,是正余量。
当launch FF和capture FF是一个时钟源时,Capture FF的clock edge一般在launch clock之后,此时,时钟是负余量。
setup violation只能引起操作频率的下降,但是hold violation会毁掉一个design.因为本该下一时钟到达Capture FF的数据,却在当前
时钟到达Capture FF,时序关系乱了,而且建立时间也得不到保证。
1)Input to FF Path.
用来设置input external delay
约束为min,set_input_delay -clock VIRTUAL_CLKM -min 1.1 [get_ports INA]
该input delay加在data arriving time一端。
2)Ouput to FF Path.
用来设置output external delay
约束为max,set_output_delay -clock VIRTUAL_CLKP -min 2.5 [get_ports ROUT]
注意这个output external delay是加在data requiring time一侧的。但是为负。即这也应该是一个正余量。