RedHawk静态与动态电源完整性分析:IR drop/EM排查与修法
发布时间:2026/10/31 5:03:44 锦皓数字建站

简介RedHawk User Guide2021R1 版本用户手册是 ANSYS 官方发布的电源完整性分析工具使用文档面向数字后端工程师、电源完整性分析人员及从事 full-chip 供电网络设计验证的从业者帮助其掌握芯片静态与动态电压降分析的标准流程与方法。手册围绕设计流程展开涵盖设计规划、设计开发与设计验证三个阶段的工具应用并详细说明 TCL 命令用户接口与数据准备方式、静态电压降分析流程与动态电压降分析流程可作为查阅命令用法与流程组织的案头参考。资源包内含 1 个 PDF 文件整体约 11.73MB为单文档结构目录分章节组织便于按主题定位。目前已有 1822 人学习适合需要系统了解 RedHawk 分析流程或在实际项目中查证操作细节的后端工程师与 signoff 人员。1. 签核前一晚被叫去开会做数字后端的大多遇到过静态 IR 报告显示全部无异常动态波形上却出现一处几十毫伏的下陷或者反过来静态报出一堆红色你加了几十条 strap 也没压下去。RedHawk 用户手册处理的就是这类问题它是 full-chip 静态与动态 power integrity 分析的官方操作手册从目录结构、数据准备、功耗计算、电源网格提取一路写到 IR drop 与 EM 的判读、定位和修法。刚接手 power signoff 的人可以照着它把环境搭起来做过几轮项目的人更适合把它当参数词典和排查清单翻尤其是多电压域和动态 VCD 那两章翻车的概率和翻它的频率基本成正比。2. 把设计喂进 RedHawk目录结构、rh_setup.pl 与多电压域数据准备工具跑不动十次里有七次不是工具的问题是输入数据不满足基本条件。这一章按“先搭建目录结构、再运行脚本、最后手工补齐”的顺序处理每一步都对应手册第 3 章里的一个功能块。2.1 先定目录结构再谈脚本很多人拿到手册后直接跳到第 4 章看 IR 分析结果卡在import阶段。手册推荐的目录结构之所以值得照抄是因为 RedHawk 的 GSR 配置文件、APL 模型、Liberty 是按相对路径互相引用的你把文件随手放在桌面上后面每加一个工艺角都要改一遍配置。我一般按下面这种方式创建目录prj/ ├── lef/ # tech LEF macro LEF ├── def/ # 布局布线后的 DEF含电源网络 ├── lib/ # Liberty按电压域 工艺角分子目录 │ ├── vdd0p80_tt/ │ └── vdd0p72_ss/ ├── apl/ # cell 级功耗模型按域拆 ├── verilog/ # 门级网表 ├── gds/ # GDSII layer map ├── gsr/ # 全局设置文件各 run 引用不复制 ├── avm/ # 电压域映射配置 └── runs/ ├── static_tt/ └── dynamic_tt/关键在于gsr/与runs/分离一个 run 一个目录报告和数据库不互相覆盖GSR 只有一份改参数就是改这一份所有 run 同步生效。这条习惯能省掉大量“为什么昨天跑的静态报告和今天不一样”的争论。2.2 rh_setup.pl 与 gds_setup.pl 各管哪一段手册里两个脚本容易被混着用。rh_setup.pl是环境搭建脚本负责生成目录骨架、模板 GSR 和基础配置gds_setup.pl是数据转换脚本负责把 GDSII 转成 DEF并把版图上的 text label 映射成电源 pin。前者在项目开头跑一次后者只在你手上没有干净 DEF 的时候才需要。# 1) 在工程根目录生成骨架 模板 GSR避免手写配置漏关键字 rh_setup.pl -dir ./prj -design top -tech ./prj/lef/tech.lef # 2) 只有拿到 GDS 才用GDS - DEFtext label 按 layer map 映射成电源 pin gds_setup.pl -gds ./prj/gds/top.gds \ -layer_map ./prj/gds/layer.map \ -top top \ -out ./prj/def/top_from_gds.def-dir指定工程根-design是顶层单元名必须和 DEF、网表里的顶层名完全一致大小写都算-tech指向 tech LEF脚本会据此生成金属层、via 的默认设置。gds_setup.pl的-layer_map是最容易出问题的一环它要告诉工具 text 层和 drawing 层怎么对应、哪些 label 算电源 pin映射写错的表现是转换成功但 DEF 里一个电源 pin 都没有后面电源网络提取会因为找不到 pad 而失败。已经有 signoff 质量 DEF 的项目这一步直接跳过别多转一次引入误差。2.3 多电压域设计Liberty、P/G arc 与 APL 的三处差异单域设计切换到多域后同一份 Liberty 往往不能再用。手册在“Multiple Vdd/Vss Analysis”里列了几处必须改的地方我整理成下面这张对照表出问题时按行排查比通读文档快得多数据项单域做法多域必须补充的内容Libertypg_pin一组 VDD/VSS 即可每个域单独定义pg_pin并写清related_power_pin/related_ground_pinP/G arc通常缺省自定义 LIB 里要显式描述 P/G arc否则域间电流路径断GSR 关键字单组 supply net按域逐条声明 net、电压值与上下电关系APL一份 cell 功耗模型按电压域拆开不同域的工作电压不能共用一份波形AVM 配置一般不需要把 instance/block 映射到具体 supply net域边界靠它确定最容易漏的是 P/G arc。现象很典型静态分析跑完某个电压域的 instance 电流全为 0报告里那一块看起来很“健康”。原因不是工具是 Liberty 里没描述电源到地的电流通路工具没法把电流分配到网络上。AVM 配置文件同理域映射不写全工具只能按默认 net 猜而猜测在多域设计里通常没有好结果。2.4 手工导入与配置文件图形界面之外的退路脚本生成的骨架不一定适配所有项目尤其是 DEF 和 Liberty 的来源比较杂的时候。这时走命令行手工导入更可控命令在 TCL 控制台里逐条执行哪一步报错一目了然# 逐类导入设计数据顺序不要乱技术文件 - 物理 - 时序/功耗 - 网表 import_lef ./lef/tech.lef import_lef ./lef/macros.lef import_def ./def/top.def import_lib ./lib/vdd0p80_tt/tt.lib import_verilog ./verilog/top.vg # 声明电源/地网络多域就多写几条电压值必须和 Liberty 中一致 set_pg_nets -net VDD -voltage 0.80 -power set_pg_nets -net VSS -voltage 0.00 -groundimport_*系列命令的具体拼写在不同 release 之间有过调整执行前在 TCL 控制台敲help或查对应版本的命令参考最稳。set_pg_nets里的-voltage是后面所有压降计算的基准写错 0.05V报告就整体偏移而且不会报错。图形界面这条路径同样可用菜单栏、主显示区、日志区、控制按钮、设计视图区和 TCL 命令行这几块在手册里都有说明。它的价值不在于点鼠标而在于“导出 GUI 配置”把调好的一套加载流程导出成文件下次换机器或交给同事导入后一次复现比口头描述“我点了哪几个菜单”靠谱得多。3. 功耗与静态 IR/EMvectorless 参数怎么设才不虚高静态分析的结果可信度八成取决于功耗和电源网格这两块输入。手册第 4 章把这块拆得很细但参数之间的耦合关系得自己理一遍。3.1 频率、时钟与翻转率三个必须对齐的数功耗估算的基本关系是 P α·C·V²·fα 由翻转率决定f 由频率决定V 由你声明的 supply net 决定。三者里任何一个和实际不符静态 IR 的结果就会系统性地偏高或偏低。无向量vectorless功耗计算要设的参数集中在几处工作频率与时钟参数、instance 与 block 的开关状态、翻转率toggle rate、翻转率的缩放系数scaling、以及提取参数和功耗计算方法的选择。我一般的顺序是先把频率和时钟定死再单独给信号翻转率最后才动缩放系数# 频率与时钟先定基准后面所有翻转率都以它为参考 setup_power -method vectorless -frequency 800MHz # 翻转率注意它是每时钟周期翻转次数还是翻转概率两种定义差 2 倍 setup_power -toggle_rate 0.2 -object_type signal # 缩放系数只在做敏感性分析时用正式 signoff 保持 1.0 setup_power -toggle_rate_scale 1.0参数说明里最值得盯的是翻转率的定义。业界有两种常见写法一种是每周期平均翻转次数取值 0~2一种是信号为高的概率取值 0~1两者差一个系数 2。手册在 toggle rate 那一节给了明确说明但如果你的翻转率是从别的工具或别的项目搬过来的一定要回去确认对方的定义再填。另一个坑是时钟和信号翻转率同时启用。时钟网络的翻转行为本身很规律如果既按 clock 给了频率、又按 signal 给了一次翻转率功耗会被重复计入结果偏保守很多。缩放参数toggle rate scaling本来是给“未知区域按经验打折”用的正式分析里保持 1.0把不确定性交给后面的敏感性分析去覆盖别在这里悄悄打折。3.2 VCD 事件驱动功耗GSR 关键字与时序窗口有仿真波形的时候事件驱动VCD模式比无向量准得多前提是波形选对。手册在“Event-Driven (VCD File) Power Calculation”里强调的 GSR 关键字核心就是告诉工具波形文件在哪、时间窗口从哪到哪、层次名怎么对应。# 事件驱动功耗计算窗口决定算哪一段层次分隔符决定能不能匹配上网表 setup_power -method event_driven \ -vcd ./vcd/typical_run.vcd \ -start 200ns -end 260ns-start/-end是必调项。整段仿真动辄几十万周期全塞进去既跑不完也没意义正确的做法是挑一段包含最坏开关活动的窗口通常就在时钟门控集中打开、多个大模块同时工作的那几个周期。窗口选窄了会漏掉峰值选宽了只是变慢所以宁可先用宽窗口定位再用窄窗口精算。层次分隔符bus 与 hierarchy delimiter是另一个静默失败点。VCD 里记的是top/u_core/u_alu/reg[3]这种层次名网表里的名字如果用了不同的分隔符或者被综合改名匹配率会很低工具不报错只是把匹配不上的部分按默认翻转率估算。跑完看一眼报告里的匹配率低于九成基本可以判定是命名对不上回去查综合脚本和后端 rename 规则。3.3 电源网格电阻提取与薄弱点体检功耗算完下一步是网格本身的电阻。手册把这块分成金属密度计算与电阻提取两部分金属密度影响的是填充和 CMP 相关的寄生电阻提取才是 IR 计算真正依赖的那一份。提取有命令行和图形界面两条路。我在批量 run 里用命令行交互调试时用 GUI 看网格颜色# 先算金属密度影响寄生再做 P/G 网格电阻提取 calculate_metal_density run_r_extraction -net {VDD VSS}-net只提取电源地网络不要漏掉任何一个域。提取完成后紧接着看“电源/地网格薄弱点”P/G grid weakness报告它标出的是高阻节点和电流瓶颈通常是 via 阵列不足、strap 宽度偏窄或者跨层跳转太频繁的位置。这一步的价值在于等到 IR 报告出现红色再回头找瓶颈往往已经改了几版版图提前看一眼薄弱点改动量小得多。3.4 Pad 与封装建模Chip/Package 边界上的电流从哪来很多“静态 IR 结果异常好”的案例根源是 pad 和封装参数用了默认值——理想电压源直接接到片内压降当然小。手册给出了命令行和图形界面两套封装建模流程还有专门的封装编译工具。需要填的核心是每个电源 pad 的电阻、电感以及封装到 PCB 那一段的等效参数。常规做法是从封装团队拿一份 RLC 清单按 pad 名逐个对应没有清单时按经验值给一组保守估计然后在报告里明确标注这是估计值。这个参数不是玄学它对动态压降的影响比对静态更大di/dt 乘上封装电感就是那颗著名的“电源噪声不为零”的来源。3.5 RedHawk-S 跑完看什么报告与数据库回流静态 IR 与 EM 分析跑起来之后报告至少要盯三类最差压降及其位置、有效电阻effective resistance分布、以及电流密度与限值的比值。前两个定位问题第三个判断会不会烧断。结果还有一条容易被忽略的出口导出到设计数据库。手册专门讲了数据库导出导入、版本兼容性和灵活内存缓存flexible memory caching。我的习惯是每轮分析结束导出一次数据库下一轮直接在数据库上重载不重新提取。这一步能省掉大量重复计算但要注意版本兼容——用 A 版本导出的库拿到 B 版本上打开轻则字段丢失重则读进去的网格是错的而且不一定报错。跨版本时老老实实重新提取别省这个时间。早期分析early analysis是另一个值得提前用的功能布局阶段还没有完整网表可以先按 block 分配功耗和电流、在 BPA 阶段生成 decap cell、做早期 decap 估算。它给的数不准但能提前发现“这个区域的电源网格根本撑不住”这种结构性问题比后期补 strap 便宜太多。4. 动态压降vectorless、RTL VCD 与门级 VCD 三条路怎么选动态分析和静态最大的区别是静态只有一个答案动态有一堆答案你得先决定算哪一个。手册第 5 章给了三条技术路线选错了不是精度差一点而是方向性错误。4.1 动态分析前的四件套不管走哪条路四样东西得先齐cell 表征cell characterization、功耗计算、网络提取、pad 与封装参数。这四项在手册里是并列的四个准备步骤实际执行有严格依赖cell 表征决定功耗模型功耗模型加网表算出电流波形网络提取给出阻抗pad/package 决定边界条件。缺一项后面的波形就是假的。cell 表征这一步在先进工艺上尤其不能省。用厂商提供的 APL 模型当然最省事但如果你的库版本和工艺角对不上最好自己按手册流程重新表征一遍尤其是低电压角cell 的电流波形形状变化很明显。4.2 无向量动态时钟门控的统一处理无向量动态分析vectorless dynamic analysis的假设是不给具体波形工具按统计规律构造最坏情况。它适合早期阶段和没有可用仿真的场景输入数据要求比 VCD 少代价是结果依赖假设。这一模式里最容易出问题的是时钟门控。真实设计里时钟门控把大量时钟树关掉电流波形是一簇一簇的如果工具按“所有门控同时打开”构造最坏情况会得到一个现实中不存在、但确实非常糟糕的波形然后你为它加了一堆 decap。手册给的默认处理是自动时钟门控处理automatic clock gate handling会按设计里的门控结构做统一处理通常保持默认即可。只有在做专门的“门控全开”压力测试时才需要改改完记得在报告里写清楚假设否则下一个人看到这版结果会误判。标准无向量流程本身不复杂准备输入、设假设、跑分析、看报告。真正花时间的是核对假设——工具默认的开关活动分布和你的设计意图是否一致这个只能人工确认。4.3 RTL VCD 驱动状态传播需要什么数据RTL 阶段的 VCD 比门级波形早得多价值在于能在 RTL 冻结后就开始评估电源网络。难点是 RTL 的层次和门级网表对不上需要状态传播state propagation把 RTL 的活动信息映射到门级单元上。手册对这块列了明确的数据要求RTL 层次与综合后层次的对应关系、时钟定义、复位状态、以及一组支持 RTL VCD 流程的 GSR 关键字。少一样传播就会在某一层断掉表现为部分模块活动率为 0。# RTL VCD 流程的关键设置层次映射 时钟定义缺一不可 setup_power -method rtl_vcd -vcd ./vcd/rtl_run.vcd # 层次映射文件RTL 实例名 - 门级实例名 set_hierarchy_map ./gsr/rtl2gate.maprtl2gate.map这种映射文件一般由综合脚本输出手写量太大且容易错。跑完先看 RTL VCD 报告里的传播覆盖率覆盖率不足时优先怀疑映射文件漏了某个 generate 块或者被 rename 的模块而不是去调分析参数。4.4 门级 VCD 与关键周期挑选、多比特时序单元门级 VCD 是最准的一条路也是最贵的一条。手册在这部分讲了输入数据与假设、分析流程以及两个很实操的点关键周期挑选critical cycle selection和多比特时序单元处理。关键周期挑选的逻辑是不分析整个波形而是从里面挑出电流最大的若干个周期做详细分析。挑选依据通常是每个周期的总电流峰值或 di/dt。这一步做得好能把分析时间压到原来的十分之一结果几乎不变做得不好挑中的周期全是平稳段得出的结论是“动态压降没问题”。多比特时序单元multi-bit sequential cell在现代设计里很常见它的多个 bit 共享一个时钟引脚工具如果按单 bit 处理会把时钟功耗重复计入峰值电流虚高。手册专门列了这一节说明这是踩过坑的地方。还有混合模式mixed mode一部分模块用 VCD另一部分用无向量。它在“有波形但覆盖不全”时很有用代价是两部分结果的物理含义不完全一致报告里最好分开列别混在一张表里比大小。5. 踩坑排查五个让结果失真或跑不通的现场下面五条都是“工具没报错、但结果不能信”的类型比报错更难查。每条按现象、原因、解决三步写。5.1 数据与流程类一、静态 IR 好得不像话最差压降只有几毫伏。现象报告整体偏绿最差节点压降远小于预期和动态结果差一个数量级。原因通常有两个pad 和封装参数用了理想值电阻 0、电感 0或者set_pg_nets没有覆盖全部电压域某些 instance 的电流没被分配到任何网络上。解决显式给每个 pad 填 RLC哪怕先用保守估计值再逐条核对 supply net 声明把域列表和 Liberty 里的pg_pin对一遍。二、GDS 转完 DEF电源 pin 一个都找不到。现象gds_setup.pl正常结束导入后 pad 位置为空网格提取报找不到电源端口。原因layer map 里 text 层与 drawing 层的对应写错或者版图上的 label 放在了非 drawing 层工具读得到图形读不到名字。解决打开 layer map 逐行核对先拿一个小模块试转确认 pin 能出来再转全芯片已有 signoff DEF 的项目直接跳过这一步。三、多电压域下某些模块电流恒为 0。现象静态报告里某个域的单元看起来很“健康”功耗为零。原因Liberty 缺related_power_pin/related_ground_pin或者自定义 LIB 里没写 P/G arc工具找不到电流通路也可能是 AVM 映射文件没覆盖这个 block。解决按域检查 Liberty 的pg_pin定义完整性补 P/G arc再把 AVM 配置和设计的电源域划分图对照一遍。5.2 分析设置与结果类四、动态峰值电流明显偏高decap 需求算出来大得离谱。现象波形峰值是同类项目的两三倍怎么加 decap 都压不住。原因有三种常见可能多比特时序单元的时钟功耗被重复计入时钟和信号翻转率同时给了功耗被算了两次或者无向量动态里时钟门控全部按打开处理。解决先看时序单元类型统计确认多比特单元的处理方式再把翻转率的设置集中到一处最后确认门控处理用的是默认自动模式而不是强制全开。五、数据库重载后结果和上次不一致或者加载极慢直到内存耗尽。现象同一份数据库重载最差压降和上次差了几个百分点或者加载过程中内存持续上涨最后被杀。原因跨版本打开了不兼容的数据库字段被静默丢弃或者没开灵活内存缓存每次加载都把整个网格读进内存。解决跨版本一律重新提取不跨版本时再开缓存大设计按区域分块加载加载完先抽查几个已知节点的电阻值和上次报告对一下数不对就别往下跑。6. 从报告到版图动作把 IR drop 变成可执行的几条修改看清楚报告只是第一步改对地方才算完成。静态和动态的判读阈值不是同一套静态看的是直流压降占供电电压的比例动态还要叠加封装电感带来的瞬时跌落所以动态的容忍度通常更紧别拿静态的标准去卡动态结果。手册给的那个示例修法流程很值得照着走一遍先改电源 pad 的数量和位置看压降改善多少再加 Metal6 的 strap观察改善是否收敛最后做电阻率敏感性分析确认结果对金属电阻率的假设有多敏感。三步的顺序不能反pad 不够的时候加多少 strap 都是白加。动作主要影响代价适用阶段增加/挪动电源 pad降低入口电阻改善全局压降受 IO 环和封装 ball 限制规划与布局阶段加宽/加密 Metal6 strap降低片内网格电阻挤占信号布线资源布局到布线前期提高 via 阵列密度消除局部高阻瓶颈改动局部风险低任意阶段插 decap抑制动态瞬时跌落面积和漏电动态分析收敛前电阻率敏感性那一步经常被跳过但它是判断“这版结果稳不稳”的关键把金属电阻率按工艺角上下浮动再跑一遍如果最差节点的排名变化很大说明你的修法只是在拟合某组参数换一个工艺角就会失效。我一般至少跑三组典型、偏悲观、偏乐观只看排名是否稳定不看绝对值。早期分析那套流程block 功耗电流分配、BPA 阶段生成 decap、早期 decap 估算最适合放在布局刚完成、网表还不完整的时候用。它给的数不准但足以回答“这个 floorplan 的电源网格要不要重做”这种问题而这个问题的答案越早出来越省钱。从那以后我每次开新项目第一件事不是导设计而是先跑rh_setup.pl把骨架和 GSR 立起来把 pad 的 RLC 和 supply net 声明当成必须填的输入项写进检查清单再往下做功耗和压降。手册里那些看着琐碎的准备章节恰恰是后面所有数字可信度的来源。希望帮到你。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。