最近连续被几个做数字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与EM
Powerplan的所有决策,最终都要落到两个指标上来检验。
IR Drop(压降):电流流过电源网络中的金属电阻,会产生压降。公式很简单,V=IR,但难点在于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的block,M7上做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 macro,ring还是必要。
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方向走metal6,left和right方向走metal7,不要上下左右全用同一层,否则四个角上via堆叠反而制造EM热点。
环的宽度不是拍脑袋定的。我的经验值:40nm工艺下,一个功耗约0.5W、面积约1平方毫米的block,power 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这层通常走vertical,metal6对应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怎么打。希望这篇文章能帮你少走点弯路,如果你在自己项目里遇到具体问题,欢迎来交流,我们一起讨论。