资讯动态

Innovus DRC修复实战:从Metal Short到天线效应及时序收敛

发布时间:2026/9/28 15:53:43 来源:尧图企业网站定制
做数字后端的人应该都有过这种经历floorplan、placement、CTS、routing一路跑下来以为可以稍微喘口气结果打开Innovus的DRC summary一看几万条violation挂在眼前其中“最扎眼”的往往就是Metal Short和Antenna。这两个名字听起来不复杂背后牵扯的东西却一点都不简单——Metal Short可能只是绕线拥挤也可能意味着某个区域的需求和供给完全不匹配天线效应更是直接连着工艺可靠性处理不好流片回来可能就是一批废片。这篇文章我想从自己在Innovus环境里处理DRC的实际经验出发拆解五个反复遇到的典型场景同层Metal Short、跨层Metal Short、天线效应、DRC partial route conflictsRTSTAT-6以及DRC修复后的时序收敛。每个场景都会讲定位思路、修复步骤和踩过的坑希望能给正在跟DRC死磕的朋友一些参考。1. Metal Short先分清同层和跨层再决定修复策略1.1 DRC报告里怎么快速找到Metal Short在Innovus里跑完route之后通常第一件事是查看DRC汇总。我的习惯是用reportQoR -qor_type drc或者直接打开生成的drc.rpt文件按violation type过滤。Metal Short在报告里通常以类似METAL3.1或者short的关键字出现紧跟着的坐标和layer信息很关键。比如METAL3.1 : 200 100 (METAL3/METAL4)这行信息说明在坐标(200,100)附近M3和M4之间存在short。有了坐标在Innovus GUI里用locate定位过去或者直接在GUI的DRC Browser里双击这条violation工具会自动高亮出冲突区域。这里有个经验如果报告里short数量非常多某个坐标处密密麻麻一片不用急着逐条修先看这个区域是不是congestion非常严重。如果确实是因为局部绕线资源不够修几条short的效果不大真正要解决的是绕线拥堵。1.2 真假Short的判断一样是short处理和结果完全不同定位到short之后第一件事不是删线而是判断这个“short”是真短还是假短。我在实际项目中遇到过好多次这样的情况GUI里清清楚楚高亮了两根靠在一起的线报告也标了short结果一查net属性两根线属于同一个net。同一个net的金属shape连在一起这叫正常的metal merge根本不是DRC violation。这种情况多半是ECO之后工具把同一net的segment切成了好几截中间本应有via连接的地方因为某种原因没有连上DRC工具为了强调“这里不连续”而报了short或open实际上属于connectivity问题不是几何问题。判断方法很简单在选中violation后查看高亮shape对应的net名两个shape所属net不同 → 真短路进入修复流程两个shape所属net相同 → connectivity或label问题检查是否需要补via或改连接如果属于同一net但没有连上通常用ecoRoute -fix_drc true重新走一下就能解决。如果是真短路就得再往下看是同层短路还是跨层短路修复方式差别很大。1.3 同层Metal Short的修复流程与注意事项真短路的修复我的标准流程是先尝试自动修复setNanoRouteMode -routeEcoOnly true ecoRoute -fix_drc true自动修复之后复查DRC报告把剩下的violation按坐标排序。剩下的手动修复用editDelete删除造成short的错误segment再用ecoRoute让工具重新绕这段net。具体的操作会用editSelect -net xxx选中net然后用editDelete -route把这一小段route删掉再调用ecoRoute重新连接。这里有几个容易踩的坑不要一次删掉整条net的route只删除short附近的那个segment否则工具重绕时可能引入新的short或时序问题。手动删除之后一定要立刻接ecoRoute不要留着悬空线头过夜。如果同层short集中在某个区域的几根net之间频繁发生要考虑是不是该区域的routing direction或者pin density设置不合理。单纯修线没有意义改完还会冒出来。1.4 同层Short背后的根因绕线密度与Pin Assignment说到根因我印象最深的是一个案例某个模块内部的M2 short反复出现修复一次冒一次。后来我把该区域所有layer的routing density打开一看M2的使用率已经超过95%接近饱和。这种状态下工具在M2上只有极少的空间绕线short几乎是不可避免的。这种情况下正确的做法不是修short而是调整层次分配例如把部分M2上的走线引导到M3或M4使用setNanoRouteMode -drouteUseMultiCutViaEffort high等方式优化via配置释放一部分M2空间在严重区域添加routing blockage迫使工具换层绕线修复完这些根因之后再重新跑routeshort问题基本可以消失一大半。这算是“抓住根本少做无用功”的典型例子。2. 跨层Metal ShortM3/M4穿层短路与浮空金属的坑2.1 跨层Short为什么比同层麻烦跨层short顾名思义是不同金属层之间的短路。在Innovus的DRC报告中它通常明确写出两个layer的名字比如METAL3/METAL4。这种情况比同层short更麻烦一点因为如果你只看某一层的shape根本看不出问题必须把两层同时打开检查。跨层short的典型成因有两种一是多余via导致的层间桥接二是两个不同层上的shape重叠而重叠的区域刚好不在via的合法位置却构成了电气上的连接。处理前先在GUI中把相关的两层颜色区分开比如M3用蓝色、M4用红色然后放大violation区域观察重叠的具体形状。如果看到一个本不该存在的via那就属于第一种情况如果看到两段shape直接叠在一起属于第二种。2.2 修复跨层Short的两条路线对比对应两种成因修复路线也不同多余via导致的short操作比较简单用editDelete删除这颗多余的via然后用ecoRoute -fix_drc true检查一下周围net是否受影响。shape直接重叠导致的short要看重叠区域是不是某根net的必经路径。如果只是局部误绕删除错误shape后重绕即可如果这个区域本身就很难绕开就需要动用routing blockage。我常用的blockage命令createRouteBlk -box {x1 y1 x2 y2} -layer METAL3 -type routing这条命令会在指定区域挡住M3的绕线工具在M3上无法穿过该区域自然会选择其他层绕行。用完后记得在合适的时候删除不然可能影响后续修复deleteRouteBlk -box {x1 y1 x2 y2} -layer METAL32.3 浮空金属的问题看起来像Short实际上是残留跨层short还有一种很迷惑人的情况某一段metal属于floating metal也就是没有任何net连接的金属残留。这种shape在ECO过程中经常出现——原来的route被工具自动清理掉一部分但有些segment因为连接关系复杂被工具漏掉了变成了“孤儿”金属。孤儿金属如果恰好和旁边net的shape有重叠DRC就会报出跨层short。肉眼看去就是两根线贴在一起但如果你按照真short的流程去删线、重绕不但没用还可能在下一轮route中被工具重新“捡回来”。处理这类问题的思路是找到floating metal并清理。我一般用以下方式dbGet [dbGet -p top.rects.layer METAL3 -if {.net.name }]如果查出来确实有net名为空的shape优先删除这些残留shape。删除后重新跑DRC通常那些看似无解的short会消失一大半。这条经验在处理ECO后的DRC时特别实用。另外也别忽略dummy金属——有些DRC报告中的short其实是dummy fill与信号线靠得太近导致的spacing violation误报这种情况需要在signoff前加dummy时统一处理而不是在修short阶段一个个去删。3. 天线效应DRC与其修线不如修电荷路径3.1 天线效应为什么是“工艺相关”而非“几何相关”的DRC天线效应Antenna Effect也叫Process Antenna Effect和普通的几何DRC最大的区别在于它不是两个shape之间靠得太近或叠在一起的问题而是一个net的金属面积与它连接的栅极面积之比是否超过工艺限值的问题。在芯片制造过程中金属层通过等离子体刻蚀成型。等离子体会在金属上积累电荷如果这些电荷经过金属层传导到栅氧化层且积累量足够大就可能击穿栅氧化层导致晶体管失效。所以DRC规则对金属面积和栅极面积的比例有明确限制超过就报告Antenna violation。天线效应的严重程度和金属层数、面积、走线长度都有关系。很多时候一根看似正常的走线因为经过了很长的M2段再跳去M4中间每层的面积累加起来天线比就超标了。3.2 为什么AutoFix之后还会剩天线效应Innovus的NanoRoute阶段有自动修复天线效应的选项通常我会在route前打开setNanoRouteMode -drouteFixAntenna true工具会在绕线过程中自动优化走线尽量减少天线效应。但大多数项目跑完route之后仍然会残留一批Antenna violation。原因很简单自动修复只能在绕线自由度允许的范围内调整如果某些net的扇出太大、关键路径的层次选择受限或者模块本身的布线空间紧张工具就没有足够的空间通过跳层来消除天线效应。这时候就需要手动介入。手动修复天线效应思路和修short完全不同不是“哪儿错了改哪儿”而是“给电荷一个出口或者减小收集面积”。3.3 三种手动修复天线效应的方案对比我把常用的三种方案整理成了一张表方便对照修复方案原理适用场景注意事项跳层修复将长金属分段减少单层上连续金属面积绕线空间比较充裕的区域可能会增加via数量影响时序插入天线二极管在net靠近gate的位置加泄放路径高扇出net、时钟网络增加栅极电容需要重新检查时序减小金属面积缩短走线、换更窄的线宽布局后期阶段可能影响IR drop和EM实际操作中我最常用的是跳层和插二极管。跳层的操作很直接选中violation对应的net用editAddRoute在合适的位置嵌入一层高层金属。比如M2上走线太长导致天线比超标可以在中间打一个via跳到M4再到另一端跳回来。插二极管则用Innovus的专用命令addAntennaDiode -net netName -cell ANTENNA_CELL -prefix ANT_ECOANTENNA_CELL需要从工艺库中选择带有天线二极管功能的单元。执行之后工具会自动在net上合适的位置插入二极管单元并连接到对应的电源地给积累电荷提供一条泄放路径。3.4 一个高扇出时钟网络的天线效应修复实战有一次我处理过一个很典型的天线效应案例一个高扇出的时钟缓冲器输出net在M2层走了很长一段然后扇出到几十个flip-flop。跑完route后这个net上报了几十条Antenna violation。我先用ecoRoute -fixAntenna true尝试自动修复结果工具只是把部分M2段换到了M3和M4violation数量从40多条降到15条没有完全干净。原因很简单这个net的扇出太大跳层只能解决一部分面积问题仍然超阈值。于是改用插入天线二极管的方式。我从库里选了一个带天线保护的标准单元用addAntennaDiode在这个net靠近buffer输出的位置插入两个二极管。重新跑DRC后这15条violation全部清零。踩坑提醒插入antenna diode之后一定要重新跑时序尤其是时钟网络的skew和transition检查。二极管增加的栅极电容可能让本来刚满足transition的clock path直接违规。我在这次修复中就遇到了clock transition从0.08ns恶化到0.12ns的情况最后通过调整buffer位置和尺寸才平衡回来。4. Partial Route Conflicts批量修复RTSTAT-6的实地经验4.1 RTSTAT-6是什么绕线数据库里的“账目不清”在Innovus的DRC报告末尾常常能看到一段类似这样的汇总[DRC RTSTAT-6] Partial Route Conflicts: 1184 net(s) have a partial conflict.第一次看到这个报告的人可能会慌以为是上千处short。实际上partial route conflicts不是几何DRC violation而是绕线数据库内部的一种状态某些net的route segments并没有形成完整的、无冲突的连接存在悬空段、重叠段或者与blockage冲突的段工具需要告诉你“这里账目不清”。这种状态通常出现在ECO之后。比如你手动删除了一些shape但相关net的其他segment没有同步更新或者增量route只修复了局部区域其他区域保持了旧的route状态。这些“不一致”累积起来就会在报告中显示为大规模partial conflicts。4.2 遇到RTSTAT-6先别急着修先备份和评估我的处理顺序是保存当前设计副本saveDesign design_before_fix.enc运行ecoRoute -fix_drc true看看能否自动清掉一部分conflict如果依然很多考虑运行globalDetailRoute做一次全片重绕重绕后用reportQoR检查DRC和时序变化这里需要特别提醒globalDetailRoute是“重武器”它会重新绕全片运行时间很长而且原有route结果可能被大幅改变时序变化不可预知。对于ECO项目如果只是局部改动我更倾向于先尝试轻量的ecoRoute。如果ecoRoute无法清掉conflict可以用命令查看具体是哪几条net有问题dbGet [dbGet -p top.nets.routed -if {.status partial}].name查看之后针对这些具体的net用editSelect -net xxx选中再editDelete -route删除后重新ecoRoute。4.3 批量清理Dangling Wire的脚本思路ECO后partial conflicts里最常见的就是dangling wire悬空线头。这些线头不会立刻导致几何DRC但会让数据库处于“不干净”的状态影响后续所有修复步骤。针对同一类型的悬空线头我写过一个小脚本批量处理核心思路是查出所有route状态为partial的net逐个选中并删除后再统一ecoRoute。大概这样set partial_nets [dbGet ...] foreach net $partial_nets { editSelect -net $net editDelete -route } ecoRoute -fix_drc true注意这段代码不是完整的生产脚本只是一种处理思路实际用的时候要根据设计规模控制范围。我踩过一次坑在一个几十万instance的模块上我用类似脚本把所有partial net的route都删了然后跑ecoRoute结果因为模块太大ecoRoute跑了快40分钟才结束。所以建议处理前先按区域过滤只处理当前关注的局部区域。4.4 Partial Conflicts与Pin Assignment不匹配的联动排查最后补充一个比较难查的根因。有时partial conflicts怎么修都修不完这种情况下我会怀疑某个macro的pin assignment和routing方向不匹配。比如一个macro的M3 pins全部朝外但工具在routing时把M3优先作为horizontal方向导致有些pin永远无法按预期连出。这种时候只修route已经没意义了需要回到floorplan阶段重新调整pin assignment或者修改该区域routing direction的设置。虽然这会引入一轮更大的迭代但从根上解决后partial conflicts通常能彻底消失比反复修route划算得多。这也是为什么我建议在排查partial conflicts时不要一头扎进细节先检查一下周围环境配置。5. DRC修复之后时序收敛和ECO Buffer Tree的正确打开方式5.1 修复DRC为什么会让时序变差修DRC本身就意味着改变走线。删除一个segment、加一层跳线、插一颗二极管都会增加或减少net上的RC。具体到数字后端最常见的结果是插antenna diode增加栅极电容影响cell delay跳层增加via电阻可能让net delay变大修复short时改线可能让绕线路径更长这些变化单独看都很小但一个net上同时叠加几项或者多条时序关键路径上的net都被改动时整个设计就可能从原本的timing clean变成有violation。所以修完DRC之后正确流程是update_timing report_qor -summary马上看一遍时序summary确认有没有新增violation。如果有时序问题再针对问题net做恢复。5.2 ECO Buffer Tree的灵活应用处理DRC修复引入的时序问题有时候只改走线还不够。一个典型场景是为了修复某条长走线上的antenna或short问题我们把绕线路径改长了结果这条net的delay变大时序变差。这时最直接的方法是插入buffer来恢复延迟。Innovus中可以用ecoAddRepeater命令插入buffer或inverter对。关键参数包括buffer类型、位置、net名等。一个实际例子ecoAddRepeater -cell BUF_X8 -net my_net -prefix ECO_BUF插入buffer后工具会把长net分成两段各自驱动更短的负载delay明显改善。但这里立刻会带来一个新问题插入的buffer本身需要placement和routing如果附近空间紧张很容易在后续route中引入新的spacing或short violation。我的做法是优先利用芯片上已有的spare cell而不是在空白区域新放buffer。spare cell是预留在芯片各处的备用逻辑单元通过修改它们内部的metal连接实现buffer功能不需要额外占用新的placement位置对局部congestion的影响小很多。使用spare cell恢复时序的流程会稍微复杂一些但DRC风险确实低很多。在项目后期我一般优先查一下附近有没有合适的spare cell能用就尽量用。这也算是ECO buffer tree实践中的一个小技巧。5.3 DRC与时序双重收敛的实操工作流在我的项目后期DRC和时序的修复往往是一个循环。直接说结论不要企图一次把DRC清零也不要在DRC还有几千条的时候就开始做精细的时序优化。我的工作流是这样的第一轮批量修复主要DRC分类Metal Short、Antenna、Partial Conflicts第二轮跑update_timing找出因为修复DRC而新增的时序violation第三轮针对这些timing violation恢复优先用spare cell或ECO buffer tree第四轮重新跑DRC确认恢复时序的改动没有引入新的DRC重复第2到第4步直到两边都收敛通常循环2到3轮之后DRC和时序就都能稳定在一个干净的状态。5.4 Signoff前的最终检查最后一轮DRC clean之后并不代表可以立刻交片。我还会做以下几项检查重新跑一遍verify_drc和verifyConnectivity确认数据库没有旧报告缓存跑LVS确保修复过程中没有改变netlist连接关系回归检查clock tree确认没有因为ECO改变时钟结构跑一遍IR drop和EM检查特别是大量插入diode或buffer的区域看是否存在局部供电问题这些检查看起来“麻烦”但每一条背后都有对应的tapeout翻车案例。数据一致性、连接关系、供电可靠性这三关没过DRC再干净也只是表面功夫。修DRC这件事考验的从来不只是对工具命令的熟悉程度更多的是对设计本身的熟悉程度。我从同层short修到跨层short从天线效应修到partial conflicts再修到ECO buffer tree每一步都踩过坑但每踩一次坑也算是对芯片后端设计理解得更深了一层。如果要从这些经验里提炼一条最重要的心得我会说DRC报告只是表象真正要解决的是背后的物理或逻辑问题——congestion、pin assignment、天线比、数据库一致性。抓住根因DRC自然就干净了。希望这篇总结能帮你少走几步弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑