Powerplan后DRC问题全解析:根因、修复与电学验证

发布时间:2026/10/21 23:48:39
Powerplan后DRC问题全解析:根因、修复与电学验证
我是在某次后端交付节点被powerplan后的DRC问题磨掉整整两天之后才彻底改变了对这个阶段“违规件数”的看法的。当时PR流程刚走完powerplan信号线还没开始布线理论上版图上只有电源网格和标准单元正常人都会觉得DRC应该没几个。结果打开报告一屏一屏的M6 short、slot碎金属、via array spacing违规堆在那里数量和严重程度完全超出预期。从那时起我就意识到PR阶段powerplan后的DRC问题从来不是“看到红就修”那么简单它背后牵扯电源网络拓扑、工艺rule的理解、IR drop的余量甚至直接决定了后面CTS和route阶段的生死。这篇文章就把我在多个项目里处理这类问题的完整思路写出来。我会从powerplan阶段DRC问题的特殊性讲起把常见的违规类型、根因判断、修改手段、脚本化处理以及后续电学检查串成一个可复用的流程适合正在做后端物理实现、或者刚接触floorplan/powerplan的工程师参考。内容里所有项目经历我都会用化名和泛化的工艺描述但方法本身是能直接用在工作里的。1. 为什么powerplan之后的DRC看着少却最容易拖慢整个后端流程很多人对powerplan阶段DRC的轻视来源于一个直觉这个阶段只有电源网络版图元素少设计规则检查应该很简单。这个直觉一半是对的一半是坑。元素少确实意味着跑DRC很快但恰恰因为元素少、图形规整任何一条几何违规都代表着一个非常具体的根因而不是后面布线阶段那种“绕线太密挤出来的小间距”。根因越具体越需要工程师认真判断否则改一个小的stripe offset可能牵动整个电源域的供电能力。1.1 powerplan阶段DRC的特殊土壤在典型的后端flow里powerplan一般放在placement之后、CTS之前。此时版图上主要有三类东西标准单元、宏单元以及刚刚铺上去的电源网络。电源网络在物理上就是一组横竖交错的金属条带高层金属走长距离供电低层金属做rail把电源送到每个标准单元的Pin上层与层之间靠via阵列打通。听起来不太复杂但一旦叠加上真实工艺的物理规则问题就来了。高层金属因为要过很大的瞬态电流通常都做得非常宽宽金属触发了fat metal class的特殊间距要求为了满足金属应力释放规则大块金属又必须开slot而slot的位置、长度、端部距离任何一条都不能含糊。换句话说powerplan阶段DRC的“隐秘性”来自规则之间的相互作用单看每一条stripe都没问题但stripe和stripe之间、slot和cut之间、via array与金属边缘之间的相对关系才是违规重灾区。我们团队的流程是在placement后、CTS前一次性构建完整电源网络然后立刻做一个PG-only的DRC子集检查。这个driving检查的意义在于趁信号线完全不存在的“干净画布”阶段把电源网络的几何违规全部暴露出来。如果这一刻选择忽略等到CTS插完buffer、route走完信号线再想回头调整stripe的宽度或via阵列的位置每一次改动都可能压断几十上百根已经布好的信号线代价完全不是一个量级。1.2 拖到后面再改的代价绕线、时序、IR drop三线齐动经常有同事觉得反正后面还有一堆ECODRC放到最后统一清也行。对于信号层的spacing违规这个逻辑勉强说得通因为布线工具自带自动规避但powerplan后的DRC不是这个玩法。电源网格一旦被后续布线包围几乎所有违规点都处在“被绕线包围的缝隙里”。这个时候你再想去修改一根stripe工具不会老老实实只在违规区域动刀它会认为“标准单元上方高层金属有空隙”尝试把附近信号线重绕到这些空隙里。于是你修一个DRC换来几百根信号线的绕线变化时序报告一夜回到解放前。更隐蔽的是电源结构本身的变化stripe窄了IR drop变差via少了EM过不了launch和capture时钟cell附近的电源条带位置变了CTS阶段的buffer布局全部推翻重来。所以我的建议很明确powerplan后的DRC必须在这个阶段清零至少要清到95%以上再放行。这不是洁癖这是给后续阶段保留退路。版图里电源网络就是地基地基上有裂缝越晚修缮地上建筑死伤越惨。2. 三张“雷区地图”短路、面积、过孔规则分别怎么来的我在处理powerplan后DRC问题时习惯不看总量先看分类。只要把违规按“层 规则名”分组很快就明白这一步到底在跟什么打架。这么多年下来powerplan后DRC的违规来源基本逃不出三大类同层异网短路、宽金属开槽导致的最小面积问题、via阵列与切口相关的几何规则。下面把这三类逐个拆开讲清楚它们的根因和触发条件。2.1 第一类电源条带之间的短路和间距问题短路类违规在powerplan后通常表现为同一个金属层上一堆高亮的两个颜色图形碰在一起报警信息写着两个不同电源网络或者一个电源一个地网络短接。最常见的三种成因第一种是最容易踩的多个电源域边界处理。芯片里有VDD和VDDA两个域这个项目的powerplan里系统自动生成两条相邻stripe默认间距只有正常间距的一半因为工具认为它们属于同一个macro group没想到两边其实是不同网络。stripe端部稍微做了个切角处理切角处两个图形直接贴在一起DRC立刻报short。第二种是stripe与标准单元rail的short。低层rail如果做得太宽或者高层stripe上的via array投影位置偏移via落到了标准单元供电rail旁边的信号pin区域等于把电源和信号短在一起。这种最麻烦因为表面看是M2/M3层的图形问题实际根因在高层stripe的投影坐标。第三种跟slot的朝向有关。某些工艺要求宽金属上的slot必须平行于电流方向如果工具为了实现更好的IR drop在一个stripe里开了横向slotslot两边的金属在电学上仍然连通但DRC检查的是物理图层关系slot端部的弧角或倒角一旦和旁边另一条stripe的距离小于rule就会被判定为短路或间距违规。对付这些short我的第一反应不是直接改图形而是先搞清楚两个问题这两个图形是不是真的应该属于不同网络如果确实不同网络那它们的物理相邻是规划内还是规划外。搞清楚之后大多数修复动作都落在调整stripe端部、拉开不同电源域边界处的间距、以及修正via array坐标这三件事上。2.2 第二类宽金属开槽招惹出的最小面积违规有一类DRC违规特别能迷惑新人就是minArea。报错说明告诉你某块金属图形面积小于工艺规定的最小值但你看版图周围全是又宽又长的stripe怎么也想不明白“这么大一块金属怎么会面积不够”。答案基本都藏在slot里。芯片后端的人都知道宽金属上要开slot这是为了释放金属膜层内应力、防止热循环下金属分层或开裂。工艺规则里会对slot的宽度、长度、间距、端距、边缘余量做明确约束。规则的本意是好的可当你把一条stripe上开了多个slot之后原本连续的金属区域被slot切割成若干个独立的物理多边形其中某个位于slot端部、转角的残留图形可能只有零点零几平方微米直接跌破minArea下限。这种违规最难的不是修而是找。除非你把违规图形的层次打开看清楚它到底是哪个slot切出来的碎片否则你盯着整条stripe看半天也看不出问题。等到定位到罪魁祸首修复手段通常是三类把slot的cut长度缩短、改变slot间距让碎片并入更大区域、或者干脆重排这一段的slot方案。也有更彻底的做法把这条stripe的连续大块金属拆成两条并行细stripe电气上通过两端的staple或via连回同一网络物理上每一条都远离需要开slot的阈值。这个方案对IR drop几乎没影响但工程量大一点。2.3 第三类过孔阵列与切口规则带来的连锁反应第三类大头是via相关的规则而且这类违规在新工艺节点上特别普遍。电源网络要用高层金属往低层供电低层金属的电流密度能力不如高层所以高低层转换处要靠一堆cut组成的via array硬扛。cut一多规则冲突就来了。第一个常见的违规是cut-to-cut spacing。规则要求同一个via array里相邻cut中心距不能小于一定值如果你的array是4x4甚至6x6某个方向上的cut间距可能刚好压线。第二个常见违规是via enclosure也就是array最外圈cut到上层或下层金属边缘的覆盖距离不够。高层stripe设计时画得跟array一样宽但实际DRC要求stripe边缘至少伸出cut边缘多少纳米你没留够就报enclosure。第三个是cut数量和EM的关系这个不是直接DRC报但属于电学检查会拦下来的后面我单独说。这类违规的修复路径相对标准化要么减小array规模比如4x4改3x3牺牲一点电阻换来规则合规要么把stripe在与array连接处的金属边缘加宽ensuring enough margin。还有个办法是把一个集中via array拆成两个分立的array中间用一小段金属连接既保证电流路径又让每个array的cut间距都松下来。3. 真正动手修DRC的完整操作路径说了半天根因下面进入正题到底怎么一步步把这些violation清掉。我按自己的日常操作顺序来每一步都会说明为什么要这么做。3.1 第一步把violation按层、按规则分类别上来就点根因拿到DRC报告的第一件事不是打开版图到处点红框而是先做一份统计。现在物理验证工具的report格式比较友好导成表格之后用一行命令就能看到违规分布我自己常用的是得到DRC报告后跑一段文本统计把每个规则名的数量拉出来。awk -F\t NR1 {print $3} drc_density_report.tsv | sort | uniq -c | sort -nr举个例子统计结果可能是这个样子的规则名金属层数量初步判断M6.minAreaM6432slot切出的碎片M7.spaceM718不同电源域stripe间距VIA4.cutSpacingM7-M6 via156via array配置M6.areaShortM67电源域边界短接M7.densityM724金属密度过高看到这个表修复顺序自然就出来了先修areaShort因为这是电学性质的问题再修minArea和cutSpacing因为数量多、修法统一适合脚本化最后再看density因为density这种东西很多时候要等整芯片的metal fill策略定下来才能彻底解决。不要一上来就直接改。先把违规点按照“电源域 层 规则类型”分组能让你快速判断这是不是一个“全局性问题”。如果你发现某类违规集中出现在某个角落多半是那一块的电源网络用了特殊处理如果uniform散布在全芯片那就是规则本身和当前powerplan参数不匹配要考虑改的是策略而不是几十个孤立的图形。3.2 第二步分类型手动修的典型操作与脚本化改造分类完成之后修复动作可以分批进行。对于数量只有十几个的short类违规我基本都是手动修因为每一个short的成因都不同脚本容易出现误操作。我的操作顺序是这样的先通过高亮功能只看报警的金属层把其他层全部关掉。然后逐个分析违规的两侧图形分别属于哪个net电学上是否真的需要分开。如果确实是两个不同电源域的stripe短在一起最简单的修法是选中其中一条stripe的端部向内缩短到间距满足rule。缩短的同时要注意这条stripe与远端via array的覆盖变化不要让端部因为缩短而跑到离via太近的位置。对于slot造成的minArea违规我常用的修法有两类。第一类是移动slot的位置不让slot的端部停在窄小的转角处而是让它收在宽大的金属区域中间这样slot切出来的碎片面积就足够大了。第二类是把slot的尺寸稍微缩小留出更大的边缘余量。这两种手法都要求修完后重新看一下IR drop毕竟slot本身是为了应力调整后不能完全无视这条金属的可靠性要求。对于via array相关的cutSpacing和enclosure违规这些属于大批量、同构型强的违规手动修不划算我会用脚本思路批量处理。以某个工具的TCL接口为示意处理逻辑大致是这样# 伪代码示意批量处理via array的思路 set bad_vias [get_via_arrays -filter rule_name VIA4.cutSpacing] foreach va $bad_vias { # 检查array规模 if {[get_property $va cut_rows] 3} { set new_rows [expr {[get_property $va cut_rows] - 1}] set_property $va cut_rows $new_rows # 重新布局array让cut居中 update_via_array $va -recenter true } }真实工程里不建议直接拿这段代码去跑但思路是对的先筛选出符合条件的违规对象统一调整array规模再以“居中”为原则重新生成一次就能修掉一大片。批量改完必须重新跑物理验证确认新array没有引入新的enclosure违规。3.3 第三步回到powerplan策略调整驱动的关键参数如果经过分类和批量修之后某类违规仍然反复出现、甚至每次都出现在不同位置那问题多半不在单个图形而在powerplan的全局参数。这个时候要回到电源网络的构建策略里调参数而不是继续和一个个violation死磕。以stripe spacing为例。工具在生成stripe时是均匀铺开的默认间距不会考虑不同电源域之间的边界。如果你的设计里有多个电压域就应该在powerplan阶段给不同域的stripe之间留出额外的安全间距而不是依靠DRC报告出来之后再去缩短。再比如strip width和slot的关系宽金属开着开着就会触发slot规则和fat metal spacing如果你发现当前宽度刚好卡在规则档位附近不如直接把宽度降到阈值以下让整条stripe从“需要开slot的宽金属”变成“普通宽度金属”一劳永逸消灭一大批minArea和slot相关规则。还有一类与decap/填充单元摆放有关的违规也值得在策略阶段就考虑。很多powerplan流程里会先摆放一部分decap cell它们的电源引脚要求高层金属路过时提供足够的via连接区域。如果stripe的位置刚好把via array压在decap的pin区域边缘就会报enclosure。最省事的方法是在powerplan里统一根据decap cell的pin位置生成stripe offset让每一列decap的供电区域都对齐这个比重试几十次“修完再看”高效太多。3.4 什么时候该走rule waiver而不是硬改版图处理powerplan后的DRC还有一条经常被忽略的路径rule waiver。我见过不少工程师一看到violation就拼命改layout改到IR drop劣化了、时序全乱了最后才发现那条rule本来就是过度约束、或者跟这条金属的用途根本无关。我自己的判断标准是这样的如果违规只发生在一两条特殊stripe上且这条stripe的宽度、间距都是为了满足IR drop而刻意设计的而工艺规则里这部分又是“灰色地带”那么优先和工艺对接窗口确认而不是盲目改版图。举个例子某次项目的M7宽金属间距rule报出违规因为我们的M7 stripe穿越了某个高电流密度区域必须做得很宽旁边的stripe间距自然就不够。这时候硬拉开间距会直接牺牲供电能力后来确认该rule针对的是普通信号线形态对power stripe有exceptionwaiver审批通过问题彻底避免。当然waiver不能乱用。它的前提是你对rule的意图有准确理解并且愿意为这个决定签字背书。我的习惯是凡是涉及EM、antenna、电迁移、应力可靠性这些物理可靠性相关的rule绝不waiver凡是纯粹的几何距离要求、且后续金属填充阶段会覆盖或改动的rule才考虑waiver。这个边界必须非常死否则后面的可靠性审查会来找你喝茶。4. 三个实例复盘从红框到根因的完整排查链路理论讲太多容易飘下面用三个我在实际项目中处理过的案例复盘一下整个排查和修复过程。每个案例我都按“现象—排查—根因—修复—验证”的逻辑写尽量还原当时的决策路径。案例里的项目名都是化名工艺信息做了模糊处理但现象和修法绝对是真实发生过的事。4.1 实例一M6短路“一簇一簇”出现根因是电源域边界某AI边缘计算芯片双电源域设计VDD和VDDA。powerplan后的第一批DRC报告里M6的areaShort报了7处全部集中在芯片左上角约500微米乘500微米的范围内像一簇一簇的红斑。当时第一反应是M6 stripe自动生成时没对齐但放大之后发现个有意思的细节这些short全部发生在同一条纵向stripe的端部两侧一边是VDD一边是VDDA。再往深层查发现这条stripe的端部带了一个45度切角切角之后金属的最终外形越过了一条看不见的“域边界线”和VDDA域的供电rail贴在一起。这条边界线在floorplan阶段是干净的因为两个域的rail画在不同的层和位置上但powerplan阶段为了节省绕线资源系统默认把高层stripe连成一根“貌似连续”的导体没有意识到它横跨了两个供电域。修复动作分两步。第一步是把这条stripe的端部切角向内收缩让它的最终图形不再越过域边界第二步是在两个电压域之间的M6走线区域设置一条硬blockage强制后续任何电源stripe都不能跨域生成。复跑DRC同区域short清零。这个案例给我的教训是电源域的“域边界”不只是逻辑概念物理版图里必须用真正的图形间距去落地否则工具不会懂你的电学意图。4.2 实例二slot切出的金属孤岛撞上最小面积规则某5G基带项目M7上大面积分布着minArea违规数量四百多分布在全芯片各处每个违规点都很小。打开一个典型的红框看违规图形是一条宽stripe中间被一个横向slot切出来的三角形金属残留。按工艺rule这个残留的面积差一点才到最小面积线。当初这根stripe设计成又宽又长是为了给某个高功耗模块提供低阻抗供电路径。为了满足应力规则工具自动加了不少slot。问题在于工具加slot时是按“尽量均匀”的默认策略没有考虑slot端部落在什么形状的区域里。当slot的端部落在stripe边缘附近的圆弧转角处两个slot配合起来就把转角处的金属切成了一个面积很小的小三角。修法是针对每个违规点统一调整slot端部的位置和朝向让slot收进大块区域而不是留在转角。为了一次处理干净我组织脚本按坐标和尺寸把违规点附近的slot做了重新布局核心逻辑是强制“slot端部距离stripe边缘必须大于30%的slot宽度”。修完这批后又把同样的slot策略应用到同层其他所有宽stripe上防止下一轮又冒出来。复跑DRCminArea违规从四百多降到九个剩下的九个分布在宏单元内部的模拟区域不在我们后端修复范围内。4.3 实例三默认via数组在新工艺下触发cut spacing某车规MCU项目第一次用某新工艺节点做后端实现。powerplan后报出一大堆VIA4.cutSpacing违规数量一百多。违规区域非常一致高层stripe与标准单元rail连接处的via array每个array里的cut间距都略小于rule。排查之后发现原因特别简单工具的默认via array配置还是沿用老工艺的参数老工艺要求cut间距较大新工艺反而因为光刻工艺更先进要求同一array里cut间距更小才能保证图形完整性。看起来是工具生成时用了保守的coarser array把cut放得不够密……不对准确说是array里cut之间的间距没有按新工艺规则重新生成而是沿用了一套通用默认值导致规则检查下间距不足。这种问题的修法就非常直接重跑电源网络生成流程库文件里更新via array定义或者对全局via array做一次参数重配。当时我们重新生成了所有power via array的几何cut间距对齐到新工艺推荐值并统一重新居中。修复后cutSpacing违规归零。这个案例想说明的是遇到大批量同类via违规先检查PDK和工具配置的版本匹配问题别急着一条一条去拖array图形不然就是白费力气。工具更新、工艺文件更新之后旧工程里的很多几何参数都是需要同步刷新的。5. 修完DRC不是终点IR drop、EM、CTS的连环检查把DRC违规改完很多人会松一口气但我得说这只是上半场结束。powerplan后的DRC修复本质上改动了电源网络的物理形状而电源网络的任何变化都会向下传导到电学特性和后续布局布线。这个阶段最怕的就是“DRC清零了但新问题比旧问题更麻烦”。5.1 改变了电源网格几何就必须重新做PG电学检查我在处理上面的minArea案例时为了修掉面积违规把若干条stripe上的slot扩大、甚至局部缩窄了stripe宽度。从DRC角度讲问题解决了但从供电角度讲stripe的等效电阻变了某些区域的IR drop可能多出几个毫伏。所以每次批量改动电源网络图形后我的固定动作是两个跑一遍静态IR drop分析对比改动前后的EM和drop分布再跑一遍EM检查重点看via array数量变化是否让某些cut的电流密度超标。cut数量的本质是给电流多开几条“车道”你从4x4改成3x3车道少了每条车道的电流就多了超越EM阈值就需要回退。这个检查和DRC修复成果是互相约束的有的违规改完后IR drop依然在margin内有的就直接超标这时你需要回到第一步重新考虑怎么满足DRC而不牺牲电学性能。5.2 修DRC时埋下的绕线障碍会在CTS阶段集中爆发还有一种很隐蔽的坑是你在修DRC时为了图省事把某一段stripe或者via array的图形位置做了微调这一微调在电源层上看是合规了但在低层却挡住了一片原本留给时钟buffer的布局区域。举个例子某次我把一个M7 via array整体向右移动了几个微米避开cut spacing问题。这个array下方恰好是CTS阶段某clock gate cell的候选摆放位置array移过去之后低层金属的绕线通道被堵死时钟树综合被迫把几百个buffer全部重新legalizeCTS质量下降最终时序收敛花了额外两天。如果我当时能提前在powerplan后在buffer摆放区域画上blockage约束via array的位置就不会发生这种事。实际操作上我现在的做法是任何影响高层via array或stripe位置的修改都会同时更新一份“电源障碍物地图”后续CTS和route阶段直接拿它做约束。这样修DRC的副作用就能被控制在源头而不是等爆出时序问题再来排查。5.3 用subset DRC控制回归别让修好的violation再冒头修DRC最怕的不是第一次违规多而是每次复跑都在不同位置冒出新的违规。这是因为手改图形时你很难保证改完A处不会影响到B处。尤其手动拖动stripe端部、缩放via array时工具对“重新铺料”的几何处理往往会覆盖周边一大块区域。我的习惯是引入“三步纯DRC回归”的固定动作。第一步修完当前批次后只跑受影响的金属层和规则子集确认这批改的violation全部消失第二步跑全芯片PG相关的DRC子集看有没有新增违规第三步在进入下一阶段之前跑一次完整版图DRC的quick模式确保之前的修复没有污染其他区域。这三步看起来繁琐但每步在物理验证工具里都是几分钟到十几分钟的事比在CTS阶段顶着满屏红线修版图快何止十倍。6. 我自己总结的修DRC习惯流程最后分享一个我这些年沉淀下来的固定工作流和几个保命习惯算是给这篇长文收个尾。6.1 一套固定的优先清理顺序每次拿到powerplan后DRC报告不论违规总数多少我都按固定顺序推进先清short和open这是电学性质问题留着会误导后续一切分析然后清minArea和spacing这两类通常是图形拓扑问题修改后会改变供电网形状需要第一时间评估电学影响接着处理via相关规则因为via array一变EM和CTS位置都会受牵连最后才看density类的宏观规则这类问题经常要跟后端整体的metal fill策略一起权衡不一定在这个阶段清零。6.2 三个能救命的小习惯第一改任何图形之前先建checkpoint把当前电源网络的几何快照存下来。这样万一改坏了可以快速对比而不是靠记忆还原。第二用热力图或分布饼图看violation的聚集趋势如果一个规则名下的违规均匀散布就是系统性问题直接去调powerplan参数如果成片聚集就是局部特殊处理出了错可以定向排查。第三所有批量脚本修改都走“先dry-run导出报告、再执行”的流程哪怕脚本运行只花几十秒多看一眼影响范围能避免大量返工。6.3 最后再分享一点个人体会说实话powerplan后的DRC修改是个不怎么“性感”的活它不像时序优化那样有明确的收敛曲线也不像低功耗设计那样有漂亮的架构故事。但它真的是整个后端流程里最能“以小博大”的一环。你在这个阶段对一个via array多花十分钟的思考可能在CTS和route阶段少付出一整天的代价。我自己吃过太多“急着清红框、回头补窟窿”的亏现在反而觉得DRC报告里那两千个violation如果真能逼着你把电源网络设计规则彻底理一遍那它们就是一份非常值钱的“工程预算表”。每一次改完一版我都习惯把规则名称、根因类型、修复方式、验证结果记到项目笔记里到下个项目换成新工艺节点时这份笔记比很多培训文档都好用。