ICC II 布线优化实战:从 route_auto 到 route_opt 的全流程解析
1. ICC II布线流程概述
在数字芯片设计流程中,布线(Routing)是将逻辑连接转化为物理连接的关键步骤。ICC II作为Synopsys推出的新一代物理实现工具,其布线引擎采用了全新的架构,相比传统工具在收敛性和运行效率上都有显著提升。我经历过多个28nm到7nm项目的实战,发现合理的布线策略能减少30%以上的后期迭代工作量。
布线阶段通常发生在布局(Placement)和时钟树综合(CTS)之后,此时设计应满足以下基本条件:
- 拥塞水平控制在5%以内
- 时序违例(setup/hold)在可接受范围
- 时钟网络已完成初步布线
- 逻辑DRC问题已基本解决
完整的布线流程包含三个核心阶段:
- 全局布线(Global Route):在虚拟网格上进行拓扑规划
- 走线分配(Track Assignment):确定金属层的实际走线轨迹
- 详细布线(Detail Route):完成最终物理连接并修复DRC
2. 布线前的关键准备
2.1 设计状态检查
在启动route_auto之前,必须执行全面的设计检查。我曾在一个项目中因忽略这项检查导致后期出现难以定位的pin access问题。推荐使用以下组合命令:
check_design -checks pre_route_stage check_routability -verbose重点检查项包括:
- 是否存在被阻挡的端口(blocked ports)
- 边界外引脚(out-of-boundary pins)
- 最小网格违规(minimum-grid violation)
- 引脚访问边缘规则(pin access edge rules)
2.2 次级电源网络处理
很多人会忽略次级电源引脚(Secondary PG pins)的布线,这可能导致后期电迁移问题。建议采用以下策略:
# 设置每个PG pin的最大连接数 set_app_options -name route.common.number_of_secondary_pg_pin_connections -value 4 # 应用非默认规则(NDR) create_routing_rule sec_pg_rule \ -width {M1 0.2 M2 0.2 M3 0.2} \ -vias {VIA12 VIA23} set_routing_rule [get_nets VDDH] -rule sec_pg_rule \ -min_routing_layer M2 -max_routing_layer M33. 核心布线阶段详解
3.1 全局布线实战技巧
全局布线(GR)并不产生实际金属连线,而是通过0宽度的"虚拟线"进行路径规划。在16nm以下工艺中,我发现这些技巧特别有用:
set_app_options -name route.global.timing_driven -value true set_app_options -name route.global.crosstalk_driven -value false关键注意事项:
- 使用
gui_start查看GR结果时,虚拟线显示为彩色细线 - 避免布线穿过电源网络区域(P/G nets)
- 通过routing guide控制特定区域的布线方向
3.2 走线分配优化
Track Assignment(TA)阶段会将虚拟线转化为实际走线。这个阶段对时序影响很大,建议:
set_app_options -list { route.track.timing_driven true route.track.crosstalk_driven true }常见问题处理:
- 长线分段:过长的走线会被自动分段,可通过
set_max_length约束控制 - 通孔优化:使用
optimize_routes命令减少通孔数量 - 串扰预防:相邻线网间距不足时,工具会自动插入shield net
3.3 详细布线进阶技巧
Detail Route(DR)是最后物理实现的阶段。在7nm项目中,这些设置帮我解决了90%的DRC问题:
route_detail -incremental true \ -max_number_iteration 60 \ -antenna true \ -hop_layers_to_fix_antenna true特殊场景处理:
- 天线效应修复:优先使用layer jumping而非二极管插入
- 冗余通孔:先进工艺建议采用reserve space模式
- 金属优化:设置
route.detail.optimize_wire_via_effort_level为high
4. 布线后优化全攻略
4.1 route_opt的黄金配置
route_opt是布线后的综合优化阶段,这个配置在多个项目中验证有效:
set_app_options -list { route_opt.flow.enable_ccd true route_opt.flow.enable_power true route_opt.flow.size_only_mode equal_or_smaller time.use_pt_delay true }优化策略选择:
- 时序优先:打开
timing_driven并设置high effort - 功耗敏感:启用power recovery模式
- 面积约束:使用size_only模式限制cell增大
4.2 时序收敛技巧
与PrimeTime的协同优化是ICC II的特色功能。建议采用以下流程:
- 首次route_opt:使用path-based优化
- 二次route_opt:关闭CCD,专注power优化
- 最终eco_opt:处理剩余违例
# 首次优化 set_app_options -name time.pba_optimization_mode -value path route_opt # 最终优化 set_app_options -list { route_opt.flow.enable_ccd false route_opt.flow.enable_power power } route_opt4.3 特殊结构处理
**通孔梯子(Via Ladder)**在先进工艺中越来越重要。性能敏感路径应该启用:
set_app_options -name opt.common.enable_via_ladder_insertion -value true insert_via_ladders -nets [get_nets -hsc *clk*]实施要点:
- EM型via ladder需要工艺文件支持
- 性能型via ladder在place_opt阶段就会考虑
- 可通过
report_via_ladders检查插入情况
5. 常见问题排查指南
5.1 违例诊断流程
当布线后仍存在违例时,建议按此顺序排查:
- 运行
check_routes检查物理DRC - 使用
report_timing -max_paths 100分析关键路径 - 检查
report_power确认功耗热点 - 通过
report_congestion查看剩余拥塞
5.2 典型问题解决方案
案例1:持续存在的max_transition违例
- 检查cell间距是否过大
- 尝试
set_max_fanout约束 - 考虑回到CTS阶段调整buffer位置
案例2:布线资源不足
- 检查routing blockage设置
- 调整
route.global.timing_driven_effort_level为medium - 考虑使用
route_eco进行局部优化
案例3:天线效应难以收敛
- 确认antenna rule文件是否正确加载
- 尝试
set_antenna_rule -mode strict - 对特殊net手动插入二极管
6. 实战经验分享
在最近的一个5nm项目中,我们发现route_opt的收敛效率与以下因素强相关:
- 电源网络完整性(IR drop影响时序)
- 时钟树质量(skew大于50ps时优化困难)
- 初始布局拥塞水平(超过10%将导致布线迭代激增)
一个实用的调试技巧是保存各阶段快照:
save_block -as ${design_name}_pre_route save_block -as ${design_name}_post_route save_block -as ${design_name}_post_opt当优化陷入僵局时,可以尝试回退到前一阶段,调整约束条件后重新优化。记住,布线是个迭代过程,很少能一次达到完美结果。
