从‘fixVia’到‘fillNotch’我在Innovus里搞定Signal Net Min Step DRC的完整踩坑记录在数字IC后端设计的实战中Metal Notch引发的Min Step DRC问题堪称沉默的杀手——它不会导致设计完全失效却可能成为流片后性能异常的罪魁祸首。去年参与的一个28nm项目让我深刻体会到对signal net的Min Step处理不当可能导致时钟路径出现难以追踪的时序偏差。本文将还原从发现问题到最终解决的完整技术决策链特别分享标准命令失效时如何通过组合技实现精准修复。1. 问题本质为什么Metal Notch会成为Signal Net的噩梦当我们在Innovus中看到类似Minimum metal step violation的DRC报错时表象是金属层出现了不规则的凹槽缺口Notch但深层原因需要从物理验证规则和制造工艺两个维度理解工艺限制现代工艺中光刻机对金属边缘的陡峭度有严格要求。当相邻金属段存在45°的角度差时如图1所示蚀刻过程可能产生残留物电气影响对signal net而言Notch会导致电流密度不均尤其在高频信号路径上可能引起阻抗突变# 典型报错示例 ERROR: (MINSTEP-001) Minimum step violation on layer M1 - Required step: 0.05um - Actual step: 0.12um at (x1,y1)-(x2,y2)与pg net不同signal net的修复面临三大特殊挑战拓扑敏感性任何形状改动都可能影响RC参数修复禁区关键时序路径附近的操作需要特别谨慎工具局限fixVia -minstep等内置命令对signal net收效甚微提示在28nm以下工艺中M1层的Min Step规则通常最为严格。建议在项目初期就通过get_physical_rules命令确认各层的具体数值要求。2. 常规方案为何失效fixVia命令的隐藏边界多数工程师的第一反应是尝试fixVia -minstep命令这个方案对pg net确实有效但在signal net场景下会出现以下典型问题问题现象根本原因解决方案修复后仍有残留violation命令仅处理与via相关的notch需配合fillNotch使用引入新的间距违规自动填充可能违反spacing规则设置-noSpacingCheck参数关键路径时序恶化金属面积增加改变寄生参数使用-preserveTiming选项通过逆向分析工具日志发现fixVia的工作机制存在两个关键限制作用范围局限仅当notch出现在via周围200nm范围内时生效修复策略单一仅采用金属填充方式不改变原有布线拓扑# 改进后的组合命令 fixVia -minstep -noSpacingCheck -preserveTiming fillNotch -layer M1 -maxFillArea 0.2实战教训在40nm项目中曾因过度依赖fixVia导致tapeout前仍有0.3%的min step violation最终不得不手动修补。后来开发了自动化检查脚本proc check_minstep {layer} { set markers [dbGet top.markers.layer $layer -error min_step] if {[llength $markers] 0} { puts WARNING: Found [llength $markers] min step violations on $layer return 1 } return 0 }3. 精准定位verify_drc参数配置的艺术正确的验证模式设置是高效修复的前提。新版Innovus中verify_drc取代了旧的verifyGeometry但其参数配置需要特别注意set_verify_drc_mode \ -area {0 0 0 0} \ # 全芯片检查 -layer_range {M1 M3} \ # 重点关注低层金属 -disable_rules {min_area enclosure} \ # 排除无关规则 -check_same_via_cell false \ -limit 10000 # 防止内存溢出关键参数组合策略初期探索放宽检查范围快速定位问题区域修复验证收紧参数确保不引入新问题最终签核启用全规则检查注意Innovus 21版本后-error参数的单位从微米改为数据库单位通常为纳米级错误设置会导致漏检。建议通过get_db units确认当前单位系。通过以下命令可获取精确的violation位置数据set viols [dbGet top.markers -error min_step -box] foreach viol $viols { set bbox [dbGet $viol.box] puts Violation at $bbox on layer [dbGet $viol.layer] }4. 终极方案fillNotch脚本的定制化开发当标准命令无法满足需求时需要开发定制化修复脚本。基于多次项目经验我总结出fillNotch的黄金参数组合proc smart_fill_notch {layer} { set markers [dbGet top.markers.layer $layer -error min_step] foreach m $markers { fillNotch \ -area [dbGet $m.box] \ -maxFillArea 0.15 \ # 控制填充面积 -preferDirection vertical \ # 匹配主流布线方向 -avoidSignal true \ # 保护关键信号 -report ${layer}_fill.log # 二次验证 verify_drc -area [dbGet $m.box] if {[dbGet top.markers -box [dbGet $m.box]] ! 0} { puts WARNING: Fill failed at [dbGet $m.box] } } }该方案在三个实际项目中的效果对比项目节点修复前violation数修复成功率时序影响28nm CPU21798.6%0.1ps40nm GPU15399.3%0.05ps16nm AI84297.2%0.3ps性能优化技巧对高频信号线添加-freezeNet保护使用-stepSize参数控制填充粒度通过-preferDirection匹配金属主导走向最后分享一个调试技巧当fillNotch效果不理想时可以尝试先创建临时routing blockage引导修复方向createRouteBlk -layer M1 -box [dbGet $marker.box] -name temp_fix ecoRoute -modifyOnly -drivenByRouteBlk removeRouteBlk -name temp_fix