
最近连续被几个做数字IC后端的朋友问到Powerplan怎么做发现大家的痛点很一致网表摆好了、floorplan也定了到了Innovus里要打电源网络的时候不知道怎么下手。有人直接把所有VDD打成一整片有人觉得stripe越宽越稳结果后端DRC和IR drop一片飘红。这篇文章我从实际项目经验出发把Innovus中做Powerplan最核心的5个关键步骤拆开讲清楚建议想做物理设计的同学反复看。先说清楚一个基本认知Powerplan不是“画几根金属线”这么简单它本质上是在给整颗芯片设计一套低阻抗的供电路径。芯片内部成千上万个标准单元、macro、IO电路都需要在任意工作条件下拿到稳定、干净的电源电压这套供电网络的密度、宽度、层次分配、连接方式直接决定后面IR drop、电迁移EM、时序收敛和良率的表现。1. 先搞清楚Powerplan到底在解决什么问题很多人第一次接触Powerplan容易只盯着命令学忽略了它背后的物理本质。我习惯把它类比成城市供水系统package和外部电源是自来水厂PG pin是每家每户的水龙头而你画的power ring、stripes、followpin就是连接两者的主干管和入户支管。管子不够粗、分支点太少、管径突变都会导致远端水压不足对应到芯片里就是IR drop超标。1.1 两个核心指标IR Drop与EMPowerplan的所有决策最终都要落到两个指标上来检验。IR Drop压降电流流过电源网络中的金属电阻会产生压降。公式很简单VIR但难点在于I的分布和R的计算。芯片工作在高速翻转时局部区域可能瞬间抽取很大电流多层金属网络里每一层都贡献电阻再加上via的接触电阻从PAD到远端标准单元VDD pin的路径上电压会被一点点“吃掉”。如果压降超过门限通常核心电压1V左右的项目静态IR drop预算在2%-3%以内即20-30mV逻辑门实际得到的工作电压偏低路径延迟就会变大setup violation就会爆发。EM电迁移金属在电流流过时电子会撞击金属原子电流密度过大时金属原子会逐渐迁移时间长了导线就断了。EM是可靠性问题不会立刻让芯片失效但跑几个月甚至几年后就暴露出来。Powerplan阶段要控制每条金属线、每个via的电流密度不能只看瞬时IR drop。1.2 Powerplan阶段需要准备什么数据在Innovus里动手之前先确保以下数据到位了否则后面反复返工逻辑网表已综合DFT插入后的物理库文件LEF、技术文件包含金属层、通孔规则时序库lib和寄生参数文件用于做后期的IR drop分析时联合仿真floorplan包括block边界、macro摆放、IO位置、pad ring布局顶层供电方案PAD/Golden bump的供电位置和数量特殊供电要求比如IO供电域VDDIO、PLL模拟电源、SRAM的VDD/VSS pin类型定义这一堆东西里新手最常漏的是供电方案。没有和封装、系统组对齐后面改IO位置比改floorplan还痛苦。我有个习惯Powerplan开始前会先把“从package到PAD、从PAD到power ring、从ring到stripe、从stripe到rail”的完整链路在纸上画一遍确认每段路的电流方向和宽度预估再进工具。2. 第一步电源网络拓扑与金属层叠策略先把路规划出来很多人直接一上来就addStripe这是大忌。Powerplan的第一步不是画线而是先确定供电网络用什么拓扑结构以及每一层金属分别承担什么角色。2.1 从Package到标准单元的完整供电链路芯片外部电源经过封装引脚或bump进入芯片通常首先到达芯片边缘的PAD或顶层均匀分布的bump阵列Flip-chip然后通过顶层厚金属汇总到power ring再从ring通过横向纵向交错的stripes网络扩散到整个core区域最底层由followpin接到标准单元的VDD/VSS pin上。这条链路每一段都有明确的电阻预算。我常用简单方法估算把从PAD到远端cell允许的总IR drop比如30mV拆成三段package和bump分掉40%power ring到stripe网络分掉40%followpin和via分掉20%。前面省下来的预算越少后面标准单元区域的stripe就要打得越密成本越高因此在package选型和电源pin分配上值得多花时间。2.2 层叠设计低层做rail高层做strap现在的数字后端项目标准单元供电基本都靠followpin连接到垂直方向的低频条纹VDD/VSS rail上这些rail通常用M1或M2完成真正承担大电流长距离传输的是高层金属做的power stripe和power ring比如M6/M7甚至更厚的AP层。金属层越高通常厚度越大、电阻越低但layout资源也越贵绕线资源会被吃掉。所以Powerplan的层叠策略核心就一句话高层金属负责跨block长距离供电低层金属负责局部短距离连接层与层之间通过via阵列连接传递电流。M1/M2别去做长距离供电厚金属也别密密麻麻打到标准单元头上否则track都被你占完了信号绕线根本走不通。2.3 估算一个合理的stripe数量供电网络密度粗算可以用这套逻辑假设core峰值电流是I允许的stripe网络压降是V_budget单条stripe的等效电阻决定它能服务的最大面积。实际工程中大家一般直接参考同类工艺、同规模项目的密度经验值比如28nm工艺下10万pin count的blockM7上做3-4um宽、间距100um出头的stripe网络基本够用。不过随着工艺往下走、低压大电流成为趋势只靠经验风险很大更建议直接做一轮快速IR仿真。Innovus本身有电源网络分析能力也可以把PG网络导出到Voltus/RedHawk做初筛。这一步省不得我见过太多项目因为“密度看着够”就跳过分析最后signoff阶段IR drop一片红。3. 第二步用addRing和addStripe把PG骨架搭出来拓扑定好之后才轮到你熟悉的Innovus命令上场。这个过程我分成三小块电源环、标准单元区域的电源条纹、followpin连接公理。3.1 电源环addRing给block和macro做一个“护城河”电源环power ring的作用是让电流在block周边汇总并均匀流入内部网络。对整chip设计如果走bump供电ring的作用会弱一些但对IP block和hard macroring还是必要。Innovus里创建电源环的命令大概是addRing -nets {VDD VSS} \ -type core_ring \ -layer {top bottom metal6 metal7} \ -width 2.0 \ -spacing 1.0 \ -offset 2.0 \ -center 1.0参数里面-width是环的宽度-spacing是环到block边界或其他object的间距-offset和-center控制环相对block边界的位置。注意-layer {top bottom metal6 metal7}表示top和bottom方向走metal6left和right方向走metal7不要上下左右全用同一层否则四个角上via堆叠反而制造EM热点。环的宽度不是拍脑袋定的。我的经验值40nm工艺下一个功耗约0.5W、面积约1平方毫米的blockpower ring单边宽度做到8-12um才算稳妥。环太窄周边macro取电全部压在ring上局部EM很容易超标环太宽把block面积白白吃掉一圈面积利用率下降所以master planning阶段就得把ring宽度预留给floorplan。3.2 电源条纹addStripe标准单元区的能量网格标准单元区域是整个芯片功耗的大头power stripe的密度决定了每个单元离“能量主干道”的距离有多近。Innovus里加stripe的命令addStripe -nets {VDD VSS} \ -layer metal7 \ -direction vertical \ -width 3.0 \ -spacing 2.0 \ -set_to_set_distance 80 \ -xleft_offset 20 \ -extend_to_boundary参数含义拆开说-direction当前层stripe的方向metal7这层通常走verticalmetal6对应horizontal。-set_to_set_distance相邻VDD/VSS stripe组的中心间距。这个参数直接决定密度太稀IR drop差太密绕线资源紧张。-xleft_offset第一条stripe相对block左侧的偏移用于对齐到track避免stripe和信号pin打架。-spacing同层上VDD和VSS之间的线间距这个值不能随便给要满足同一层金属的minimum spacing规则还要考虑同一层不同net的绕线资源隔离。还有一点容易被忽略stripe的-extend_to_boundary选项。是否让stripe延伸到block边界取决于你和上下左右邻居block的连接方案。如果每个block独立做PG分析stripe建议伸出边界方便后续在顶层用高层金属再统一缝合如果block是硬核不打算做顶层缝合stripe到底就可以了避免引入boundary上不必要的短路风险。3.3 followpin和sroute最后一公里的连接stripe和ring画完之后必须通过followpin和PG vias把它们接到标准单元的VDD/VSS pin上。这个过程在Innovus里一般用sroute或专门的PG router实现globalNetConnect VDD -type pgpin -pin VDD -all globalNetConnect VSS -type pgpin -pin VSS -all sroute -nets {VDD VSS} -allowJogging 1 -allowLayerChange 1globalNetConnect是把网表中的VDD/VSS逻辑net和物理pg pin对应起来这个不写后面全部白连。sroute是把已在layout上的PG网络通过metal shape和via真正连接起来允许jogging可以自动绕开障碍。很多项目在这里出的问题不是命令不会写而是忘了关注via连接是否真正打通。stripe在高层、followpin在M1中间穿越M2-M5层层金属每一对相邻层之间都需要打via。如果中途某一层信号绕线把via位置占了sroute会绕出去产生若干不可预测的细长金属段这些地方就是日后EM失效的种子。所以sroute完一定要跑一次PG DRC检查确认没有断头金属和悬空via。4. 第三步处理macro电源环与特殊单元的供电很多设计里功耗的大头不是标准单元而是SRAM、PLL、SerDes这些硬核macro。给macro供电的方式和处理普通标准单元完全不一样新手在这里容易踩大坑。4.1 Memory和IP的PG pin怎么接硬核macro在物理库中已经定义好了自身的PG pin位置和层次比如某个SRAM的VDD pin只出现在M4层上方某一小段你只能在那一层去对接它不能随便用高层stripe去“覆盖”它。常用的做法是先给macro单独加一圈power ring用addRing指定-type block_ring将这个ring连接到macro本身的PG pin上再把block_ring和周围的主stripe网络用高层金属连起来。这样电流从远端stripe先汇集到macro ring再通过ring均匀铺到macro的PG pin上避免远端pin直接靠长细金属供电导致IR drop爆表。加macro ring的命令示例addRing -nets {VDD VSS} \ -type block_ring \ -around each_macro \ -layer {top bottom metal6 metal7} \ -width 4.0 \ -spacing 1.5-around each_macro会自动对每个macro生成独立ring。不过要提醒一句对数量特别多的小macro比如几百个标准单元级别的RAM bitcell开block_ring可能让面积浪费巨大。我的处理方式是面积小于某个阈值的小IP直接用周边stripe覆盖取电不给它单独开环面积大、电流大的IP比如大容量SRAM、PLL才单独加环。4.2 Power gating单元与多bit FF的供电做低功耗设计时Power gating意味着有些区域在休眠状态下电源被切断需要专门的isolation cell、level shifter和power switch cell。这些单元的供电关系更复杂switch cell的门控信号可能来自常开电源域而输出却要供给关断电源域。在Innovus里不同电压域之间的PG网络是相互独立的。你用addStripe的时候必须指定这个stripe属于哪个voltage area命令里加上-voltage_area参数或者在顶层UPF定义里约束好addStripe -nets {VDD_SW VDD} \ -layer metal7 \ -direction vertical \ -width 3.0 \ -spacing 2.0 \ -set_to_set_distance 80 \ -voltage_area {PD_DSP}不同电压域的电源网络不能靠金属直接合并否则就是短路。它们之间只能通过level shifter和isolation cell定义的逻辑通路连接。很多第一次做多电压域项目的人在画PG网络时习惯性把VDD全连一起结果电源域隔离没做好跑LVS时发现不同电压域之间透过金属短路了。4.3 IO与ESD供电要注意独立域IO区域通常有独立的供电比如VDDIO和VDDPST电源域。IO单元本身的ESD结构和电平转换结构对地回路非常敏感PG网络必须单独成环不能和core电源混用。如果你在IO ring区域既放了core VDD的stripe又放了IO VDDIO的stripe两层金属在不同走线方向时可能没直接短路但via一旦打错位置就会把core和IO电源短路。我做IO Powerplan时都会强制检查一条规则core power的PG网络不能以任何形式进入PAD ring区域反之亦然。两套网络之间如果有交叉至少在两层金属之间预留足够的隔离带切不可为了省布线资源强行贴合。5. 第四步PG Via的补齐与电源域验证Powerplan做完骨架只是第一步真正让这个网络具备供电能力的是via。很多时候IR drop分析一大片红根因不是stripe不够而是via打得太少、打得太小。5.1 PG Via为什么会被DRC疯狂报错高层stripe要接到M1 followpin中间经过多层金属和多个via层。比如M7 stripe接到M1 followpin至少要经过V6、V5、V4、V3、V2这五层via阵列。信号绕线时也会把某些层的track占掉导致via没有地方打PG router只能绕行或者生成不完整via阵列。Innovus里有专门的PG via命令比如addPdnVias -nets {VDD VSS} \ -voltageArea {PD_CORE} \ -vias {VIA7 VIA6 VIA5 VIA4 VIA3 VIA2} \ -pattern all-vias列出了要创建的via层-pattern all表示在stripe与下方金属交叉的全部位置上打via。另一种做法是-pattern fixed加上-rowcol参数指定打2x3阵列、3x3阵列等。这里面的原则是阵列尺寸越大通路电阻越小但占用的track资源和DRC风险也越高。5.2 Via密度和分布的经验判断怎么判断via是否够我的经验做法是做一个对比实验先在所有可能位置都打满via跑一次IR drop再按正常做法打via跑一次两次结果的差距如果很小说明网络主要是被stripe电阻限制via数量足够如果差距明显说明via是瓶颈。在实际项目里一般不会为了最极限性能把via全部打满因为绕线资源很宝贵我通常会把IR drop结果控制在85%-90%的via密度下剩下5%-10%的空间留给后续ECO。另外动态IR drop分析里via阵列的瞬间电流密度比静态分析时更大如果EM margin不够优先增加via行数而不是改stripe宽度。同样增加一倍导电能力via阵列占用的横向面积远小于stripe加宽占用的面积。5.3 不同电源域的PG网络怎么验证PG网络画完之后Innovus的verify_pg_nets或更早版本里的check_pg_net这类检查工具可以验证每个PG pin是否都有金属路径连接到对应的global net。我自己的检查顺序是先用GUI里显示PG网络的物理shape颜色目视确认每个macro、每个电压域的ring和stripe分布。跑verify_pg_nets确认每个instance的PG pin都有连接。给网络中注入单位电流跑一遍快速仿真查看各节点压降分布。跑LVS的前身检查——verifyConnectivity确认不同电源域之间没有金属短路。这四步缺一不可。特别是不同电压域之间如果UPF定义里PD_CORE的VDD和PD_IO的VDDIO在逻辑上不同但在物理PG网络上通过金属shape连在了一起check_pg_nets不一定能发现因为两个net都是合法的电源网络。这时候必须靠verifyConnectivity或LVS来抓短路。6. 第五步IR Drop与EM的快速闭环验证Powerplan做完不代表事情结束了真正的裁判是IR drop和EM仿真。这一步不是走到signoff才做而是在powerplan初步完成后就马上做一轮分析发现问题立刻回头修stripe和via。6.1 用什么工具做IR Drop分析传统上Innovus自带的分析功能可以直接做PG网络的IR drop分析但精度有限尤其是动态分析。目前主流做法是导出进行VCLP/Voltus/RedHawk这类专业电源完整性工具做sign-off级分析。我个人项目的做法Powerplan草图阶段用Innovus内置的快速分析跑看整体的压降分布趋势等placement基本稳定后导出寄生参数到Voltus做精细分析这时候的结果才作为后续PG ECO的依据。RedHawk的精度更高但配置复杂我一般留到最终的IR drop signoff和EM signoff。6.2 快速分析的具体操作流程在Innovus里跑一遍快速IR drop步骤不复杂set_power_analysis_options -output_dir ir_drop_out create_power_supply_groups -netlist all -quiet set_power_analysis_mode -reset -method static report_power -rail_analysis_format VS -out_file power_report.txt run_power_analysis -output_file ir_drop跑完之后重点看两份结果vdd_avg_map里的电压云图红色区域就是IR drop严重的地方以及em_map里的电流密度云图亮色区域就是EM风险点。看电压云图有个技巧不要只看整体最低电压点而要看红色区域是否覆盖到了关键路径寄存器或大扇出buffer。有些IR drop红的区域周围全是闲置单元影响不大但如果红色区域正好覆盖在时钟树的CK buffer或者高翻转率的数据路径上哪怕低压值是99%还是100%都必须处理。6.3 IR drop修复手段的优先级怎么排IR drop红了修复手段按成本和效果排序如下补via针对局部via不足的地方加via阵列成本最低对绕线影响小优先做。加stripe在IR drop热点附近补一条高层stripe宽度不用很大另外需要注意stripe延伸方向能否接通到附近的电源ring或更粗的供电主干。调整macro位置如果IR drop热点出现在某个大功耗macro边缘说明macro离供电主干太远这个时候回頭调整macro位置比后面加一百根stripe都管用。降低局部功耗密度如果红色区域是瞬时电流尖峰造成的动态压降可以考虑对局部逻辑做clock gating或power gating优化减小瞬间抽电流幅度。以上前两条是后端工程师在Powerplan阶段就能解决的后两条需要和前端、架构协同所以越早发现越好。等到顶层走完线再发现IR drop问题只能靠补via和加stripe硬扛代价大、效果有限。7. 那些年我在Powerplan上踩过的坑最后分享几个我做Powerplan走过的弯路每一条都是真金白银换来的教训希望后来者别再踩一遍。7.1 同一个Layer上VDD和VSS紧挨着放布满整层刚开始做后端时我为了追求供电密度把同一层金属上VDD和VSS stripe紧挨着排了一整层。结果DRC没报错但同层相邻金属会产生很强的耦合在动态翻转时VDD/VSS之间的噪声变大局部时序反而崩了。后来我养成了习惯同一层金属上相邻的同向stripe尽量保持较宽间距给噪声留缓冲空间。真正的高密度供电靠的是多层交叉网络而不是单层堆满。7.2 “电源域跟着floorplan走”不是一句空话多数项目的多电压域划分在floorplan阶段就定死了物理边界。如果你在floorplan阶段把PD_DSP的边界画歪了或者让两个电压域在物理上重叠了一小块那么Powerplan阶段不管怎么加stripe、打via那两个域之间都会出现连不干净的区域LVS怎么修都报short。我的建议是floorplan完成之后先把电压域边界和UPF定义对一遍确认没有overlap再开始Powerplan否则事后返工的成本高得离谱。7.3 Strap越宽越好是最大的误区有人觉得VDD/VSS stripe越宽越稳实际不是。stripe变宽会占用大量绕线资源尤其是信号线的track导致信号线被迫绕行线长增加、时序变差、congestion上升。最坑的是顶层金属宽度超过一定值后光刻工艺对宽金属的填充规则会更苛刻比如需要加slotting反而引入额外的电阻不连续性。我的原则是stripe宽度满足IR drop目标即可不要为了“心理安慰”加太宽把省下来的资源留给信号绕线。7.4 每代项目的Powerplan check清单踩了无数坑之后我现在给每颗芯片的Powerplan都固定套用一套检查清单项目开始前逐项确认[ ] 供电链路图是否画清楚package到PAD到ring到stripe到rail每段的电流预算[ ] 是否区分了core电源、IO电源、analog电源每个域的PG网络是否独立[ ] 每个macro是否有明确的供电方案ring还是stripe覆盖[ ] PG via阵列是否覆盖了所有stripe与下方金属的交叉位置[ ] 是否用工具跑过快速IR drop分析热点区域是否全部定位[ ] 不同电压域之间是否做了connectivity检查确保没有物理短路[ ] 是否对EM热点做了标记和修复尤其是via和宽线变化处把这份清单跑完Powerplan这步基本不会出大问题后面placement和routing阶段可以把精力集中在时序和绕线上不用天天被IR drop问题拉回去返工。Powerplan是个典型的“慢工出细活”环节看起来只是摆金属线实际上需要你不光会用工具更得懂电流怎么走、电阻怎么算、via怎么打。希望这篇文章能帮你少走点弯路如果你在自己项目里遇到具体问题欢迎来交流我们一起讨论。