ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PPPR电源规划实战:Innovus下IR Drop分析与修复

PPPR电源规划实战:Innovus下IR Drop分析与修复 1. 先搞明白PPPR电源规划到底在解决什么问题干过芯片后端的人谁没有被IR Drop折腾过项目跑到签核阶段突然冒出来一堆时序违例排查半天发现不是路径算错而是电源网络太弱标准单元拿到的实际电压早就低于库里的假设值了。这个时候再回头改电源规划往往等于把整个布局布线掀掉重来代价高到让人头皮发麻。我入行那几年这种“IR Drop返工”见得太多所以后来的项目里我养成了一个习惯在place之后、绕线之前必须用Innovus把PPPR电源规划这一整套流程踏踏实实跑一遍。你可能会问PPPR到底是什么不同公司叫法确实不太一样我理解的核心就是电源规划Power Planning、电源布线Power Routing、电源完整性分析Power Integrity Analysis也就是IR Drop和EM分析以及热点修复Repair这四个环节组成的闭环。说白了就是从floorplan阶段开始把整个芯片的供电网络设计出来、连好线、验证够不够用不够再修而不是等到最后才发现问题。这篇内容适合谁看如果你正在做数字后端用的工具是Innovus想搞清楚电源环和电源条带参数怎么给、IR Drop报告怎么看、热点出现后怎么改那这篇文章就是写给你的。后面附的脚本也是我实际改过的版本你拿过去改改层号、间距和宽度基本就能用。1.1 被IR Drop支配的恐惧是每个芯片后端都懂的IR Drop翻译过来就是电压降。电流流过金属走线时因为金属本身有电阻沿路就会产生压降最后到达标准单元电源引脚上的电压一定比电源Pad输出的电压低。这个道理和水管送水一模一样自来水厂出口水压很高但如果你家住在管网末端、楼层又高水龙头出来的水就是细细一缕。芯片里的供电网络就是那个水管IR Drop就是末梢水压不足。电压不够会怎样单元的延时特性是按标准电压建模的电压一旦低于标称值gate delay就会变长。setup slack本身余量就不大IR Drop一叠加路径直接违例。更麻烦的是动态IR Drop翻转电流集中在时钟沿附近局部电压会在极短时间内掉下去这种瞬态掉压会导致hold或setup问题交叉出现很难定位。所以我一直跟组里新人强调IR Drop不是“可选项”它是功能、时序、功耗之外的第四根支柱别等签核了才想起来。1.2 PPPR不是某个单一工具而是一套闭环流程PPPR这名字听起来像某个工具的专有名词但实际干过项目的人都知道它更像是一套方法论。步骤拆开看就四步第一是规划在floorplan阶段就决定电源环的宽度、电源条带的间距和层叠、macro区域怎么供电第二是布线利用Innovus的addRing、addStripe、sroute这些命令把规划变成实际图形第三是分析用工具去仿真IR Drop和电流密度输出报告和热点图第四是修复根据热点位置加宽、加密或者调整供电拓扑然后再重新分析直到收敛。这个闭环越早跑起来收益越大。我见过很多项目floorplan阶段根本不看电流需求随便拉个电源环就往下走结果到了中后期发现某一块区域的stripe间距太大动态压降超标只能砍掉一部分绕线资源来补电源金属既耽误时间又影响密度。反过来如果早期就用低精度模式快速跑一版IR Drop把明显的问题在place阶段就解决掉后面签核时基本就是微调。我用Innovus做这件事比较多一方面是因为Innovus的电源规划命令本身就很成熟另一方面是它能和Voltus、PrimeTime PX这些分析引擎联动直接在同一套数据库上完成电源网络设计、分析和修复不需要来回倒数据。这套流程吃透了换到其他工具链也只是命令换个名字而已底层思路是完全通用的。2. 电源网络设计的底层逻辑决定你后面会不会返工很多朋友拿到工艺库就开始敲addRing参数全是默认值或者干脆照抄老项目的脚本这其实是电源规划里最容易踩坑的地方。电源环宽度、条带间距、金属层选择这些参数跟工艺、功耗规模、floorplan形状关系太大了。老项目能用不代表你现在能用芯片面积大了一圈、电流密度完全不同照搬往往要出问题。这一章我先把设计逻辑捋清楚。理解了为什么这么给参数你再看第三章的脚本会有一种豁然开朗的感觉。我一直觉得做后端的人手里要有“计算器”思维而不是“快捷键”思维。2.1 Floorplan阶段的几个决定直接影响电源质量电源规划从来不是从addRing开始的而是从floorplan摆macro那一刻就开始了。原因是电源网络要绕过macro、IP、memory如果这些block摆得乱七八糟stripe走过去要么被cut断要么绕出大弯供电效果都大打折扣。我在floorplan阶段一定会做三件事第一看电源需求大的模块集中在哪里比如高性能CPU cluster、大容量SRAM阵列这些区域需要局部加密stripe第二给模拟IP、PLL、高速接口这类对噪声敏感或对IR Drop有特殊要求的模块提前留出干净的供电通道别让数字stripe压在它们头上第三确认power domain的划分不同电压域要保证供电网络物理隔离不能出现两个电压域共用一个stripe的事情。这些前期判断直接决定了后续电源规划是顺水推舟还是四处救火。另外一个容易被忽略的因素是IO Ring也就是Pad Ring。芯片整体的供电入口通常在IO区域电源从Pad进来后要通过环形电源网络power ring分配到各个stripe。如果IO区域拥挤或者电源Pad数量不够就算core里stripe拉得再密入口处的瓶颈也会让IR Drop居高不下。所以floorplan阶段就得估算电流总量和IO电源Pad数量是否匹配不要等流片了才来后悔。2.2 Power Ring、Stripe、Rail到底谁管谁新手最容易混淆的就是Ring、Stripe和Rail这三个概念我在这里一次说清楚。Rail是最底层的标准单元电源轨也就是标准单元row边上那两根又细又长的VDD和VSS走线它一般在Metal 1或Metal 2上工艺库已经定义好了后端工程师不需要手动画但必须保证它们最终被正确接上电源网络。Ring是包在core或者macro四周的环形电源走线起到汇集电流的作用。它通常由两层金属组成一层横向、一层纵向通过via连接起来。Ring的作用相当于城市里的环线把从四面八方来的电先收拢起来再分发给内部道路。Stripe则是横跨core区域的一条条长条形电源走线作用是把Ring里的电流送到core内部的每一行cell去。Stripe通常用高层厚金属来做也就是M5、M6、M7这些因为高层金属电阻更小单位宽度能传送的电流更大。三者关系你可以想象成Ring是总水管的环形主管道Stripe是从主管道伸向城市各区块的支干管Rail就是最后接到每家每户水龙头的那一小段管子。设计目标是让每一段都不出现瓶颈Ring不够宽、Stripe太稀疏、Rail连接via不够多都会成为制约供电的短板。2.3 宽度和间距不是拍脑袋定的要算EMPower Ring和Stripe的宽度、间距大家一般会参考foundry的EM电迁移规则来定但也可以自己做快速估算。EM规则的核心是金属层能承受的电流密度通常用单位截面允许流过的电流来表示比如多少mA每um。如果某一条power stripe需要承载100mA电流而该金属层允许的电流密度是50mA/um那么这条stripe的最窄宽度至少是2um再考虑到工艺偏差和温度我一般还会留1.5到2倍的余量。举个例子一个模块总电流估计是6A如果分成20条vertical stripe供电那平均每条承担300mA。假设用的是M6层允许电流密度为60mA/um理论宽度就是5um。但这种均匀分配是理想情况实际靠电源Pad近的stripe电流会更大所以我通常会直接拉到7到8um宽也就是多留30%以上余量。别觉得浪费面积IR Drop一旦出事改起来消耗的时间精力远不是这点面积能比的。间距的确定更多取决于IR Drop预算。芯片设计一般会定一个允许的IR Drop百分比比如动态压降不超过5%静态不超过10%。压降和电源网络的等效电阻成正比stripe间距越大单个区域从stripe取电的距离越远横向rail上的压降就越大。工艺库里通常提供rail的方块电阻你可以用欧姆定律估算一个最大间距再结合项目经验收敛。我在0.8V左右的核心电压下M6/M7的stripe间距一般控制在40到60um之间具体要看电流密度。3. 手把手配电源网络完整可直接改的Innovus脚本理论和参数讲完了现在进入实际操练环节。这一章我会带你从头到尾把PPPR电源规划脚本搭起来。这个脚本我在多个项目里改过基本逻辑是通用的你只需要把工艺层号、宽度、间距、设计名这些变量换成你自己项目的值就行。我写脚本的习惯是所有可变参数都用变量放在文件顶部不要散落在命令里。这样后期调整只需要改一行定义不用满文件找参数也方便用脚本生成多组实验配置。特别是IC设计是一版一版迭代的把参数集中管理能省下大量反复试错的时间。3.1 数据准备与电源网络声明在跑任何电源规划命令之前先确认三件事设计已经导入Innovus并且完成了初步floorplan逻辑库和物理库已经配置好更重要的是电源网络的定义已经正确声明。没有声明电源网络就急着画stripe后面很容易出现stripe画了一半找不到VDD/VSS网络或者标准单元的PG pin根本没有连接到电源网络的尴尬状况。我通常在Innovus初始化脚本后面加这么一段# 设计相关变量 set DESIGN_NAME chip_top set TECH_FILE /path/to/tech.lef # 电源网络定义 globalNetConnect VDD -type pgpin -pin VDD -inst * -override globalNetConnect VSS -type pgpin -pin VSS -inst * -override globalNetConnect VDD -type tiehi -inst * -override globalNetConnect VSS -type tielo -inst * -override这段代码的作用是把VDD和VSS这两个特殊网络自动连接到所有标准单元和macro的PG pin上。-type pgpin负责物理电源引脚-type tiehi和-type tielo负责逻辑上接到高和低电平。很多人只写了前两行忽略了后面两行结果后面仿真或者检查连接性时莫名其妙报一堆问题。3.2 电源环Power Ring怎么加Power Ring是供电网络的外围框架。用了Innovus里专门的addRing命令参数很多但核心就三个画在哪些层、多宽多疏、离core边界多远。我这里给一个最常用的写法set RING_W 6.0 set RING_SPACING 1.0 set RING_OFFSET 2.0 set RING_CORE_OFF 5.0 addRing \ -nets {VDD VSS} \ -around core \ -layer {top M7 bottom M7 left M6 right M6} \ -width $RING_W \ -spacing $RING_SPACING \ -offset $RING_OFFSET \ -core_offset $RING_CORE_OFF这里的关键是把横向top/bottom和纵向left/right放在不同金属层上。因为横向走线如果和纵向走线完全同层它们相交的地方没法直接连接必须通过via跳层反而增加电阻和复杂度。通常做法是一层走水平方向、一层走垂直方向在四角用via对接形成一个完整的闭合环。-core_offset控制的是ring与core边缘的距离-offset是ring与blockage之间的距离这两个值不要设太大否则浪费面积也别设到0避免后续placement和routing出现挤迫。如果你有多个macro也可以让addRing围绕macro画微环也就是-around macro加-ring_target macro这样每个macro自身有电源环再与core ring连接可以显著改善大IP供电。3.3 电源条带Power Stripe怎么加Ring只是框架真正给core内部供电的是Stripe。Stripe设计有几个核心参数方向、层、宽度、间距、set_to_set_distance以及是否允许jogging。我的惯例是横向stripe和纵向stripe各画一组分别在不同层形成网格结构。set STRIPE_W 5.0 set STRIPE_SPACE 1.0 set STRIPE_DIST 50.0 set STRIPE_OFFSET 5.0 # 纵向stripe走M6 addStripe \ -nets {VDD VSS} \ -layer M6 \ -direction vertical \ -width $STRIPE_W \ -spacing $STRIPE_SPACE \ -set_to_set_distance $STRIPE_DIST \ -max_same_layer_jog_length 20.0 \ -padcore_ring_bottom_offset $STRIPE_OFFSET \ -padcore_ring_top_offset $STRIPE_OFFSET # 横向stripe走M7 addStripe \ -nets {VDD VSS} \ -layer M7 \ -direction horizontal \ -width $STRIPE_W \ -spacing $STRIPE_SPACE \ -set_to_set_distance $STRIPE_DIST \ -padcore_ring_left_offset $STRIPE_OFFSET \ -padcore_ring_right_offset $STRIPE_OFFSET这里面最需要理解的是set_to_set_distance。它指的是同一条电源网络上相邻两条同方向stripe中心线之间的距离。这个值决定了横向rail最长要走多远才能取到电直接关系IR Drop。这个距离也不是越小越好stripe太密会大量占用绕线资源影响信号布线所以要在IR Drop和可布线性之间取平衡。我在实际项目里一个有效的做法是先按预算算出最大允许间距然后在此基础上加密20%左右作为初值跑一版分析再调整。另外要注意stripe的VDD和VSS两条网络一定是平行交替布置的两个网络宽度、间距最好一致避免电源地不对称引起额外的IR Drop。Innovus画stripe时虽然只写一个addStripe命令加多个net工具会自动交错但如果你手工用别的编辑器改def就要小心这个细节了。3.4 Sroute与PG连接检查电源环和stripe画完后还需要把标准单元的rail和这些高层电源网络连接起来。这个动作叫srouteInnovus会根据单元pad和PG网络位置自动完成rail到stripe的对接。这一条命令会把几十万个连接全部搞定看起来简单但作用非常关键。sroute \ -nets {VDD VSS} \ -allowJogging 1 \ -allowLayerChange 1 \ -blockPinStrategy 1执行完sroute后我强烈建议立刻跑一个连接性检查不要等到绕完线再查。命令是check_pg_connectivity -std_cell_pins_only如果标准单元存在电源断连这个检查会直接报出来。还有一种隐蔽问题就是某个macro的PG pin虽然数量很多但实际有效连接的via太少这种情况下check可能不会报错但IR分析时那个macro区域会明显变红。所以做完整设计时对关键macro最好手工检查一下连接via数量和位置别完全依赖工具自动判断。4. 用Innovus跑IR Drop分析快速定位热点电源网络画完了不代表万事大吉。我一直觉得画电源网络只是把骨架搭起来真正验证设计能不能过签核还得靠IR Drop分析。Innovus本身就能调用分析引擎做这件事流程也不复杂但对很多从前端转过来的人而言逻辑有点绕我在这里尽量给你理顺。4.1 IR分析前一定要做的一件事跑IR Drop分析之前有一个步骤经常被忽略就是先跑DRC。尤其当你改过stripe宽度、层或者间距后电源网络非常容易产生金属short、minimum area违规或者via间距不够的问题。如果带着这些DRC错误去做IR仿真后面热点定位会完全失真浪费时间不说还可能误判根因。我的习惯是在sroute之后先跑一遍verify_drc或者check_routes把电源网络相关的violation过滤出来逐个消化。电源网络DRC错误一般集中在stripe交叠处、ring转角处、via堆叠区域。很多DRC是小错误比如某个stripe长了0.01um但如果不清理会在分析阶段放大成奇怪的异常点误导你的判断。DRC干净后再输出一个Def保存为checkpoint接下来可以放心折腾IR分析。4.2 跑静态与动态IR Drop的命令思路Innovus里的IR分析可以通过Voltus接口来完成。没有装Voltus的流程也可以用PrimeTime PX配合寄生提取联合做。我习惯直接在Innovus的Tcl窗口里跑大概流程是这样# 设置电源分析选项VDD标称电压0.8V动态压降阈值取5% set_power_analysis_options \ -net VDD \ -threshold_voltage 0.76 # 静态IR Drop分析 analyze_ir_drop \ -nets {VDD VSS} \ -analysis_type static \ -outDir ir_static_out \ -format text # 动态IR Drop分析需要翻转率/波形文件 analyze_ir_drop \ -nets {VDD VSS} \ -analysis_type dynamic \ -outDir ir_dynamic_out \ -format text等等这里我需要把threshold_voltage解释一下。这个参数是判断IR Drop是否违例的电压阈值。比如VDD为0.8V动态压降允许5%那阈值就是0.8 * 0.95 0.76V。只要分析出来的实际电压低于0.76V就认为这个区域IR Drop超标会在报告里标成violation。静态一般可以放宽到10%也就是0.72V但动态必须严格按5%甚至更紧因为动态压降发生时间短虽然平均影响不大但在时钟沿附近对setup的影响非常致命。我以前踩过一个坑就是把静态和动态用同一个阈值结果静态分析报了一堆violation花了一周时间去处理后来才发现很多是误报。正确的做法是分开设置阈值静态松、动态紧这样才能把真正的热点圈出来。4.3 把IR Map加载到GUI里怎么看热点分析完成后Innovus的GUI里可以直接加载IR Drop map。你会在版图上看到一层彩色的分布图蓝色表示压降较小、电压充足黄色到红色表示压降逐渐加大、供电不足。我的观察习惯是先看整体色调确认大面积区域是否均匀再看红色区域的位置、面积以及附近有无macro或供电入口最后把violation列表导出来按严重程度排序。热点通常出现在几个典型位置。一个是core中央远离power ring的地方这代表stripe间距过大需要加密stripe。另一个是大macro附近的角落说明macro把电源通道挡住了或者macro本身用电量太大但供电via不足。还有一个是时钟树密集区域动态IR Drop特别容易出现局部热点这种热点往往要靠加decap电容或者调整时钟buffer位置来缓解。拿到这些信息接下来就是有针对性的修复。5. 热点区域修复的优先级与实操策略IR Drop分析出来之后手里的报告不是用来给领导汇报的是用来指引你怎么改设计的。修复IR Drop是一个非常讲究优先级的过程乱改不但浪费资源还可能把本来好好的时序和密度都搞坏。我自己的修复次序这里可以给你参考。5.1 改电源网络比改Floorplan优先IR Drop超标后第一反应应该是改电源网络而不是动floorplan。原因很直白改floorplan影响面太大macro一挪所有时序路径全部变化等于把整个项目推倒重来。而改电源网络是局部动作只要不破坏floorplan的整体布局对逻辑的扰动相对小。电源网络修复按照由宽到窄的顺序做先查ring如果power ring太窄电流从Pad进入ring就饱和了那后面再怎么加密stripe都没用。然后是stripe层如果某一层的stripe间距过大或者宽度不足优先在这一层加密或加宽。再然后是via很多时候不是stripe不够而是stripe与rail之间的via密度不够从IR map上看就是stripe下方颜色正常、stripe之间颜色很红这种一般就是via问题。最后才是加decap或者改placement。5.2 定点补强给热点区域加局部Stripe局部热点不需要全局加大stripe密度那样太浪费绕线资源。Innovus支持给特定区域单独加stripe这个功能在修复热点时特别好用。比如热点出现在右下角某一个矩形区域内我就可以只在这个区域加两条短stripe把电流疏过去而不影响整个芯片的布线资源。addStripe \ -nets {VDD VSS} \ -layer M6 \ -direction vertical \ -width 5.0 \ -spacing 1.0 \ -set_to_set_distance 25.0 \ -area { { 100 100 } { 300 400 } }这里-area后面跟的是左下角和右上角的坐标在这个小范围里做加密。跑完重新sroute再重新分析IR通常热点就会明显改善。不过局部加密stripe要注意一点后续绕线阶段这些多出来的stripe会形成障碍所以要关注一下这个区域的congestion变化避免按下葫芦浮起瓢。补强完stripe之后一定要重新跑DRC和IR分析确认新加的stripe没有和旁边的信号线short也没有引入新的EM违例。这个迭代看起来繁琐但熟练之后每个循环不会超过半天。5.3 一个能落地的迭代收敛流程我常用的迭代流程大概是这样的在place结束后第一次floorplan阶段先快速做一版最粗的电源规划和低精度静态IR分析目标是把大的热点清掉等CTS完成、时钟树初步建立后再跑动态IR分析这时候主要看时钟相关区域的瞬态压降最后signoff阶段用完整寄生参数和真实翻转率跑最终分析。这个流程不会让IR Drop问题一次性消失但可以在每个阶段用最小成本逐步收敛问题。很多人非等到signoff阶段才做分析一旦出问题修改空间已经很小了那才是最痛苦的。6. 常见问题排查与避坑实录最后这一章我把这几年在实际项目中遇到的高频问题和解决办法整理一下。这些问题在文档里不一定写得清楚但基本每个后端工程师都会撞上。6.1 先看一张问题速查表现象可能原因快速排查与解决IR报告里core中心大片红stripe间距过大或宽度不足加密stripe、加宽stripe优先在热点层macro周边红macro电源via不足或者macro屏蔽了stripe增加macro连接via必要时加macro ringstripe下方正常、stripe之间红rail到stripe连接via不够检查sroute结果手工补via或调整sroute参数电源地shortstripe交叠处设计不当查看DRC报告调整不同层stripe间距sroute后标准单元断连PG pin类型定义错或globalNetConnect缺失检查globalNetConnect四行是否齐全重跑动态IR比静态严重很多缺少足够的decap电容在热点区域插入decap cellIR整体正常但个别SPEF路径压降高power net寄生提取不完整检查Lef里电源金属RL定义是否完整6.2 脚本调试和PLog分析的小技巧很多新人写Tcl脚本一上来就是一大段连续命令出错了也不知道在哪里。我写长脚本的习惯是“小步快跑”一段段执行每一段之间加一个puts输出关键的完成状态。比如画完ring之后执行puts Ring DONE画完stripe后执行puts Stripe DONE这样日志里能清楚看到卡在哪一步。另外Innovus的PLog文件一定要会看。工具每次运行都会生成一条条记录里面会记录每次命令的耗时和是否有warning。我发现很多人出问题后只盯着终端屏幕忽略PLog里的warning其实很多隐患在warning阶段就在那里了只是屏幕滚太快没人注意。自己写脚本时也可以把关键变量用report_vars输出到日志里再和预期值对一遍避免变量被后续命令意外修改。6.3 多电压域与Macro供电的几个细节如果你做的是多电压域设计电源规划会比单电压域麻烦一个数量级。每个电压域的stripe要各自独立不同域之间的间距要满足isolation rule同时level shifter和isolation cell的位置会直接影响电源网络规划。我在做多域项目时会为每个domain单独建一组stripe参数并且给每个domain做独立的IR分析不要混在一起看。整体分析只能看趋势真正满足每个domain的压强预算还得分开看。大宏模块比如SRAM供电方式往往不是靠标准单元那种rail直接供电而是在macro内部有专用的PG ring或PG pin分布。画stripe之前先看macro的Lef里PG pin分布在哪些层、哪些坐标位置然后让stripe尽量垂直于这些pin的排列方向这样连接长度最短、via数最少。如果pin在M4stripe在M6sroute时会用via和短跳线连下来要确保中间层没有障碍物否则连接质量会很差。最后说一个我自己的体会电源规划这门手艺经验占一半方法占另一半。方法就是今天讲的PPPR闭环先规划、再布线、后分析、再修复每一步都别偷懒。经验则是靠一个个项目熬出来的踩过的坑越多后面判断越快。你现在拿着这套脚本和流程至少可以避开我当年走过的弯路先把小模块跑通再逐步扩大到全芯片这是我认为最稳妥的学习路径。
返回列表