关于近期项目中时序收敛暴露出来的问题,写了这篇文章。
起因是func mode下transition满足约束,scan mode下仍有不小的违例,且集中在输出端口上,对比sdc发现,输出端口的set_load约束不一致,scan sdc设置的偏大,导致PT fix_eco_drc时疯狂在端口上插buffer,却仍解决不了transition violation。需要合理设置set_load。
平时项目对面积要求比较严苛,能省则省,往往输入输出port附近就是sram,没有预留空间插IO buffer,也基本没插过,多是跟着约束走,没有违例就算过,这样会导致工具修transition时会跨过sram插buffer,密集且驱动往往不小。
可以在端口插驱动居中的buffer然后magnet_placement 去legalize并fixed。
add_buffer [get_ports] BUFX6 -new_cell_name IOBUF
magnet_placement -logical_levels 1 -mark_fixed [get_pots]
set_dont_touch [get_flat_nets -of [get_ports]] true
PT环境下,有时候修transition冒出来hold violation,修hold又冒出来transition violation,既不大也不多,但这样来来回回几轮属实让人火大,原因是一方面修transition修hold都要size cell,双方拉锯,另一方面fix_eco_timing时ignore_drc了,所以最后violation不多时修hold尽量用insert_buffer_at_load_pins的method,不用size_cell。
fix_eco_timing -pba_mode path -type hold -method {insert_buffer_at_load_pins} -buffer_list $list
route_opt阶段的transition violation可以使用report_constraints -all_violators -max_transition报告出来,抓出其中violation net的driver pin,使用set_route_opt_target_endpoints -ldrc_objects加route_opt去修,效果很好,setup和hold violation也许因为GBA和PBA的差异导致ICC2和PT的报告有些许出入,但是transition violation基本上差不多。
set_route_opt_target_endpoints用法