本文提纲
- 合理利用group对路径进行分组
- 合理选择compile选项
- 合理利用bounds和blockage
- 合理提树/推树
- 合理选择综合策略
- 单独综合小网表
1.合理利用group对路径进行分组
- 分组原则由顶层module开始,依次往下细分迭代,并根据结果调整-weight权重;
- -priority选项为了提取group的优先级,U_A/* -priority < U_A/U_B/* -priority,否则U_B分组失败;
- 优化力度是由wns和weight叠加决定,和priority参数无关,因此遇到很大的wns路径先要清除,前期迭代可通过放宽约束(比如静态信号)或者修改RTL等方法清除,不然对优化效果影响很大;
- 分组语法要注意,找object时不能使用get命令-filter选项带有hier的语法,否则会添加size_only属性导致时序优化无效;
2.合理选择compile选项
- 添加各类优化选项,优化力度可根据具体情况进行配置;
- compile_ultra命令会默认修改综合策略的变量,比如hdlin_infer_mux等等变量,以达到极致的优化效果;
- -spg选项或默认修改综合策略的变量,细节暂未准确的分析;
- 尽量不使用ungroup -flatten的方式,会导致后仿和ECO复杂化,比较大型的项目一般都会有ECO follow,同时也会增加后仿定位难度;
- 一般是使用两轮的编译,如果时间允许可以使用多轮的编译;
3.合理利用bounds和blockage
- DCG阶段会load 不完整的物理约束文件,此时的物理约束仅描述了floorplan的信息,主要是floorplan的面积信息,端口摆放的位置和方向,hardmacro的摆放位置和方向的信息以及power等基本信息,不具备std cell的位置信息,一般是def文件,为了在综合阶段提前发现后端实现过程中有可能遇到的时序和拥塞问题;
- bounds和blockage都包括soft和hard两种类型,因此添加的时候可以尝试不同的方式,此外bounds和blockage都需要清楚大概的数据流才可以操作,目的是为了引导工具把std cell摆放在合理的位置区域;
- 特别用来走线的打拍寄存器,一般都需要用bounds才可以让其在理想的位置;
4.合理提树/推树
- 使用capture clk 推树来解决setup的问题,对capture clk进行提树解决hold问题;
- launch clk同理,推树解决hold,提树解决setup;
- 需要检查前后级的时序余量,以免导致后端实现时遇到互相setup/hold互相打架,无法收敛的问题;
5.合理选择综合策略
修改综合策略,比如mux的综合类型,multibit reg的merge等方法;
6.单独综合小网表
- 对于某个模块的timing总是很难收敛时,可以针对性的对这个module进行单独的综合,然后基于这个综合的网表替换rtl放在design进行重新综合,读取网表时有对应的命令-netlist;
- 可进行增量编译,从而优化loading进来的网表;