
数字芯片后端做到中后期日子基本是这么过的早上来跑一圈回归打开Innovus看一眼DRC报告发现冒出来几十个violation大部分是ECO之后留下的烂摊子。你说让工具自己重新跑一遍nanoRoute不行全芯片重新布线风险太大时序可能全乱改动面不可控。这时候就得手动上打开版图一条线一条线地修。这篇东西就是我这些年用Innovus做手工布线、修DRC攒下来的一套实操打法从什么时候该手动、怎么在GUI里快速起线到怎么分析violation类型、怎么动手修最后再聊几个我踩过的坑。给正在做数字后端、尤其被ECO和DRC折磨的兄弟们一个参考。1. 什么时候必须上手工布线先判断场景再动手很多人一听到手工布线第一反应是“这都什么年代了还用鼠标画线”。确实Innovus的nanoRoute在纯自动布线场景下已经很强了能处理几十万条线的全局绕线但工具不是万能的。实际项目里有三种情况是必然会落到手工布线头上的。1.1 三种最常见的应用场景第一个场景是ECO。前端改了逻辑网表变了但你不可能让整颗芯片重新跑一遍详细布线。ECO的目标是动最少的线、改最少的地方把功能补上。这时候往往要手工加一条短线、改一条连接、挪一个pin。比如一颗已经做完CTS、走完线的芯片因为ECO多了一级buffer从buffer输出到目标cell pin之间的连接断了自动布线器在这个局部区域不一定绕得干净因为它会优先保持全局布线结果的稳定性不会为了你新加的这条线把周围十几条线全推开。这时候手工拉一条线反而更快、更可控。第二个场景是关键路径的手工优化。全局布线做完时序分析发现某条关键路径延迟超了。原因是这条路径的走线绕了大圈或者换层换得太多途中打了太多via造成电阻电容增大。nanoRoute是按全局优化跑的它会为了整体拥塞度牺牲个别路径的长度但关键路径需要的是最短路径这时候就要手工把这条线从A点拉到B点走直线、少换层、少打孔。第三个场景是绕线检查和特定区域规避。有些物理约束是布线器很难完全提炼成规则的比如某片区域电磁干扰敏感或者有个狭长的沟槽需要绕过去又或者有块区域是预留给后续打补丁的现在必须空着。这些经验性的规避逻辑手工布线比配一整套约束文件快得多。1.2 动手前的可布性检查别一上来就画线。手工布线最忌讳的是“局部最优、全局失衡”——你这条线画爽了旁边几条线全给堵死了DRC越修越多。我每次动手前会做三件事。第一把目标区域放大到能看清所有cell pin和障碍物的程度确认起点和终点的pin都在哪一层、哪个方向能出pin。第二用工具查一下这条net的实际连接关系确认我手动改完之后哪些原有segment会被删除、哪些会保留避免改出一条“飞线”连不回去。第三看一遍这块区域的走线密度评估绕线方向。具体操作是在Innovus里选中目标net右键选择“Trace Net”它会高亮显示整条线的走向配合“Highlight”面板看周边net的拥塞程度。如果这片区域已经红得发紫就别硬拉直线考虑从上层空间飞过去。提示手工布线前先保存一份数据库。这句废话我说了八百遍但每次着急修线的时候总会有人忘了存。改错了想回退发现Innovus的undo对布线操作支持很有限删错的segment不是总能恢复的。存一份带后缀的DB很快但能救你一下午。2. Innovus手工布线的核心操作与命令实战工具说到底就那几个命令和操作但用得好不好差别很大。这一节我按实际操作顺序从创建线到编辑线到删除线把常用命令和GUI操作逐一说清楚。2.1 常用命令和GUI入口速查Innovus里手工布线主要有三条路命令行、GUI菜单、快捷键。命令行最常用的是这几个addRoute添加一条新的走线。可以指定net名、起始点、终止点、层、线宽。editDeleteRoute删除指定net的某段走线。比整个删除更精准只去掉你选中的segment。ecoRoute针对ECO修改后的net做增量布线。适合工具自动把新连接补齐但如果自动补的效果不好再用addRoute手工修正。routeSpecialRoute用于电源地等特殊网络的布线比如加电源strap手工补IR drop热点的电源线时会用到。GUI里最常用的是“Edit Routing Add Wire”或者直接在版图窗口选中一条net后按快捷键。Innovus默认的快捷键是shiftW可以快速进入加线模式但不同版本默认值有差异建议在用之前先确认一下快捷键映射不然按错了弹出来个别的窗口容易手忙脚乱。下面给一个最基础的手工加线命令示例方便你理解参数含义# 给net n1234 在M4层添加一段从 (10.5, 20.0) 到 (15.0, 20.0) 的走线 # 线宽采用M4默认宽度zroute会自动决定via位置 addRoute -net n1234 -layer M4 \ -point {10.5 20.0} -point {15.0 20.0} \ -width 0.08这里面的关键点是-point可以写多个构成一条折线。工具会自动在拐角处打via或切层前提是你在-layer后面列出的各段层信息对应得上。-width指定线宽不写就取该层的默认宽度。注意如果走线是时钟或者电源可能需要加宽但加宽会影响间距手工布线时务必确认周边空间够不够。-net名字必须精确匹配可以先用get_nets查一下名字再写。2.2 手工布线的完整操作流程我在实际项目里走一条手工线一般按下面的步骤来。第一步确认net名和pin位置。选中要连的两个pin看它们分别在哪个boundary上、从哪一层可以出线。比如一个pin在M2另一个pin在M4那么合理的走线策略应该是从M2的pin出来走一小段M2打一个via上到M3M3走水平方向再打via上到M4M4走到目标pin。这里要特别注意Innovus里各层的preferred direction是交替的——M1水平、M2垂直、M3水平、M4垂直依此类推。顺着preferred direction走工具更稳定最后修DRC也好修。第二步在版图窗口里用“Add Wire”功能逐段画出走线路径。画的时候一边画一边看左下角的坐标和长度信息别手一抖把折点放到了障碍物上面。画完一段工具会让你选择via类型一般选自动via就行它会根据当前工艺的via规则自动挑合适的类型。但如果你知道这片区域via密度高、散热不好也可以指定大一点的via。第三步画完之后立刻跑一个局部的verify_drc确认新加的这一段线没有引入新的violation。我不建议等全局DRC跑完再检查全局跑一圈要几十分钟你画完十根线再跑写满了报告哪根线对应哪个violation都对应不上。用verify_drc -select或者GUI里的局部检查能立刻看到当前高亮区域的DRC结果。第四步确认无误后把这根线的status从fixed改成route保存然后继续下一根。这里有个小经验手工布线的段最好标记成fixed不然下次跑nanoRoute的时候工具默认会优化所有非fixed的线可能把你手工精心修好的线全部“优化掉”。标记fixed的方法很简单加完线后用set_attribute把这根net的route type改为fixed或者在GUI里选中线段右键选择“Property Fixed”。2.3 三条绕线原则少打孔、顺方向、留余量我总结了几条手工布线的基本原则都是拿项目进度换来的教训。少打孔。每打一个via就引入额外的电阻电容对时序不友好而且via本身是有DRC规则的via和via之间、via和周边图形之间的间距要求更严。能在一层走完的不要换两层。整条线最多换两次层超过这个次数基本可以认定绕线策略有问题重新想想路径。顺方向。上面提过preferred direction这条规则的意义不只是工艺友好。顺着方向走你后续修DRC时会发现可移动的空间大很多因为周边其他线也大多是顺着走的你推线的时候不会和一堆垂直的线纠缠在一起。逆着方向布线等于在整齐的车流里逆行稍有不慎就会撞出好几个spacing violation。留余量。手工布线时眼光要放远一点不要只看当前这根线。走线经过的地方旁边留出至少一个网格的余量。这样后面如果这条线要加宽、或者旁边要再插一根ECObuffer线时不会立刻撞车。我在项目里见过一个极端情况有人把一片区域塞得严严实实结果中间哪里都不能动为了修一个short不得不删掉周围十几根线重绕气得人想摔键盘。3. DRC修复全流程从violation类型到修复手法手工布线和DRC修复是孪生兄弟。手工布线修好一条线往往在别处又拱出来一个violation。修DRC不能瞎修先分清楚类型再动手。3.1 常见violation类型速查表我把实际项目里最常见的DRC violation整理成一个表每种类型写一下它的典型原因和初步修复思路violation类型典型表现主要原因初步修复思路spacing两条线距离过近布线过密、推线后未更新推线拉开距离或换层绕行short两条线或图形短路布线重叠、via位置不当删除重叠段重新绕线min area某块金属面积不足短线、小块via区域面积不够加宽线段或延长金属块min width线宽小于工艺要求手工拉伸后变窄加宽到minimum width以上via relatedvia间距、via覆盖不足via打得太密或位置偏移调整via位置或更换via类型antenna天线效应长线连接栅极面积比超标跳线换层或插antenna diodeend-of-line线端间距不足两条线头对头太近延长某条线或错开线端这个表只是入门。真实项目的DRC报告里同一类violation可能有好几种细分的rule比如spacing就有regular spacing和cut spacing的区别。我的建议是每次拿到DRC报告先不急着修把前50个violation翻一遍看看类型分布找出主要矛盾。如果大部分是spacing说明布线密度过紧光靠修一两个点是没用的得考虑这一片区域重新绕线或者换另一层走。如果大部分是short大概率是ECO改线时留下的旧segment没删干净。3.2 修DRC的具体操作步骤修DRC的基本流程我用一段话先概括选中violation查看涉及的net删除冲突的段重新布线局部验证。就这么简单但每一步都有细节。先看怎么定位violation。Innovus的DRC Browser是个利器在菜单“Verify DRC Browser”打开之后它会列出所有violation并且按类型分组。双击某一条版图窗口会自动定位到那个位置并用红框标出冲突区域。这时候不要急着动手先看一眼这个violation牵扯到哪些net。选中它属性面板里会列出相关net的id和名字。如果这个net是ECO后新增的那大概率就是它导致的冲突优先处理它。处理spacing violation的时候我常用的一个操作是“推线”。在版图里选中那条违反间距的segment用键盘方向键微调位置把它往空旷的一侧稍微推一点。注意推完一段线AI不会自动帮你把相邻的via联动移动所以推完以后要检查一下这一段和via的连接有没有断掉。如果推完之后和另一条原来不冲突的线又贴上了那就得考虑换层不要在同一层里硬挤。换层的操作是选中该segment右键选择“Change Layer”输入目标层工具会把这一段移到新的层上并自动在两端打via。换层之后一定记得重新验证一下via相关rule因为via换位置后可能和相邻的图形产生新的冲突。处理short更简单但也更麻烦。简单的是只要删除重叠的segment就能消除短路。麻烦的是删除之后你得重新连一条线把原来的连接补回来。所以修short的正确姿势是先看清是A线和B线short还是两条线在某个via位置short。如果是via位置short直接在via的属性里换一个更小的via类型或者微调via的位置可能就解决了。如果是segment重叠就先删掉重叠部分然后把其中一条线绕开。这里插一句删segment用editDeleteRoute比用整个删除更安全因为editDeleteRoute只删你选中的那些段不会把整条net都删掉。3.3 天线效应修复的实操细节天线效应antenna值得单独拿出来讲因为它在ECO场景里特别常见。ECO加了一条长线这条线的金属面积和它所连接的栅极面积比值超标制造过程中刻蚀金属时积累的电荷就可能击穿栅氧化层。修antenna的手法主要有三种跳线、插二极管、改布线。跳线是最高频使用的方法原理很简单金属在天线上积累电荷如果让这段金属在某一层断开通过via换到另一层再换回来这样每一层的金属面积都被“断开”了降低了单段金属的积累效应。在Innovus里跳线的操作就是选中有antenna violation的net在中间合适的位置用Change Layer把一段线切到别的层去。跳线位置的选择有讲究要看这条线经过的区域哪里的周边空间允许你多打两个via二要看这条线本身的连接关系别跳到一半把时钟树的leaf cell给弄measured了。如果跳线解决不了比如这条线很短但连着很大的栅极面积那就只能插antenna diode。Innovus的库里有专门的antenna cell通常叫ANTENNA_X1这类名字。手工插入的方法是在版图里直接place一个antenna cell然后把它的pin用addRoute连到那条net上。连的时候注意antenna cell的连线要尽量短因为它本身就是用来泄放电荷的线太长反而失去意义。修完antenna之后切记跑一个antenna专项检查。Innovus里verify_drc默认是不检查antenna的需要单独用verifyProcessAntenna这类命令或者在verify_drc里加相关选项。我见过不止一次有人修完DRC报告上所有spacing和short高高兴兴送去signoff结果antenna report一打开两百多条violation躺在那里全都是因为没跑antenna检查。4. 常见问题与排查技巧实录这一节写我这些年修线修DRC踩过的坑很多都是工具文档里找不到的。4.1 修到一半线少了连不回来这是我刚用Innovus时干过最多的事。手工布线时为了看清楚我把不相关的层全部隐藏结果一条线走到一半经过某一段区域时被一个焊盘挡住了当时没注意。等我退出来整体看时发现这条线中途断了。因为焊盘在那一层上是个障碍但我在隐藏状态下看不到它走线就直接穿过去了而实际上工具压根不让via落在焊盘范围里所以最后生成的结果就是“看似连上、实际悬空”。排查方法很简单选中那条net看它的DRC结果和连接状态。Innovus的GUI里选中net后如果两端pin之间是断的导航窗口里会有明显的断路标记。修的时候先在3D视图右键 Layer Settings 全层显示下把障碍物位置看清楚再手动补上中间那段线。现在我的习惯是走线的时候永远保持显示当前层和上下各一层这样既不会信息过载也不会漏掉关键的障碍物。4.2 手动修完一条线炸出一片新violation这是最让人崩溃的情况。好不容易修好一个spacing结果旁边冒出三个新spacing再加上一个short。这种情况十有八九是“修线时没有考虑周边线位移”。很多新手修线时喜欢用推线功能我在这边顶一下那边挤一下。但推线这个操作的本质是把当前的segment移走它并不会自动触发周边segment的联动避让。你推完一条线旁边的线还是原来那个位置可不就冒出来一堆新的间距问题嘛。我的处理流程是先删掉冲突segment再一次性重新绕一整段线而不是只做微调。这样虽然耗时多一点但结果是可预期的不会出现“按下葫芦浮起瓢”的连锁反应。如果确实只是微调那推完之后必须立即用局部DRC验证把推线影响的range圈出来确认周边没新问题再继续下一步。4.3 ECO之后跑完nanoRoute手工线全没了这是ECO流程里最容易踩的一个大坑。前面我说过手工布线的段最好标记为fixed但有些人会忽略这一步。ECO做完跑增量布线nanoRoute默认会“优化”所有非fixed的segment结果你前面辛苦修了两小时、跟关键路径严丝合缝的那些线全被工具一把抹平成它认为的“最优解”时序一夜回到解放前。解决办法有两个。一是修完每根线就把它的route status改成fixed。二是在跑ECO的nanoRoute之前在Innovus里设置setNanoRouteMode -routeWithEco true并配合ecoRoute -modified只处理发生变化的net避免全局重绕。我个人的习惯是两条同时做关键的手工线全部fixedECO布线也限制在modified net范围内双保险。另外还有个容易被忽略的点手工线上设置的宽度如果比你手工布线时用的线宽宽nanoRoute在ECO的时候可能会把它“优化”回默认宽度。所以我修电源线的宽度时会把那条线所在的net属性也改掉保证工具不会擅自改宽度。4.4 DRC修不完越修越多考虑换层重绕有一种情况比较棘手某一层的局部区域密度已经接近极限你在这里无论怎么修都会挤到别的线。这时候修不是最优解换层才是。判断依据很简单如果同一个violation你把线段往左移、往右移、换via类型怎么都不行而且这个区域里其他net的间距也都很小那就是这层的资源已经耗尽了。果断把这条线换到上下层去。换层之前先确认上下层的preferred direction和当前层的差异。如果当前是M3水平方向往上换到M4就变成垂直方向了那么你这根线的走向也得跟着变成垂直的不能强行在M4上继续走水平线否则又是一堆DRC。换层之后注意在原来换层点的位置用工具自动打via别手动摆via。自动via会遵循该层via的minimum spacing和cut enclosure等规则手动摆很容易摆错。打完via之后再跑一次局部DRC确认via周边没有和别的图形冲突就基本稳了。4.5 快速定位DRC问题的一个习惯最后分享一个我自己的工作习惯。每天开始修DRC之前我会先在Innovus里打开“View Layer Settings”把跟DRC相关的layer全部display出来包括所有金属层、via层和pin层。然后用DRC Browser按类型分组先把严重级别最高的short和open修掉再修spacing和其他的。修完一类就重新跑一次局部验证确认这一类清零再修下一类。这样每天结束的时候我能确切知道这一天的DRC数量变化了多少不会被“整体跑了但不知道哪里改了”的模糊状态牵着走。如果是跑全芯片层的DRC建议加上-limit参数比如verify_drc -limit 3000 -report drc_top.rpt。这条命令的意思是只报前3000个violation执行速度快很多。等修到后段了再提高或去掉limit跑一次全量拿到干净的signoff级别报告。5. 收尾前的一份心得体会手工布线和DRC修复这件事做到后面拼的不是手心快不快而是思路清不清楚。我见过刚入行的同事对着一个short折腾一下午鼠标点得飞快画面晃得人眼晕结果最后short没消掉倒是把旁边一根关键路径的线给推出问题了。真正高效的做法反而是慢下来先看类型、再定策略、最后动手。一条线如果一个方案试了三次还不行就停下来把周边空间打开看一遍重新规划路径而不是在同一个死胡同里反复试探。另外一个心得是手工布线用的时间务必记下来。每次手工绕一条线大概要花多久、修一个DRC大概要花多久时间长了你会对自己在项目里的修复能力有个准确的预期。这对于评估ECO工作量和排工期很有帮助。我在最近一个项目里碰到一次中等规模的ECO涉及四十多个net的改连我按之前积累的工时估算提前在项目计划里申请了两天的修复窗口最后一天的下午就交付了干净DRC这份从容完全来自前面几个项目一笔笔记录下来的数据。说白了Innovus这一整套工具自动布线再强也解决不了所有“经验性”的问题。手工布线本质上就是工程师把布局布线经验直接转化到版图上把工具理解不了的约束、规避不了的风险用自己双手去填平。会画线的人很多画得干净、修得干净、让后端数据安安稳稳出带的人才是团队里真正靠谱的那一个。希望这篇东西能帮你在下一个ECO或者signoff周期里少一点惊吓多一点从容。