
去年负责的一个项目数据库plot DRC明明已经干净结果后端做了一版ECO之后M3/M4层密密麻麻冒出来一片Metal Short旁边还挂着一百多条天线效应违例。当时第一反应是哪里又来搞我后来坐下来把报告按层、按net归类发现大部分short集中在一个局部区域天线违例则集中在几条scan链上。这种场面在数字后端ECO阶段其实很常见尤其是Innovus数字后端的日常里DRC修复从来不是单纯的手工活而是一套优先级判断和增量验证的方法论。这篇文章我会按实际排障的顺序把从Metal Short到天线效应这条链路完整拆开怎么在Innovus里定位short为什么天线效应会在ECO阶段二次爆发修short和修天线为什么经常互相打架以及ECO路由里最常见的partial route conflict到底该怎么清。适合正在做物理设计、跑ecoRoute、或者被DRC报告逼到加班的数字后端工程师参考。1. 拿到DRC报告先别急着下刀Metal Short的识别与分类1.1 先把DRC报告按风险分成三类很多人拿到verify_drc生成的报告就往下滚看到一条修一条结果越修越多。我现在的习惯是先把报告按类型过一遍分清楚哪些是必须马上处理的哪些是可以暂缓的。DRC类型常见根因风险等级修复优先级异net short短路布线拥塞、pin access冲突、ECO改线重叠致命直接功能性短路最高天线效应antenna长金属直连小尺寸栅极ECO换层导致面积比超标可靠性损伤芯片可能当场失效高spacing / min step金属间距不足、图形直角过近制造良率风险中min area切金属后残留图形面积过小制造时可能断线中同net short冗余金属块桥接、dummy未排除不一定致命但必须处理低这个分类看起来简单但决定了你后面每一步操作的方向。比如异net short属于功能性错误不修芯片就直接短路天线效应属于可靠性问题芯片可能出厂时能工作但使用一段时间后性能退化甚至失效spacing和min area则是工艺制造层面的限制不满足就流片失败。1.2 同net short和异net short必须分开看Metal Short在Innovus的DRC报告里需要先做一步关键判断报告里互相short的两块金属到底属于同一条net还是不同net。同net short看起来很奇怪既然是同一条net为什么会报short这是因为同一条net在局部出现了两块本不该重叠的金属图形它们虽然电学上本来就是连通的但物理上形成了桥接、多角、冗余连接DRC会将这个区域判定为short。这种short不会造成LVS短路但如果放任不管会在signoff阶段被卡住而且可能在dummy填充时引出其他问题。异net short就没这么温柔了两条不同信号的net在某一层重叠或搭接属于真实短路。尤其要警惕power net和ground net之间的short那是优先级中的优先级。判断方法很简单在Innovus里选中violation的两块shape看net name是否相同。同net的short通常可以最小化处理比如删掉多余金属块异net的short必须通过切割或重新走线让两条net彻底分开。1.3 用Innovus快速锁定short的实操手法报告生成后我会习惯性地先跑一次全片DRC生成一个baseline报告verify_drc -report reports/drc_pre_fix.rpt -limit 10000然后在Violation Browser里按类型排序只看short这一项。Innovus的图形界面里选中一条short violation后高亮再通过Show Related Nets查看关联net配合不同颜色显示很快就能判断是哪个区域的哪几条net纠缠在一起。遇到大片short集中出现时不要一条条点直接用congestion report配合查看reportCongestion -hotspot -report reports/congestion.rptshort集中区往往就是绕线拥塞区后续的修复策略要根据拥塞情况决定是简单切割还是必须给局部布线器让出一条路。还有一个我常用的土办法用dbQuery把短路段落周围的shape都列出来人工确认一下附近的power stripe、blockage和已有via的分布避免修short的时候一头撞上更麻烦的障碍物。2. 天线效应为何敢在ECO阶段“二次爆发”工艺根因与修复冲突2.1 从等离子刻蚀到栅氧损伤要修天线效应先得明白它在工艺上是怎么来的。芯片制造过程中金属层不是画上去的而是通过等离子刻蚀等工艺步骤形成的。等离子体中存在大量带电粒子而金属本身是导体在刻蚀过程中就像一根天线一样收集电荷。如果这根金属线最终连接到一个尺寸很小的栅极上积累的电荷就会通过栅氧化层泄放导致栅氧损伤甚至击穿。这就是为什么数字后端里说的天线效应和EMC电磁兼容里那种天线完全是两回事。后端的天线效应本质是一个等离子体充电导致的可靠性问题和无线电收发没有任何关系。天线效应的风险大小通常用天线面积比来衡量也就是某一层金属连接到栅极的面积除以该栅极面积的比值。foundry的rule文件里会定义不同层的天线面积比上限以及累加面积的计算方式包括天线检查可能分为部分金属比例和总金属比例等不同规则。2.2 天线检查在Innovus里以什么形式存在Innovus的布线器在detail route阶段默认会根据工艺tech file里的antenna规则做一定程度的修复。但ECO阶段不是这样ECO通常只针对局部nets做重布线工具不会把所有net重新跑一遍完整的天线优化所以原本在full route时被工具吸收掉的天线风险在ECO之后可能会重新暴露出来。更麻烦的是ECO阶段改动的net天线检查会重新计算整条net在所有层上的金属累加面积。你以为只是把一条信号线从M4换到M5走了几微米结果M4旧线段和M5新线段加在一起天线面积比就超标了。2.3 修short时最容易把天线修出来这里有一个非常典型的现象很多人修完short后重新跑DRCshort少了天线违例却多了。原因就在于修short时改变了金属连接关系。举个例子某条M1的信号线与另一条M1信号线发生short为了避开对方我把其中一条在short点附近切断然后通过via跳到M3走一小段再跳回M1。从连接性角度看没问题但从天线角度看这条net的M1面积没有变少反而增加了一段M3和两组via天线累积面积比直接超标。所以修short时脑子里要一直绷着一根弦你每改一层金属、每加一对via都在改变这条net的天线属性。一个完整的修复动作应该默认它可能带来新的DRC问题而不是默认它一定干干净净。3. 用Innovus跑一个可收敛的DRC修复循环顺序、命令与增量验证3.1 为什么我总是先修short再修天线修复顺序不是拍脑袋定的背后是一个很朴素的逻辑short和spacing属于几何关系问题天线属于整条net的累积效应问题。你改变几何连接一定会影响累积效应但你如果先去改天线再回头处理short前面修好的天线可能会因为short修复时的切割和跳线再次被破坏等于白干。我常用的顺序是先清理所有异net short和同net short再处理spacing、min area这类尺寸规则然后集中处理天线效应最后跑完整DRC、connectivity和LVS收尾。这个顺序不是绝对的但按这个顺序做每轮迭代的返工率最低。3.2 一轮标准验证的最小闭环每修完一批问题不能等到下班前才跑一次全片DRC那样出了问题根本不知道是哪一步造成的。我的习惯是每修5到10个violation就做一次局部或全片增量验证。一个标准的验证闭环长这样# 全片DRC输出报告 verify_drc -report reports/drc_mid.rpt -limit 10000 # 查当前选中的shape属于哪条net dbGet selected.name # 对指定net做局部ECO重布 setNanoRouteMode -drouteFixDrc true ecoRoute -net top/U1/ZN -fixDrc true -reroute true这里要强调一下ecoRoute -net是ECO阶段很有用的命令它的好处是只针对指定net重布不影响其他net配合图形界面里选中的violation使用效率很高。但也要注意如果这条net在blockage里被卡死工具可能绕不过去需要手动调整blockage。3.3 让修复范围可控的几个设置ECO阶段最怕的一件事是工具好心帮你重布了一大片区域结果把原本干净的地方也布出新问题。所以我在修short时会先把NanoRoute设置成只处理选中net的模式setNanoRouteMode -routeSelectedNetOnly true setNanoRouteMode -drouteFixAntenna false把drouteFixAntenna关掉是因为这个阶段我只想让工具单纯地解决short或spacing不希望工具在重布时顺带优化天线导致布线结果和我预期不符。等short问题稳定后再单独开antenna修复或者手动处理。3.4 第三方面板工具也有用处虽然Innovus自带的版图编辑器已经很强大了但有些时候我会把修复后的局部区域dump成GDS丢到Klayout里人工检查。Klayout跑DRC本身不是签核级工具但它胜在轻量、直观能快速看清多层金属之间的纵向关系尤其是在手工切割后检查是不是留下了不该留的金属尾巴这种问题上比Innovus里来回切换layer视图更舒服。有人可能会问这和PCB工具里OrCAD的DRC功能是不是一回事。机制上确实类似都是基于设计规则检查几何图形关系但对象和规则复杂度完全不同。OrCAD检查的是走线间距、过孔孔径这些PCB规则Innovus检查的是深亚微米工艺下的天线、min step、end-of-line spacing这些物理规则。理解这个类比对从PCB转后端的人来说能快速上手。4. 修复Metal Short的三种落刀方式手动切金属、局部ECO和blockage4.1 手动切金属最小改动但容易切出新DRC手动切金属是修复short最直接的方式也是最容易引入新问题的方式。适用场景很明确两块金属的short范围很小比如一条信号线伸出去一个小分支碰到了旁边的net或者power stripe边缘有一个不该存在的突出块。操作上在Innovus里选中要切割的shape用Edit菜单下的Cut功能沿着需要断开的位置画一条切割线即可。切割完成后立刻用DRC检查这个局部区域。切完之后要盯着三个地方看min area切掉一块金属后剩下的图形面积可能小于工艺要求的最小面积布线器或制造端会无法接受min step切割后留下的金属边沿如果太靠近原图形的内角可能形成不满足min step规则的细小台阶end-of-line spacing被切断的金属末端会和附近的金属产生新的spacing关系需要检查是否满足规则。我踩过最多的坑就是min area。切的时候很爽快把short的根部一刀两断结果剩下的金属片面积不达标DRC里又多出几条min area violation。后来我养成了一个习惯切之前先目测一下剩余金属的面积如果明显偏小干脆把这段金属多切掉一些再通过via跳过去补回连接而不是留一小块孤零零的金属在那里。4.2 局部ECO Route把问题交给布线器当short区域牵扯到多条net或者周围的布线资源比较复杂时手动切金属的风险太高这时候应该让布线器局部重布。我以前在这个环节吃过亏给一个short的net执行ecoRoute之后工具把整条net重新走了绕了一大圈时序延迟猛增。后来学乖了重布前把net两端的pin位置看清楚确认工具改道后的路径是可接受的。操作上选中violation关联的net使用ECO Route功能命令行方式就像这样setNanoRouteMode -drouteFixDrc true setNanoRouteMode -routeSelectedNetOnly true ecoRoute -selected局部ECO Route的本质是让工具在现有布线基础上只针对选中的net重新寻找路径避开short点。这个操作比手动切割优雅但也更不可控因为工具可能为了避让short绕到很远的地方反而引发新的antenna或timing问题。所以我一般在ECO Route完成后会对比一下这条net的线长变化如果绕线增量超过一定比例再考虑手动干预。4.3 用blockage把布线挤走还有一种容易被低估的做法是用routing blockage。如果某个区域反复出现short每次修完过一阵又冒出来这可能不是某一根线的问题而是这个区域的布线通道本身就不合理。与其一次次手工下刀不如在这个位置放一个临时blockage让后续ecoRoute自动避开。createRouteBlk -box {x1 y1 x2 y2} -layer {M3 M4} -type hard注意blockage会影响所有经过这个区域的net所以不能一放了之。我通常会在修完DRC并且确认周边net都稳定后把临时blockage删掉或者缩小到原来的三分之一。blockage做得好能把反复性short直接根治做得不好会把拥塞转移到相邻区域产生新的violation。4.4 一个短网查修的案例复盘有一回项目里出现一条scan net和一条clock net在M4层的short位于标准单元row上方下面是密密麻麻的M1/M2 pin。最初我想手动切M4但切完发现scan net必须绕很大一圈才能重新连接hold timing会非常难看。后来我把其中一条net改到M5走线在short点两侧各加一对viaM5上绕了一小段避开clock net问题解决。为什么选跳M5而不是切M4因为M5这层在这个局部区域相对空旷跳线只增加两对via和一小段金属对时序影响远小于在M4上长距离绕行。这个案例给了一个经验修short的时候切并不是唯一选项有时候换层跳过去才是对时序影响最小的方案但跳线会带来天线风险所以跳完之后必须补查天线。5. 天线效应专项ECO从Metal Jumper到天线二极管的实操选择5.1 修复天线跟改短路思路完全相反修short的思路是减少金属交集但修天线的思路恰恰相反有时候你要在保证连通性的前提下故意把一条连续的金属打断成几段。因为天线效应看的是连接到栅极的连续金属面积一旦中间断开分成两段每段相对栅极的面积比就会大大下降。这个打断就是Metal Jumper俗称跳线。跳线的本质不是切断信号而是切断天线电荷的收集路径。信号通过更高层的金属跳线继续传输但天线的累积面积被分段计算了。5.2 Metal Jumper的做法与细节在Innovus里做Metal Jumper一般步骤是找到天线违例的net确认违例发生在哪一层在靠近接收端栅极的位置选择一段相对空旷的区域在原始层切出两个断点通过via分别上到更高层再用高层金属连接两个via保证跳线后的每段金属面积都满足天线面积比要求。跳线位置选择非常讲究。很多新手会把跳线放在输出端附近其实更合理的做法是靠近栅极输入端附近因为这样从输出到断点的长金属段不会直接连到栅极而靠近栅极的那一小段面积很小天线比自然就下来了。另外跳线不能随便跳。如果跳线附近已经有很多via你再塞两组via下去很容易撞到pin或已有连接产生新的spacing或者short。所以我会在跳线前用dbQuery查看目标区域的shape分布确认干净再动手。5.3 天线二极管最后手段如果天线违例非常严重比如一条net带了几百个接收端跑到哪里都很难用几组跳线把比值压下来这时候就要用天线二极管。天线二极管的工作原理很简单在net上接入一个反偏二极管给积累的电荷提供一条泄放通路而不是让电荷硬闯栅氧化层。它不影响正常的逻辑功能属于可靠性保护单元。在Innovus里加天线二极管本质是一个ECO操作# 示意在指定net上就近加天线二极管单元 ecoAddRepeater -cell ANTENNA_DIODE -loc {x y} -net top/U1/ZN实际操作中具体命令取决于你的flow和库的命名但核心思路是一样的以ECO方式加入二极管单元把单元的一端接到目标net另一端接到VSS然后通过ecoRoute把连线补齐。加二极管有一个代价网表发生了变化LVS要重新过。而且有些二极管单元有面积要求塞进了density很高的区域可能产生placement violation。所以我的原则是能跳线就跳线实在压不下来才上二极管。5.4 ECO Buffer Tree与天线的联动问题项目里经常会遇到ECO buffer tree的请求也就是在ECO阶段为了修timing或DRV在信号路径上插入buffer。这里有个容易被忽略的坑新插入的buffer会把原来的net拆成两段每段net的天线属性都要重新计算。我遇到过一种情况插了两级buffer之后原本没有天线问题的net突然冒出来一条天线违例原因是buffer的输出pin到下一级buffer输入之间的走线很长而且该net经过了好几层金属累积面积比超了。所以每次做ECO buffer tree改动做完后我会立刻跑一遍antenna check而不是等所有ECO做完再统一检查。如果发现buffer tree附近的net出现天线违例优先在该net的输出侧或输入侧加一组跳线分段而不是直接加二极管尽可能减少对网表和LVS的影响。6. 别让partial route conflict把修复打回原形ECO布线冲突处理与终局验收6.1 rtstat-6 partial route conflict到底在说什么在Innovus的ECO流程中经常会在log里看到类似这样的提示**DRC RTSTAT-6: partial route conflicts: 1184 net(s) have a partial conflict.第一次见到这个信息的人可能很慌以为是DRC报告又炸了。其实它说的是ECO模式下部分net的routing处于半完成状态一部分线已经布好了但整条net没有形成完整连接存在partial route conflict。这类net在后续ecoRoute时会被当作存在问题的对象甚至成为其他net绕线的障碍。也就是说如果你不先处理partial route conflict后面修short时ecoRoute可能反复在这些半成品net上打转DRC越修越多。6.2 先清partial conflict再修short我现在的习惯是ECO阶段每次跑完report先看一眼有没有partial route conflict。如果数量多不要急着下刀修short先把这些net选出来做一次重布。# 对所有存在partial conflict的net区域重布 ecoRoute -reroute true -fixDrc true重布完成后再跑一次verify_drc这时候往往会有惊喜一部分short也跟着消失了。因为那些short本来就是半成品net的wire残片和正常net撞在一起导致的。如果partial conflict涉及上千条net我会先看它们集中在哪些区域。一般这种大面积partial conflict都源于几个局部区域的routing blockage或者route guide问题按区域逐个击破比全局重布更可控。6.3 终局验收DRC、Connectivity和LVS一个都不能少所有修复完成后我会按下面这个顺序做终局验收跑全片verify_drc确认short、spacing、antenna、min area全部clean跑verifyConnectivity确认没有open这一步特别重要因为手动切金属很容易在某处留下断开点跑完整LVS确认网表和版图一致。为什么要强调connectivity和LVS因为在DRC修复过程中手动切割和跳线操作都有可能改变版图的连通性。DRC只检查几何规则不关心这条线是不是该连到某个pin。你完全可能切出一块几何上完全合法、但电学上断开连接的金属这种问题DRC看不到只有LVS能抓出来。我有一次修完所有DRC自信满满地交出去结果LVS直接报了十几个open全是因为手动切割时切断了一条连接路径后来又没重新连上。从那以后我定了死规矩凡是做过手动cut的区域必须单独跑一次LVS核验。6.4 为什么有时越修越多最后聊一个心态问题。DRC修复最怕的不是violation多而是没有章法地乱修。你今天修了这个short明天ecoRoute又把另一条net挤过来或者修short时换层引发了天线修天线时跳线又引发了spacing。这就是越修越多的典型循环。我的经验是每一轮只改一个区域或者只处理一类violation改完之后立刻增量验证把报告差异记录下来。如果这一轮修复后新增的violation比减少的还多说明修复策略有问题而不是工具出了问题要停下来重新看这个区域的结构。修DRC本质上是在做局部与全局的平衡。局部改了全局未必收敛全局一改局部又可能崩。唯一能依靠的就是清晰的修复顺序、严格的增量验证和每轮操作后的对比分析。