
做密码功耗分析的人应该都有过这种经历版图布完了时序也差不多收敛了高高兴兴把数据导出准备跑一轮IR drop签核结果没一会儿就被一条红色告警拉回现实——某块模块的电压降超标了。然后就是焦头烂额地查电源网格、查激励、查功耗模型折腾半天才搞清楚问题出在数据准备阶段。Voltus是Cadence家的功耗分析工具在先进工艺节点上几乎成了后端物理签核的标配。它主要做静态功耗分析也就是静态IR drop分析、动态IR drop分析、电迁移EM检查还能输出整芯片的功耗报告。这篇文章就沿着一条完整流程走一遍从DEF、SPEF、CPF这些数据准备到Voltus里读入设计、配好电压源、跑静态IR分析最后怎么看报告、怎么定位热点。过程中我会把实际工程里踩过的坑、容易忽略的细节一并拿出来说尽量让刚接手功耗签核的工程师少走弯路。1. 先把概念对齐静态功耗分析到底在分析什么1.1 静态IR drop不是算“漏电”很多刚接触这个领域的人看到“静态功耗分析”会下意识以为是算leakage power也就是晶体管漏电流。这个理解有偏差。Voltus里的“静态功耗分析”真正指的是static rail analysis或者叫static IR drop analysis核心是分析电流流过电源网络金属电阻时产生的直流压降公式就是最简单的欧姆定律Vdrop I × R。I是流过电源网络的电流R是供电路径上的金属电阻两者相乘得到压降。为什么关心这个压降因为标准单元和宏单元对供电电压有明确要求。当一个cell的VDD引脚电压从0.8V掉到0.75V时序余量会明显变差严重时功能都出错。所以静态IR drop是sign-off项目是流片前必须确认的物理指标。Voltus在这轮分析里也会顺手统计各单元的动态功耗、内部功耗、漏电功耗但主输出是电压降分布这是理解整个工具定位的关键。所谓“静态”是指不引入时间维度。我们不看某个时钟沿瞬间的电流尖峰而是假设芯片工作在一个平均功耗的稳态下求解供电网格的电位分布。相比动态IR drop静态分析速度快、覆盖全芯片适合第一时间把电源网格的结构性瓶颈找出来。1.2 Voltus在整个功耗签核流程中的位置在Cadence设计流程里Innovus做完布局布线之后把DEF、SPEF、SDC等数据导出接下来就可以交到Voltus做功耗和IR分析。Voltus和Innovus共享同一套数据库格式天然省去了很多跨工具转换的麻烦这也是它在实际项目中越来越常见的原因。Voltus能做的还不止静态IR drop。它可以做动态IR分析考虑开关噪声和瞬时电流、电迁移EM检查、power switch分析、bump和封装级供电分析也能输出带hierarchy的功耗报告。实际项目里很多团队先用静态分析把电源网格的硬伤排掉再针对关键模块做一轮动态分析两者结合完成签核。1.3 静态 vs 动态什么场合用哪个静态分析和动态分析的差异我习惯用这张表来说明对比项静态IR drop动态IR drop输入平均功耗 / vectorless翻转率带时间窗口的功耗波形或VCD输出稳态压降时间维度上的最差压降计算成本低适合全芯片快速扫描高适合局部关键模块典型规格静态drop ≤ 3% VDD动态drop ≤ 10% VDD主要风险无法捕捉瞬时噪声依赖输入激励完整性实际工程中的经验是先把静态分析跑通确认整颗芯片的电源网格没有明显的窄金属、欠via、供电入口分布不均衡等问题。静态结果干净动态分析通常不会大面积爆表。但反过来动态分析里开关噪声引起的局部电压尖峰静态分析是看不到的所以两个都不能省。2. 开工前先备料输入文件与数据准备2.1 必需的输入文件清单跑一次完整的Voltus静态功耗分析需要准备下面这些文件文件类型作用关键说明Tech LEF / LEF定义金属层、通孔、单元边界和电源端口位置tech lef必须先读否则后续层次信息缺失DEF实例摆放、电源环/条纹/轨道的几何与连接关系电源网络的所有物理信息都在这SPEF互连寄生参数必须包含每个segment的电阻否则无法求IRSDC时序约束用于翻转率推断和时钟网络识别SAIF / VCD翻转率/活动因子数据可选没有时用默认togglelib标准单元/宏单元功耗与时序模型内部功耗和漏电功耗数据必须完整CPF / UPF电源域定义、电压域划分多电压域设计必需VSRC / 封装模型描述芯片供电入口位置和电压直接决定IR drop绝对值注意SPEF这一栏我标了红色级别的重要性。Voltus求解IR drop的前提是供电网络有完整的电阻模型。如果SPEF是用快速提取模式生成的只记录了节点电容而缺少分段电阻工具根本无法求解电压降或者求解结果完全不可信。所以准备SPEF之前先确认提取命令有没有带出R最好打开文件看一眼里面有没有R字段。2.2 工程目录与数据版本管理跑功耗分析不止是敲几条命令那么简单数据管理做不好后面对账都会很痛苦。我一般会在项目里建一个专门的voltus工作目录结构大致这样${DESIGN}/voltus/ ├── lib/ # lib, lef, cpf ├── data/ # def, spef, sdc, saif ├── run/ # 脚本以及Voltus工程文件 └── report/ # 输出报告和日志数据文件命名一定要带版本或者时间戳。我见过太多次“DEF是昨天导出的、SPEF是上周的、instance数量对不上”这种低级事故。比较好的做法是写一个简单的核对脚本跑之前自动检查DEF里的instance数量、SPEF里的net数量、lib里的cell数量是否匹配。发现对不上就立刻停不要带着错误数据往下跑否则后面所有分析都是在浪费时间。2.3 从PR数据搬到Voltus前的小检查在Innovus里导出数据之前有几个建议先确认所有power pin都做了globalNetConnect不能有悬空的电源引脚。saveDesign前检查有没有未修完的dangling net。导出SPEF时选择包含详细R的选项不要为了省时间用简化RC模式。确认SDC的时钟定义和STA flow里一致特别是generated clock否则翻转率推断会偏差。数据准备阶段多花十分钟后面能省下好几个小时的问题排查时间。这个环节偷懒后面几乎所有异常都要回来怀疑数据。3. 设计导入与电源网络识别3.1 启动Voltus与工程建立数据备齐后进入Voltus环境。命令行启动的方式很简单voltus -design top -log voltus_top.log启动后是一个Tcl风格的交互环境。我个人的习惯是所有操作全部写成脚本不用交互命令。原因很简单跑一次完整的静态IR分析可能要几小时没人愿意每次都敲一遍命令脚本还可以放进回归流程里实现功耗分析的自动化。内存方面提前有个心理准备。几千万门的设计读完SPEF之后Voltus内存占用轻松到70GB以上更大的芯片要到100GB甚至更多。如果服务器内存吃紧可以先按block拆分做初步分析或者用简化精度跑一遍快速摸底。硬扛不一定扛得住。3.2 读入LEF/DEF并检查电源网络启动之后第一步是读入工艺库和版图数据read_lef {/process/tsmc7nm_tech.lef \ /lib/stdcell_7nm.lef \ /lib/macro_7nm.lef} read_def /data/top.def读完后不要急着往下走先做一次完整性检查check_design report_power_nets这两个命令能快速暴露电源网络识别问题。常见情况是某个macro的电源pin在LEF里叫VDDCE但DEF里对应net叫VDD_MEM两边名字对不上导致Voltus认为这个pin没接电源。日志里会报“Power pin VDD on instance u_ram is not connected”之类的话看到这类告警一定要追不能忽略。3.3 读入寄生参数与活动数据电源网络确认没问题后读入SPEF、SDC和SAIFread_spef /data/top.spef read_sdc /data/top.sdc read_saif /data/top.saifSPEF解析是整个导入阶段最耗时的一步。日志里如果出现大量“net not found in DEF”的warning基本可以断定DEF和SPEF不是同一次导出建议回去对齐版本。SAIF文件用来标注翻转率。如果SAIF覆盖率不够Voltus会用默认toggle rate填充缺失部分但这个默认值往往和真实工作场景差很远。后续查看功耗报告时一定要看“annotated ratio”标注率低于70%的结果只能看趋势不能作为签核依据。3.4 导入电源意图与功耗库多电压域设计必须有电源意图文件CPF或者UPF都行load_cpf /power/top.cpf # 如果用的是UPF则 source top.upfCPF/UPF定义了power domain的划分、每个域用哪个电源网络供电、level shifter和isolation cell怎么处理。少了这一份Voltus会把所有instance默认挂在一个电源网络上多电压域设计的结果必然错误。紧接着是功耗库set_power_library -lib \ /lib/stdcell_vdd_0p8v.lib \ /lib/stdcell_vdd_0p72v.lib \ /lib/macro_ddr_lib.lib这里最容易犯的错误是库选错corner。IR drop签核一般用ss corner的电阻和功耗数据如果用typical corner电阻偏小、IR drop偏乐观签核风险很大。确认lib的PVT和sign-off策略一致是最基本的要求。3.5 核对功耗模型是否命中数据导入完成、正式开始跑分析之前强烈建议先抽查几个instance的功耗模型是否正常report_power -instance u_ddr_phy/mem_ctrl_0 -verbose看这个instance的internal power和leakage power是不是合理数值。如果全是0说明lib里的功耗模型没对上可能是cell name不匹配也可能是macro的energy model缺失。这个时候回去补库不要硬跑分析否则后面所有IR结果都会是错的。我做功耗签核有个习惯真正跑全芯片之前先挑一个功耗已知的模块单独算一份手写功耗估算和Voltus的输出对一下数量级。对不上就排查对上了再全量跑。这比直接跑完再怀疑结果高效得多。4. 静态功耗分析关键配置与运行4.1 分析模式选择vectorless还是vector-based静态IR分析有两种数据驱动方式vectorless和vector-based。两者适用场景完全不同。对比项VectorlessVector-basedSAIF/VCD活动数据来源默认toggle rate static probability仿真产生的真实活动数据分析速度快慢尤其VCD很大时精度中等依赖默认翻转率合理性高依赖覆盖率和数据完整性适用场景早期评估、全芯片回归关键模块、签核验证全芯片静态IR drop扫描vectorless其实够用速度足够快。但如果某个模块有明确的高负载场景比如DDR跑到最高带宽那就用对应场景的SAIF去分析更贴近真实工作状态。使用SAIF时有一个很容易踩的坑SAIF文件里的instance path和当前design的hierarchy名字必须完全一致。很多低标注率问题不是SAIF数据本身的问题而是顶层模块名在综合时被改过导致路径对不上。遇到标注率异常低的情况先检查hierarchy名字。4.2 VSRC电压源与封装模型设定电压源设置是静态IR drop分析中最影响结果绝对值的一步。VSRC描述的是芯片供电入口的位置和电压值命令一般这样写set_power_analysis_options -power_net VDD -ground_net VSS create_vsrc -type simple -net VDD -voltage 0.8但真正到量产级设计VSRC不能随便放。我的意思是不能简单粗暴地在每个power port上挂理想电压源。那样等于告诉工具“每个供电入口都是0.8V”IR drop结果必然偏乐观。正确的做法是根据封装形式放置VSRCWire Bond封装VSRC放在pad和power pin附近。Flip-Chip封装VSRC放在bump球阵列的实际坐标上。Voltus支持从文件读取bump listcreate_vsrc -type file -file bump_coordinates.csv这个csv里包含每个bump的坐标、所属net和电压值。如果封装数据拿不到也要拿package model反推一个合理的供电入口分布。VSRC放错了位置整轮分析的绝对值都是错的协议上再好看也没用。4.3 关键阈值与去耦设置静态IR drop的规格通常按照供电压降百分比来定业界常见的标准是静态IR drop ≤ 3% VDD动态IR drop ≤ 10% VDD更严格的项目会要求静态IR drop ≤ 2% VDD在Voltus里可以通过选项把规格写进分析配置set_power_analysis_options -rail_tolerance 0.024这样工具在报告里可以直接标出哪些instance超标不用自己再Excel里算一遍。0.024就是0.8V的3%也就是24mV。此外如果后端实现阶段还没开始插decap可以在Voltus里先跑一轮decap分析让工具估算热点区域需要的去耦电容面积作为后续布局布线的参考。这个功能不复杂但能帮后端同事提前定位风险区域。4.4 运行静态IR分析并监控收敛所有配置就绪后正式运行分析run_analysis -type static_irt -tag TOP_IRT这个过程会构建供电网络的大规模电阻矩阵并求解所以在日志里会看到“solving rail network”之类的信息。求解阶段要关注两个东西迭代次数和残差。如果日志报出“singular matrix”或者求解不收敛很大概率是电源网络有断开的地方——某个供电孤岛没有和主电源网络连上通常是power switch没有正确开启或者某个电压域的隔离没有处理好。CPU并行核数记得设置到位set_option -num_cpus 32全芯片静态IR分析的时间从几十分钟到一晚上都有可能取决于设计和服务器性能。跑完之后分析结果会存在一个tag对应的database里后续可以反复查看和导出。5. 报告生成与热点定位5.1 常用报告命令与字段解释分析跑完接下来从报告里挖信息。最常用来生成报告的几组命令report_rail_analysis -type voltage_drop -tag TOP_IRT \ -format text -output report/top_ir_drop.rpt report_power -tag TOP_IRT -format text -output report/top_power.rpt打开IR drop报告核心字段一般是这么几列Net、Instance、Pin、Voltage、Drop(mV)、Drop(%)、坐标。报告尾部通常会有汇总列出worst drop的具体位置。比如Total rail voltage drop: 32.5mV Worst instance: u_ddr_phy/xbuf_12/VDD Worst drop: 32.5mV (4.1%)看到worst drop那一刻第一反应不是改版图而是先看这个位置是否合理。如果worst drop出现在电源网格稀疏的角落那大概率是网格结构问题如果出现在一个普通逻辑单元上且周围decap铺得很多那就要查这个cell的驱动强度和输入slew是否异常。5.2 从功耗分布看问题源头IR drop的源头是电流电流的源头是功耗。所以报告里的功耗部分同样重要report_power -by_hierarchy -tag TOP_IRT这份hierarchy功耗报告会列出每个子模块的动态功耗、内部功耗和漏电功耗占比。重点关注功耗占比高、同时IR drop也高的模块这两者叠加的位置就是真正的热点。只修IR drop不看功耗分布经常会出现修完A点B点又爆的情况因为问题根源在功耗源不在供电网络。如果某个模块功耗占比异常高要回查它的翻转率是不是被高估了特别是vectorless模式下时钟网络和复位网络的默认toggle rate如果设置太高会直接拉高整个模块的功耗IR drop结果也会失真。5.3 GUI可视化定位热点报告只能告诉你哪里差要想快速理解为什么差建议打开GUI看热力图voltus -design top -gui加载之前跑好的analysis database之后GUI可以显示整颗芯片的IR drop分布图。红色区域一眼就能找到放大到具体坐标对照floorplan看看那个位置是不是缺了power stripe或者是不是正好在macro阵列的供电末端。GUI还可以框选任意区域查询区域内所有cell的压降分布并导出直方图。这个功能在评审场景下特别实用不用拿着密密麻麻的文本报告在会议室里念直接放一张热力图哪里有问题一目了然。5.4 定位之后怎么改修IR drop重点在“热点区域”而不是“worst point”。实际有效的手段主要有这几类增加或加宽电源stripe尤其是高层金属的stripe宽度。增加横向电源rail密度减少电流在单元行内绕行的距离。增加via数量特别是高层供电金属到下层单元电源轨道的via密度。在热点区域附近插入decap就近提供瞬态电流。从逻辑层面降低热点模块的翻转率比如时钟门控的覆盖率。如果是bump分布导致的供电入口不足需要和封装团队协调重新分配bump。每一项改动做完都需要重新提取SPEF、重新跑分析。这个迭代过程没有捷径但是有方法每轮迭代记录改动点和worst drop变化量几轮下来就能找到性价比最高的修复组合。6. 常见问题与排查记录6.1 报告里电压drop全是0或者明显偏小如果IR drop结果小到不合理十有八九是VSRC位置设置太理想或者SPEF里的电阻信息丢失。排查思路打开SPEF文件确认R字段是否真实存在如果只有C没有R需要重新提取。检查VSRC是不是被直接加到了每个cell的power pin上如果是等效于理想供电drop当然小。看日志里是否有“rail network missing”的提示如果电源网络识别不全分析范围本身就是错的。6.2 功耗标注率低导致结果失真跑完后在日志或报告里看到annotated toggle ratio只有60%不用急着分析IR结果。标注率低意味着很大一部分instance的功耗是用默认值估算的结果只能算“摸底”不能算“签核”。排查方向检查SAIF的instance path和design hierarchy是否匹配。检查SDC是否完整时钟网络识别不出来翻转率标注会大面积失效。检查是否所有power domain都提供了对应的翻转率数据。我给自己定的标准是标注率90%以上算可信70%到90%只能看趋势70%以下直接打回重新提供数据。6.3 SPEF合并电阻导致局部精度下降部分寄生提取工具在导出SPEF时会默认合并并行电阻这会让局部电流路径被压缩IR drop结果偏乐观。如果发现报告里某些区域的IR drop分布异常平滑、梯度非常小可能是SPEF被过度化简了。解决方案是在提取SPEF时关闭电阻合并选项或者使用Voltus提供的精度控制选项重新分析。这一项对最终签核尤其重要不要为了省一点文件大小牺牲电阻网络精度。6.4 排障速查表症状可能原因排查方向全部电源电压偏高VSRC电压设置错误确认VSRC电压值与LIB、CPF一致IR drop为0SPEF缺R或VSRC挂在了每个pin上检查SPEF的R字段和VSRC位置某模块功耗为0lib功耗模型缺失或cell名不匹配report_power查看该模块内部功耗大量power pin未连接LEF/DEF的电源net命名不一致核对macro LEF里pg pin名称求解不收敛或singular matrix电源网络有孤岛检查power switch和电压域连接与另一个工具结果差异巨大VSRC模型、SPEF精度或分析模式不一致逐一对齐两边的配置6.5 我最常盯的几个日志关键字跑完一遍分析我一般不会从头到尾读日志而是直接grep下面几个关键字Number of unconnected power pinsSPEF nets not foundInstance without power modelannotated toggle ratio这四个方面的告警数量直接决定了结果能不能信。把这些关键字在脚本里做成摘要每次跑完自动打印出来整个排查起点会清晰很多。与其盯着worst drop数值发呆不如先确认数据可信度这一点做扎实后面对账会省太多力气。有一次跑全芯片静态IR报告里一个内存模块的IR drop高得离谱我盯着热力图看到半夜也没看出网格哪里有硬伤最后翻CPF才发现某个电压域的电压值写错了分析基准从一开始就是错的。从那以后我养成了习惯每次跑之前先把关键电压、关键模块的功耗估算值和手算结果对一遍对不上就绝不停留在分析阶段。这个习惯救过我很多次分享出来真的值得一试。