利用PT修复timing

动作捕捉 2023-05-08 16059

在PT中修复timing主要分为手动修复和基于DMSA自动修复两种情况。一般而言,对于一个小芯片而言,violation path在100条左右的可以选择手动修复。对于大芯片而言,violation path可能有几百万条,手动修复不现实,因为利用DMSA自动修复更为靠谱。接下来分别记录一下手动修复以及DMSA修复的主要步骤。

1.手动修复timing violation

之前一个项目遇到一个情况:前端人员对于某些output ports有特殊的时序要求。例如,同一个group里面的port需要满足2点:1.input port TR1到所有的output ports的skew小于2ns。2.同一个group内的reg-to-output的skew小于2ns。

利用PT修复timing  第1张

这种情况,在PR阶段ICC2是无法去满足这样的timing要求的,只能自己手动去修复。因此,在PT里面选择wc_cworst这个最差的corner进行修复timing。主要步骤如下所示:

1.将同一个group内所有port的fanin抓出来,命令如下所示:

set fanin_pins [all_fanin -to $port -flat -startpoint_only]

上面命令的作用是抓出所有终点是$port的timing path的starpoint,这里既有input port TR1,又有register的Q端。因此,需要进一步区分fanin。

2.抓出所有input port到output port的timing path以及所有regiter到output port的timing path,命令如下所示:

#input port到output port的path都是被clk约束

set path [get_timing_path -through $fanin_pins -through $port -from [get_clocks clk]]

#register的Q端到output port的path都是被vclk约束

set path [get_timing_path -through $fanin_pins -through $port -from [get_clocks vclk]]

3.比较同一组下面所有timing path的delay,并算出最大值和最小值。命令如下所示:

set path_delay [get_attribute $path arrvial]

puts arrival time is $path_delay

puts startpoint is $fanin_pins,endpoint is $port

if {$path_delay < $min_delay} {

set min_delay $path_delay

}

if {$path_delay > $max_delay} {

set max_delay $path_delay

}

4.这样所有timing path的arrival time、startpoint和endpoint都被记录下来。从里面找出最大delay的路径,对其中的一些小尺寸stdcell进行size,就可以降低该路径的delay。对于最小delay的路径,插入一些buffer就可以增加该路径的delay。相应的命令如下所示:

#add buffer 

add_buffer_on_route [get_nets -of_object [get_ports $port]] BUFD2BWP7T -cell_prefix XXX

-repeater_distance_length_ratio 0.55

#size stdcell

size_cell top_xxx/xxx/xxx/U2 INVD2BWP7T

legalize_placement -incremental

route_zrt_eco -utilize_dangling_wires true -reroute any_nets

route_zrt_detail -incremental true

其中,第一条命令表示,在所抓出的net上插入一个BUFD2BWP7T的stdcell,插入的位置在nets的55%长度附近。第二条命令表示,将选中的stdcell进行size。后面的三条命令是将stdcell合法化并重新绕线以及修复DRC问题。

手动修复timing的主要步骤就是这些,下面是抓取timing path的脚本,仅供参考。

利用PT修复timing  第2张


2.利用DMSA修复timing

1.概念介绍

还有一种情况更为普遍,对于一个大芯片而言。在PT里面可能会有上百万条timing violation,这时候利用工具自动修复更为方便。DMSA是distribute-multi-scenario-analysis,是PT修复timing的主要手段。

通常,在ICC2里面setup是没有问题的或者说只有很小的violation。但是ICC2和PT对于timing的计算方法不一样,可能导致在ICC里面没有hold violation,却在PT里面有很多hold violation。PT一般主要用于修复hold violation,对于很大的setup violation而言,PT所能做的非常有限。在修复hold violation之前,一般先修一轮DRC以及power。在修完power之后,很有可能hold violation就很少很多。这是因为,修power的时候会导致setup情况变差,hold情况变好。因为,修power的主要手段就是将非关键路径上的LVT stdcell替换成HVT cell,或者size非关键路径上的stdcell。不管是什么手段,都会导致hold timing变好,setup timing变差。

2.DMSA的主要流程:

1.读入starRC所用到的所有lef文件,包括stdcell的lef、IP的lef以及tech.lef文件。还有ICC2生成的def文件。

2.读入PT生成的各个scenario下的session文件。

3.修复power以及DRC,主要命令如下:

current_scenario session_wc_cworst_t

fix_eco_drc -type max_transition -physical_mode open_site -buffer_list {BUFD1 BUFD2 BUFD3 BUFD4} \

-hold_margin 0.1

fix_eco_drc -type max_transition -physical_mode occupied_site -buffer_list {BUFD1 BUFD2 BUFD3 BUFD4} \

-hold_margin 0.1

write_changes -format icctcl -output after_transition_fix.tcl

fix_eco_power -setup_margin 0.3 -power_mode total -method size_cell -leakage_scenario session_wc_cworst_t \

-dynamic_scenario session_wc_cworst_t

fix_eco_power -setup_margin 0.3 -power_mode total -method size_cell -leakage_scenario session_wc_cworst_t \

-dynamic_scenario session_wc_cworst_t

write_changes -format icctcl -output after_power_fix.tcl

其中修复DRC的命令的-physical_mode有两种模式,第一种是open_site表示插入的buffer只能在没有放stdcell的位置。第二种是occupiedsite表示插入的buffer可以放在空白位置,但是和其他的stdcell有重叠部分。之后通过legalizeplacement命令讲这些stdcell合法化就行。-hold_margin 0.1表示只对hold余量大于0.1的timing path进行优化。

其中修复power的命令的-power_mode有total、dynamic以及leakage。total表示同时对dynamic以及leakage进行优化。并分别指定各自的scenario是什么。-setup_margin 0.3表示只对setup余量大于0.3的timing path进行优化。

4.修复setup以及hold问题,命令如下:

current_scenario session_wc_cworst_t

fix_eco_timing -type setup -cell_type combinational -physical_mode open_site \

-buffer_list {BUFD1 BUFD2 BUFD3 BUFD4} -hold_margin 0.1

fix_eco_timing -type setup -cell_type combinational -physical_mode occupied_site \

-buffer_list {BUFD1 BUFD2 BUFD3 BUFD4} -hold_margin 0.1

write_changes -format icctcl -output after_setup_fix.tcl

current_scenario {session_bc_cbest session_ml_cbest session_lt_cbest session_wc_cworst}

fix_eco_timing -type hold -cell_type combinational -physical_mode open_site \

-buffer_list {BUFD1 BUFD2 BUFD3 BUFD4 ...} -setup_margin 0.3

fix_eco_timing -type hold -cell_type combinational -physical_mode occupied_site \

-buffer_list {BUFD1 BUFD2 BUFD3 BUFD4 ...} -setup_margin 0.3

write_changes -format icctcl -output after_hold_fix.tcl

以上就是在PT中利用DMSA修复power、DRC、setup以及hold的主要步骤。个人亲测,非常好用!

The End