尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Innovus手工布线实战:从DRC违例修复到ECO应用的完整指南

发布时间:2026/9/25 1:21:42

资讯中心
01
ARTICLE

Innovus手工布线实战:从DRC违例修复到ECO应用的完整指南

Innovus手工布线实战:从DRC违例修复到ECO应用的完整指南
1. 什么情况下必须动手自动布线器解决不了的五类场景先说结论Innovus的自动布线在绝大多数情况下都比我手工画得又快又规整NanoRoute在先进工艺节点下的表现也足以应付99%的常规布线需求。但剩下的那1%恰恰是一个后端工程师拉开差距的地方。我在做AIoT芯片和MCU项目的过程中几乎每个项目都会遇到下面这几类绕不开手工布线的场景。第一类是拥塞区域的局部疏解。在标准单元密度超过75%的区块里即便你用尽了placement density、routing congestion的预优化手段总会有个别局部区域出现overflow。这时候自动布线器的典型反应是绕一个大圈把线从两三层开外的地方绕过去。绕一大圈带来两个问题一是延迟变大关键路径可能因此hold不住二是绕线会把旁边的布线资源全部占掉引发周边更多的detour。我处理这类问题的方法是先跑完ecoRoute之后用congestion map定位到具体的hotspot然后找到那几条绕得离谱的线选中它们删掉手工规划一条利用旁边空闲轨道的短路径走完再补via。这样做本质上是把局部拥堵用手工方式“硬拆”掉给自动布线器减负。第二类是高速接口和时钟网络的关键路径。对于DDR接口、USB PHY这类模块链路延迟和信号完整性要求非常严苛自动布线出来的结果往往多了一些非必要的弯曲和过孔。手动把中点抽头的位置、走线的层数和弯曲次数压到最少往往是时序收敛的最后推力。我在处理DDR DQ组信号时经常需要把一整组信号的走线约束在同样的层并且保证等长匹配这种精细控制需要手工调整其中几条误差较大的线。第三类是特殊结构需求。比如屏蔽线Shield wire、差分对的耦合走线、时钟树上的stub线、T点拓扑。这些特殊形态如果只靠自动布线器很难一次做到位因为普通的布线引擎不会理解“我要给这个时钟信号左右各加一条GND屏蔽”这种物理设计意图。我一般在做完clock routing之后手动选择需要屏蔽的net在它左右轨道各铺一条GND线然后再跑DRC确认间距。第四类是ECO阶段的局部修正。ECO是手工布线最密集的场景。走ECO的时候我们改的是gate-level网表功能可能变了但布局大致不变。这时候如果整块重新布线风险太大——其他模块的收敛结果会被破坏时序验证也要全部重来。正确的做法是只动被修改的那部分逻辑把相关region的net手工改接或者用ecoRoute -modify only改局部。我自己做ECO时除非逻辑改动量特别大否则基本是手动比较多因为ECO要的是“局部不动全局”的精准不是自动布线器那种全局重来。第五类是天线效应和IR-drop相关的手工补偿。天线违例的修复规范做法是插跳线metal jumper改变金属层的连接方式IR-drop热点区域则需要调整某些高功耗net的走线加宽线宽或换到更低电阻的金属层。这些操作在Innovus里虽然也可以通过菜单自动处理但自动修复往往会插入很多多余的结构影响到周围的走线自由度。我习惯先看antenna报告挑出那些Vio大于阈值的net手工把跳线加上然后逐条验证。一句话总结手工布线不是炫技而是在自动布线器“做不到”“做不好”“做太贵”三个维度上的修正补充。能用工具解决的别手画工具确实处理不了再上手这是我自己判断是否需要手工布线的原则。2. 手工布线核心操作Edit Wire、Cut Wire、Via编辑与选层依据2.1 editAddWire是手工布线的主心骨Innovus里最核心的手工走线命令是editAddWire。它的基本用法是在指定层上用绝对坐标或相对坐标画出一条wire。比如在M4层从坐标10,20走到30,20命令如下editAddWire -layer M4 -point {10 20 30 20}这条命令的关键参数有两个-layer指定走线层比如M1、M2、M3一直到顶层AP层。-point一组二维坐标点最少两个点多个点可以构成一条折线。Innovus会按照你给的坐标自动把线画出来中间经过的转角会自动补上cut和via。如果需要在画线时直接带上via到别的层可以配合-snap或-honorDrc选项。-honorDrc是非常实用的参数它会在你画线的时候实时检测DRC如果线画过去会跟前后的形状造成short或者spacing违例它会提醒你甚至不允许落线。我在做手工布线时基本都开着这个开关避免画完再返工。另外editAddWire还有一个交互式GUI模式可以打开 Layout Editing 窗口后选中两个pin直接在界面上用鼠标点击路径点完成走线。GUI模式适合可视化的场景交互式模式下Innovus会在鼠标移动时实时显示当前坐标和所在的网格轨道方便对齐到标准单元的pin或已有的轨道。我是两种方式混用的写脚本批量处理的时候用命令模式精细修线的时候用GUI模式。2.2 editCutWire和线段的编辑策略走了一条线之后经常需要调整局部的走向。比如你看到一条线绕了一个大弯想让它直一点直接删除整体重画往往会影响两端的via和已有连接。这时候我会用editCutWire把线从中间切断成两段只删除需要改的那一段保留两端正常连接。切断之后再用editDeleteWire删掉多余区间最后用editAddWire补上新的一段。这里的操作逻辑很像外科手术不是整条线拔掉重来而是精准切除病灶段再缝合。我见过不少新手习惯性把整条net的走线全部删掉重画结果发现麻烦不断——因为你在GUI里看到的是一条线实际它可能走了多层每一层都有对应的shape和via全部删除后重新接地的连接关系很容易遗漏产生新的open。所以我的操作习惯是能用切开重连的绝不整体删。如果一个net内多次修改建议每改一小段就用verifyConnectivity检查一下连接关系不要攒到最后一起查不然出了问题都不知道是哪一步改坏的。2.3 Via编辑与选层的核心依据手工布线绕不开过孔。Innovus的via编辑通过editAddVia命令实现但更重要的是要理解via的物理结构——它是金属层之间的柱状连接体宽度必须和两侧走线匹配。先进工艺下via有单孔、双孔、阵列孔之分落到不同层的via尺寸和需要的enclosure也不一样。选层的核心依据有四个维度工艺支持。不是所有层都能随便切。比如M1和M2之间有V12部分工艺叫V1M2和M3之间有V23但M1如果要直接跳到M3通常不允许必须经M2过渡。每切一次层就要对应一个via。所以手工布线在规划路径时要尽量减少层切换因为每多一个via不仅增加电阻电容还多了一个DRC风险的来源。时序需求。高层金属一般比低层金属的电阻更小、寄生电容更小相对衬底距离远适合走长距离和高速信号。低层金属线宽更细、间距更小适合短距离连接和电源地网络。做关键路径手工布线时我一般优先走M4/M5以上把M2/M3留给局部的标准单元连接和电源地。拥挤度。同等条件下优先走当前层利用率较低的轨道。你可以打开Routing Congestion的视图渲染一下各层的hotspot避开那些已经红得发紫的区域。DRC风险。特别要注意同一位置垂直投影上的既有物体。画via之前用allSelAbout检查一下目标区域的占用情况最好打开DRC实时检查避免via打下去刚好落在别的net的shape上导致short。3. 手工布线的物理规则约束从路径规划到DRC问题的前置预防手工布线如果只是简单打开GUI拉两条线那和画板子没区别。真正专业的手工布线核心在于走线路径规划时的“DRC预判”。我在团队里带新人的时候经常说一句话“手工布线不是画线是画完之前就想好DRC会不会报错。”提前把DRC问题在规划阶段规避掉比事后修要省力得多。3.1 最小线宽、线距与via enclosure的具体要求每个工艺节点都有自己的设计规则。以28nm工艺为例常见的基础规则大致如下具体数值以PDK为准规则项典型数值说明M1最小线宽70nm左右太窄会报min widthM1-M1最小间距70nm左右太近会报spacingM2及以上最小线宽80~90nm不同层略有差异via尺寸通常90nm×90nm具体看PDKvia enclosure至少5~10nmvia要被金属层完全包住最小金属面积例如0.05um²大面积走线需加宽加长手工布线时线宽只要不低于标准单元的pin宽度一般问题不大但min area是一个常见的坑。尤其在M1层如果你画了一段很短的线宽度虽然满足min width但面积不够就会报min area违例。处理方法只有两个方向加宽或者加长。但加长之后可能又带来s p a c i n g问题所以最好在规划时就估算一下面积。线距方面除了常规的space规则先进工艺还有复杂的长平行规则——两条线同层平行走线超过一定长度要求间距更大。上图中你看到两条M3线并行走线很长一段就得注意拉大间距或者中途换层避免报出long parallel run spacing违例。我一般处理长距离并行走线的方法是并行不超过固定长度就换层把同层并行长度切割掉。3.2 Short和Spacing违例的路径规划策略画线之前先看一下周围的net属性和形状。手工布线最容易犯的错是看到空白区域就直接一条线拉过去结果线到了发现某个转角位置正好撞上旁边net的pin或via。这就是典型的short违例——不同net的两个导电形状碰在一起了。避免short和spacing违例的路径规划原则有几点可以照做沿着已有轨道走。Innovus里每一层都有布线轨道track标准单元的pin都对齐在track上。手工布线时逐点去点击track上的整数值可以大幅度降低无意越界撞线的概率。转角的余量要留够。画L型或Z型走线时转角处是DRC最密集的区域。因为转角的外侧和内侧都会产生额外的金属形状间距计算是以实际形状边界为准的不是你“以为”的两条线的中心线。规划时在转角位置至少留出1.5倍最小间距的余量尤其是直角转角的45度切角处。跨越区域之前先查占用。在走线时会跨越一个看起来空白的区域但区域底下可能有一整片其他net的形状。特别是M1层标准单元的VDD/VSS rail遍布整个单元行任何穿过VDD/VSS rail的M1走线都要万分小心。我的习惯是跨电源地rail一定换到M2或更高层走绝对不在M1层面横穿电源环——这是short的高发区。3.3 走线方向与pin连接检查双数层走垂直、单数层走水平这是绝大多数工艺的标准走线方向约定。手工布线也必须遵循这个约定。这个约定的来历是相邻金属层如果走同一个方向via连接时的可布通性和信号完整性都会变差而且同层走线方向一致可以减少跨层噪声耦合。Innovus在手工布线时并不会强制你遵守方向规则但你在M2上画不出水平方向的合法走线吗其实能画只是画出来的线会被当成非默认走向non-default rule在后续的DRC检查中容易引出奇怪的违例。所以选层之前的第一个判断动作就是确认这一层允许走什么方向。连接检查也是手工布线容易疏漏的一环。画完线两端必须真实地“触到”目标pin或已有金属形状才算电气连接。很多新手画了一条线视觉上看着末端跟pin重叠了但其实只搭在pin边沿没有真正覆盖到有源区结果就是open。要避免这个问题画线时用-snap选项或者打开“Wire to pin”的吸附捕捉让线的末端自动吸附到pin物理中心或引脚的可连接区域。还有一个我经常提醒自己的细节手工布线之后千万别忘记跑一遍verifyConnectivity。这个检查会报出是不是有net没有完整连接是否产生了意外的open或short。连接性检查比DRC检查更基础它告诉你的不是“几何上是否违规”而是“电路上是否真的连上了”。几何上完美但电气上断开的线比一堆DRC违例更可怕——因为后者肉眼可见前者只有仿真或LVS才能发现。4. 打开DRC报告的正确方式从DRC Browser定位违例到分类筛选手工布线之后的DRC修复最怕的是一上来就盯着版图一点一点找问题找到哪个修哪个。这种做法效率极低而且很容易修了A处又漏了B处。正确的方法是先看报告再分类再逐个击破。4.1 DRC Browser和Violation窗口的定位用法Innovus里跑完verify_drc之后会生成一个DRC报告。报告的查看入口有两个一个是文本log文件另一个是GUI的Violation Browser窗口。文本log适合看数量和分布统计Violation Browser适合跳转定位到具体位置。verify_drc -limit 1000这个命令会跑完整版图的DRC检查并最多报告前面1000条违例。跑完后在Innovus的GUI里打开Tools → DRC Browser你会看到左侧是一棵违例分类树右侧是具体违例的坐标、层、net和类型。我先说一个常用技巧在DRC Browser里按“层”和“类型”分组看而不是按坐标一个个看。这样你能迅速看出是哪一层最脏、哪一类违例最多。比如发现M2层有40个spacing违例、M3层有5个short违例那大概率是M2层的走线太密修的时候可以整体调整这一层的布局而不是东一榔头西一棒子。DRC Browser里还可以按net过滤只看你手工改过的那几个net的违例。这在ECO之后验证“这次修改引入了多少新问题”时特别有用。4.2 高频DRC违例的分类与根因根据我在不同工艺节点和多个项目中的经验手工布线引发的DRC违例超过九成集中在以下五类Short短路。不同net的金属形状发生接触。根源通常是画线时距离判断失误或者via打到了已有shape上。这是最严重的DRC违例因为它直接影响电气功能必须全部清零。Min spacing间距不足。同一层走线距离过近。根源多是转角余量留得不够或者并行长度过长触发了长平行规则。Min area / Min width最小面积/宽度不足。通常出现在补丁线或短segment上尤其是ECO修改后留下的很短的金属尾巴。根源是画线时没有考虑完整的面积约束。Antenna天线效应。多晶硅或金属层在制造过程中暴露面积过大导致电荷积累损伤栅氧化层。根源是大面积高层金属直接连接到了小面积的gate端口没有做跳线换层。Via相关via enclosure、via spacing。via没有被周围金属完全包住或者两个via之间的距离过近。根源大多是在现有走线上强行添加via位置没有留有足够余量。分类清楚之后修复策略就非常有针对性了。接下来要讲的就是每一类违例的具体修法。5. 高频DRC违例的逐项修复实操命令、步骤与典型验证5.1 Short违例的完整修复流程Short是优先级最高的DRC我用一个真实案例来说明完整的修复链路。假设在M3层有两条net——netA和netB——在坐标120.5, 88.3附近发生了short。在DRC Browser里双击这个violation视图会自动放大到违例区域。通常你会看到两个颜色的shape重叠在一起一个属于netA一个属于netB。修复的步骤是第一步用editSelect -net netA选中netA高亮显示它的全部走线形状。第二步用editCutWire在违例位置的前后各切一刀把这个冲突段切出来再editDeleteWire删掉。第三步重新规划这段路径。需要在旁边找一个空闲的轨道绕过去加一个45度转角跟netB保持足够间距。画的时候用editAddWire -honorDrc实时确认新路径没有引入其他问题。第四步确认连接关系。Delete Add之后netA的连通性可能已经变了。跑verifyConnectivity检查netA是否有open确保两端pin依然连接完好。第五步重新跑这个区域的DRC。用verify_drc -area {x1 y1 x2 y2}只检查修复区域确认short消失并且没有新增其他类型的违例。我特别强调第五步是因为很多人修完short后只看这一点不报了就收工结果过了一会儿整版DRC跑完发现刚才修short的地方旁边多了一个新的spacing违例——因为新路径离旁边的netC太近了刚才实时检查范围只覆盖了netB没检查到netC。所以修完之后至少要在修复位置周围20微米范围内做一次区域DRC确认没有次生破坏。5.2 Min area违例的补丁方案Min area违例的表现是DRC报告里会写“Metal area 0.038um² 0.05um²”。这类违例多见于手工删线后留下的线头以及ECO时更新后的短segment。修法有三种按优先级排列优先尝试加宽现有线段。如果违例的金属形状本身是主走线的一部分只是有个别section偏窄可以用editResize选中该shape扩宽到满足面积需求的宽度。加宽后注意检查两侧spacing是否还够。其次加一块辅助填充patch。当上面这个方法在局部空间不够时可以做一个矩形补丁。但补丁本身不能悬空它必须和原有金属形状电气相连通常是重叠延伸否则会引入新的open或制造出“孤岛金属”。我的做法是在原有金属形状的边缘外扩一个矩形框让新的矩形完全覆盖原形状的一个端点再加上via与其他层相连这样新补丁的面积和原面积加在一起满足min area。最后延长线段接到一个via。如果附近有可以切换的层加一个via把电流导向其他层既满足面积要求又改善了电流路径。这个方案最干净因为via本身就是金属形状它所占的面积会算入金属层的总面积。选哪种方案核心要看这个违例形状旁边还有多少可利用的空间。空间够就加宽空间不够就引via。千万不要为了凑面积强行往外扩一块把旁边的net间距顶掉那就是拆东墙补西墙了。5.3 Spacing违例的修复与并行长度切割Spacing违例是最琐碎的DRC违例因为它的形态非常多。最常见的是两条线平行走太近、转角处外弧半径不足、via之间距离不够。针对平行走线间距不足最有效的修复方法是中间插入接地线GND shield——把原来的两条线拉开中间走一条GND线。这样既解决了spacing违例又改善了信号间的串扰。不过这个方法会额外占用一条轨道只在布线资源不紧张的时候用。如果布线资源紧张更实际的做法是切割并行长度。先进工艺的spacing规则对并行长度有阶梯式要求并行长度小于特定值时间距可以是min值超过一定长度后间距要求加大。利用这个规则在两条线并行一段之后让其中一条换层绕一段再回到原层把长并行打断成若干个短并行段就可以满足较小间距的要求。这个操作在DRC眼里是合法的因为换层之后它们不在同一层精神上不构成并行。5.4 Antenna违例的跳线修复天线效应之所以难处理是因为它不是单纯几何问题它的本质是制造过程中的电荷累积。修复思路的核心是“不要让我有某一段金属直接连着一个gate同时这一段金属面积又特别大”。主流修法是跳线法metal jumper在走线中间断开切到上层或下层metal走一小段再切回原层。这么做的好处是跳线段在制造过程中把长金属暴露电荷分成两段累积的电荷量不足以损伤栅氧化层。在Innovus里我通常用ecoRoute -fixAntenna让工具先自动做一次然后检查自动修复的结果。自动修复经常会插入不必要的额外via或者在敏感的时序路径上引入额外电阻电容。对于关键路径我倾向于手动打跳线选中违例的net在靠近gate端的位置切断往上层走一小段比如2~3微米再切回原层。跳线本身不能太长太长会变成新的天线也不能太短太短via产生的额外电容可能影响时序。具体跳线长度根据工艺文件要求的antenna ratio来确定一般在设计规则里会有指导值。6. 手工布线与ECO Buffer Tree实践连接关系更新与验证细节6.1 ECO buffer tree业务场景中的手工布线ECO buffer tree是数字后端里非常常见的操作。场景通常是时序收敛阶段发现某条路径的驱动能力不够需要插入一个buffer或者功能ECO之后一个高扇出net需要做tree来优化transition时间。Innovus里可以用ecoAddRepeater自动插入buffer但自动插入之后那条net上的手工调整布线往往需要人工介入。我遇到最多的实际情况是ECO插入一个buffer之后buffer的输入pin和输出pin都必须接到原来的net上但buffer的位置可能被放在了离原net主干较远的地方。自动布线器在接这段线时可能会绕来绕去影响附近的时序。这时候手工接线的价值就体现出来了你能控制这段连接线的精确路径让它尽量短、尽量少的层切换甚至可以让它贴着已有的电源地线走稳定信号完整性。6.2 Buffer插入位置与走线规划Buffer插好之后第一步不是画线而是确认它的方向。Buffer是有输入输出的方向错了整个net的信号方向就颠倒了。确认方向后再规划从原net主干到buffer输入pin的走线以及从buffer输出pin到下游负载的走线。这里有一个很重要的工程细节buffer的输入和输出往往在同一边如果你的手工走线把输入和输出的两条线挤在一起它们之间会有很强的耦合电容造成信号串扰严重时甚至会让buffer自激。规划走线时尽量让输入走线用一层金属输出走线用另一层金属让两层金属方向互相垂直把耦合降到最低。画线的操作节奏分成三步第一步用editSelect -net net名选中ECO插入buffer前的原net看清主干走向。第二步从buffer的输入pin出发用editAddWire拉到原net主干上的一个合适接入点。接入点选在距离buffer最近的位置并且尽量不要落在原net的中间而是靠近起点的一端避免制造出过长的stub。第三步从buffer的输出pin出发向负载端拉线。如果负载有多个由一个输出pin向外扇出注意每个分支的长度不要差得太大避免skew超标。6.3 连接更新后的全套验证流ECO手工布线完成后我总是会跑一套固定的验证流程一步都不省。这不是形式主义而是无数次踩坑换来的教训。第一步verifyConnectivity -type all。这一步确认所有ECO修改过的net都没有open和short。如果报出open十有八九是editAddWire的端点没有真正接触到pin或已有shape的金属边界。第二步verify_drc。全版图跑一遍DRC重点看ECO区域新引入的violation。这里有个经验如果你的ECO只动了局部不要只检查局部而是跑全版图——因为ECO布线往往会影响周边net绕线局部DRC会漏掉跨模块的问题。第三步verifyLVS。这是最容易被新手忽略的。手工布线很容易在视觉上看起来连对了但实际上接错了层或接错了net。LVS会严格比对原理图连接关系和版图连接关系不一致就会报出来。每次ECO修改后必跑LVS哪怕只是加了一条短线。最后一步对于时钟网络的ECO buffer tree还需要跑一次clock tree的时序验证。插入buffer改变了clock tree的delay需要重新确认所有sink端的skew和transition是否仍然满足要求。这一步是在整个flow里容易被漏掉的因为很多人以为drc过了lvs过了就够了忘了时序才是ECO的主要目的。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。