简介:本资源为 ANSYS RedHawk 官方用户手册(User Manual,软件版本 2021R1),面向从事数字后端 power 完整性分析的工程师与学习者,解决全芯片静态、动态电压降分析缺少系统参考资料的问题,适合已有一定后端基础、希望深入掌握 IR-drop 分析流程与工具用法的人群。压缩包内为 1 个 pdf 文件,体积约 11.73MB,内容涵盖全芯片静态与动态电源完整性分析、RedHawk 在设计流程中的规划与开发验证阶段应用、TCL 命令用户界面与数据准备、静态与动态电压降分析流程等章节,目录结构完整,便于按章节查阅。该手册已有 1822 人学习下载,可作为日常工具书随查随用:既能帮助读者建立从设计规划、开发到验证的完整分析思路,也能对照命令界面与流程说明快速上手实际操作,减少摸索成本。
1. 全芯片压降翻车之后:这份 RedHawk 手册该在什么时候翻
某项目流片前的静态 IR 报告一路绿灯,最大压降离阈值还有三成余量,结果硅片回来,角落一块计算簇的实测压降直接逼近红线。复盘时发现问题出在功耗计算那一步用了默认翻转率,package 模型压根没建,电源 pad 寄生全按理想处理。做数字后端 power 的人都清楚,IR-drop 这类分析最怕的是不知道哪个默认值正在替你做决定,而非不会点按钮。RedHawk 用户手册(2021R1)把 full-chip 静态与动态 power integrity 的完整链路拆成了可执行步骤,从数据准备、静态 IR/EM 到动态压降的向量模式选择都有对应章节。它适合正在做电源网络签核的后端工程师,也适合刚接手 IR 分析、需要搞清楚每一步输入从哪来的人。
2. 数据准备链路:从 GDS 到可分析 DEF 的目录约定
RedHawk 的输入文件种类多:LEF/DEF、GDS、Liberty、工艺文件、APL、电源网表、package 模型。手册没有强制要求你把文件放哪,但给了一套推荐目录结构,前提是rh_setup.pl和gds_setup.pl能按固定位置找到东西。这一步没做好的直接后果是后面每跑一次分析都要手工改路径,错一个路径就要重来。
2.1 推荐目录结构与 rh_setup.pl 的自动化边界
我一般按下面这种结构组织一次分析的工作区。核心思路是把「只读输入」和「每次跑都会变的配置与结果」分开,这样换一个 corner、换一版 DEF 时不用动原始数据。
prj/ ├── data/ # 只读:LEF、DEF、GDS、综合后网表 │ ├── lef/ │ ├── def/ │ └── gds/ ├── lib/ # 只读:Liberty、macro 功耗/时序库 ├── tech/ # 只读:工艺文件、layer map、APL ├── pkg/ # 只读:package 模型、pad 参数 └── run/ # 可写:每次分析一个子目录 ├── cfg/ └── results/rh_setup.pl是手册里推荐用来生成 RedHawk 配置文件和环境变量的自动化脚本。它做的事情不神秘:读你给的 design 名、tech、LEF、DEF、Liberty 路径,把 RedHawk 启动时需要的那组配置文件生成到指定目录。常见调用方式:
# 生成一次分析所需的基础配置 rh_setup.pl -design top_core \ -tech ./tech/tech.tch \ -lef ./data/lef \ -def ./data/def/top_core.def \ -lib ./lib \ -out ./run/cfg # 生成的配置里通常包含 design 名、库路径、工艺路径 # 以及 RedHawk 启动时读取的环境变量脚本三个参数值得单独说。-design不只是一个标签,它会成为后续报告和数据库文件的默认前缀,命名混乱时最难查的就是对不上号的那一版结果。-tech指向的工艺文件决定了金属层电阻率、通孔电阻、单位电容这些底层参数,工艺文件选错,后面所有压降数字都会系统性偏移。-def这一版要和你实际要分析的那一版网表一致,DEF 和 Liberty 版本错配是多电源域设计里最常见的翻车点之一。
rh_setup.pl的边界也要说清楚:它只负责「把配置搭起来」,不做数据合法性检查。DEF 里 PG pin 有没有连上、Liberty 里有没有 P/G arc、APL 里电源网络定义全不全,这些它都不管。我见过有人跑完脚本就直接开分析,结果报了一堆「找不到电源网络」的错,回头查是 APL 文件根本没放进 tech 目录。
提示:每次换 DEF 版本,先跑一遍
rh_setup.pl再手工核对生成的配置里-def和-lib路径,不要让上一次的旧配置残留。
2.2 gds_setup.pl 与 GDS2DEF 导入的关键参数
当 DEF 里缺少完整的电源网格几何信息,或者你要做的是 GDS 级别的电源网络提取,就要走gds_setup.pl这条路。它把 GDS 转成 RedHawk 能吃的 DEF 形式,中间靠 layer map 和几个层号参数对齐。
# 把 GDS 转成可分析的 DEF gds_setup.pl -gds ./data/gds/top_core.gds \ -layer_map ./tech/layer.map \ -text_layer 63 \ -pin_layer 62 \ -out ./data/gds2def-layer_map是整个转换里最关键的文件。它把 GDS 里的 layer/datatype 编号映射到工艺文件里的金属层名,映射错一层,提取出来的电源网格就少一层金属,压降结果会偏乐观得离谱。-text_layer指定 GDS 里用来标注网络名的文本层,-pin_layer指定电源 pad 和 pin 的图形层。这两个层号必须和你的 GDS 导出设置一致,不一致的典型现象是转换完成后 DEF 里所有 PG pin 都是匿名网络,后面想按网络名指定电源就得靠手工改。
转换完成后别急着往下走,先看一眼输出 DEF 里电源网络的完整性。常见做法是用文本工具 grep 一下网络名数量,和 GDS 里标注的电源网络做对比。少一个网络,后面动态分析的激励就少一块,而且不会报错,只会安静地少算。
2.3 多电源域设计的 LIB 语法与 GSR 关键字
单 Vdd 设计和多 Vdd/Vss 设计在输入数据上的差异,是手册里花了不少篇幅讲的部分。核心差异在 Liberty 库:多域设计需要库里明确写出每个 cell 的 P/G pin 属于哪个电源域,以及 P/G arc 的连接关系,否则工具无法判断某个 instance 到底从哪条电源网络取电。
| 输入项 | 单电源域 | 多电源域 |
|---|---|---|
| Liberty P/G pin | 通常只有 VDD/VSS 两个 | 每个域一组,需带域标识 |
| P/G arc 定义 | 多数库可省略 | 必须显式定义,含跨域 arc |
| APL 电源网络 | 一条主网络即可 | 每条域网络都要单独声明 |
| GSR 配置 | 基本不用改 | 需指定多域模式与域前缀 |
跨域 arc 是最容易漏的一项。电平转换单元、隔离单元这类跨域 cell,如果库里没写跨域 P/G arc,工具会按单域处理,把它们挂到默认电源网络上,结果就是跨域路径上的压降被摊到了一条并不存在的通路上。表现是报告里某条网络电流异常大,另一条几乎为零。
GSR 关键字用来在全局层面告诉工具「这是多域设计」。常见写法是设电源 pin 前缀和打开多域模式:
# 多电源域全局设置 set_gsr MULTI_VDD_MODE true set_gsr PG_PIN_PREFIX "VDD_" set_gsr AVM_CONFIG ./pkg/avm.cfg # 每个域单独声明电源与地网络 set_supply_nets -domain CORE -power VDD_CORE -ground VSS set_supply_nets -domain IO -power VDD_IO -ground VSSMULTI_VDD_MODE打开后,工具才会去解析 Liberty 里的域信息;PG_PIN_PREFIX用来在 pin 名上做域匹配,前缀写错会导致域识别失败,但工具不一定报错,而是把没匹配上的 pin 归到默认域。AVM_CONFIG指向电源电压管理配置,多域设计的电压值、上电顺序这类信息放在这里。这三行看着简单,实际项目里出错最多的就是前缀和域名的对应关系。
3. 静态 IR Drop 与 EM:从功耗计算到电源网格电阻提取
静态分析这条链路的顺序是固定的:先算功耗,再提电阻,然后建 pad 和 package 模型,最后跑 RedHawk-S 出静态 IR/EM 结果。顺序颠倒或者跳过某一步,结果的可信度就会打折扣。手册把这条链路拆得很细,是因为每一步的输入都依赖上一步的输出。
3.1 Vectorless 功耗计算:频率、翻转率与实例状态
Vectorless 功耗计算不依赖仿真向量,用概率模型估计每个 instance 的翻转活动。它的好处是快,不需要跑仿真;代价是结果对参数极其敏感。手册里列了一组必须设的参数:频率、时钟、实例开关状态、翻转率、翻转率缩放。
# 选择 vectorless 功耗计算方法 set_power_calc_method vectorless # 全局工作频率与主时钟定义 set_frequency 800 set_clock -net clk_main -frequency 800 -duty 0.5 # 默认翻转率 0.1,时钟网络翻转率 2.0(每周期两次跳变) set_toggle_rate -default 0.1 -clock 2.0 # 按层次指定实例的开关状态 set_instance_state -inst u_core/u_alu/* -state active set_instance_state -inst u_core/u_dsp/* -state idle # 指定电源与地网络后开始计算 set_supply_nets -power VDD_CORE -ground VSS calculate_powerset_frequency设的是全局默认频率,单位按工艺文件约定走,多数流程是 MHz。set_clock里的-duty是占空比,影响时钟网络的平均功耗而不是峰值。set_toggle_rate的-default是信号网络的默认翻转率,-clock单独给时钟网络,因为时钟几乎每个周期都翻转,用信号的默认值会严重低估时钟树功耗。
set_instance_state是很多人会跳过的一步。不指定状态时,工具按全局默认翻转率给所有 instance 算功耗,等于假设每个模块都在满负荷跑。实际芯片里总有一批模块在某个场景下是 idle 的,把它们标成 idle 能显著改善压降分布的合理性。反过来,如果整块芯片都按 active 算,热点会被人为摊平,看起来哪都不算太差,实际局部该 hot 的地方被平均掉了。
注意:翻转率缩放参数不要凭感觉设。手册里给了缩放因子的作用范围,改之前先确认它作用在时钟还是信号网络上,设反了会让时钟功耗翻倍或者归零。
功耗算完先看总功耗和分域功耗,和你从综合报告里拿到的功耗数字对一下量级。差一个数量级基本就是单位或者翻转率设错了,这时候往下走没有意义。
3.2 电源网格电阻提取与金属密度计算
电阻提取是把电源网络的几何转成电阻网络的过程。手册里把金属密度计算单独列出来,是因为密度影响化学机械抛光后的实际金属厚度,进而影响电阻率。密度不均匀的区域,实际金属比标称薄,电阻偏大,这部分在先进工艺上不能忽略。
# 打开金属密度计算,窗口按工艺建议值设置 set_extract_options -metal_density true -density_window 10 # 只提取电源和地网络的电阻 extract_r -nets {VDD_CORE VSS} # 输出电阻最弱的两百条路径,用于定位网格薄弱点 report_r -weakness -top 200-density_window是密度统计的窗口尺寸,单位通常是微米。窗口太小,密度估计噪声大;窗口太大,局部密度差异被抹平。工艺文件里一般会给出建议值,没有的话按最大金属宽度的若干倍试。report_r -weakness的输出是排查电源网格的第一手材料,它会告诉你哪些节点到 pad 的等效电阻最大,这些节点往往就是后面 IR 报告里的压降热点。
提取完成后有个容易被忽略的检查:电源网络的总等效电阻和手工估算对一下。拿最远点到最近 pad 的路径长度乘以单位长度电阻,粗算一个数量级,和工具报出来的数字比。差太多说明 layer map 或者工艺文件有问题,这时候跑静态分析得到的压降没有参考价值。
3.3 Pad 与 Package 建模及 RedHawk-S 运行
Pad 和 package 参数决定了芯片内部的电源噪声有多少能被封装吸收。全按理想处理时,片上压降会偏大;封装模型建得太乐观,片上压降又会偏小。手册给了命令行和 GUI 两条建模路径,还有独立的 package compiler 工具。
| 参数 | 含义 | 典型量级 | 影响 |
|---|---|---|---|
| R | pad 到封装焊点的串联电阻 | 毫欧级 | 直接影响直流压降 |
| L | 封装引线电感 | 数十到数百 pH | 影响动态压降的 di/dt 响应 |
| C | 封装去耦电容 | 纳法级 | 吸收高频电流波动 |
# 为每条电源网络设置 pad 与封装寄生 set_pad -net VDD_CORE -type power -r 0.02 -l 0.05n -c 0.2p set_pad -net VSS -type ground -r 0.02 -l 0.05n -c 0.2p # 启动静态 IR/EM 分析 run_static_analysis -mode ir_em-r的单位是欧姆,-l是亨利,-c是法拉。这三个值不是拍脑袋填的,来源是封装厂的模型文件或者 package compiler 的输出。填之前确认单位,把纳亨当皮亨填进去,动态结果会差一个数量级,而且这种错在静态分析里看不出来,只有在动态波形上才会暴露。
run_static_analysis -mode ir_em同时出 IR 和 EM 两类结果。EM 检查的是电流密度,和 IR 用的是同一套电流分布,所以一起跑不额外花时间。跑完之后先看有没有收敛警告,再看报告里的最差节点位置,位置落在预期的高功耗区域才算合理。
4. 动态压降分析:四种向量模式的选型与 VCD 驱动流程
动态压降和静态的本质区别在于电流是时变的。静态看的是平均电流在电阻网络上的压降,动态看的是瞬时电流在电阻、电感网络上的响应。手册把动态分析按激励来源分成了几种模式:纯 vectorless、RTL VCD 驱动的 vectorless、门级 VCD 驱动的 vectorless、以及完整 VCD 动态分析。选哪种模式,取决于你手上有什么数据、要回答什么问题。
4.1 Vectorless 动态分析与时钟门控的自动处理
纯 vectorless 动态分析不需要任何仿真向量,工具用统计模型生成激励,找出最坏情况的压降。它适合设计早期,电源网络还没定型、跑仿真拿 VCD 成本太高的时候。
这个模式里最值得说的是时钟门控的处理。时钟门控单元会让时钟树在局部关断,关断区域的动态电流骤降,但重新开启的瞬间会有电流冲击。手册里默认开启自动时钟门控处理,工具会识别 clock gate 单元,按概率模型决定它们的开关状态。
# 动态分析模式选择 set_dynamic_mode vectorless # 时钟门控处理,默认自动识别 set_clock_gating -mode auto -activity_prob 0.3 # 设置动态分析的时间窗口与步长 set_time_window -start 0 -end 200n -step 0.05n run_dynamic_analysis-activity_prob是门控单元的激活概率,0.3 表示平均三成的时钟门控在任意时刻是打开的。这个值直接影响动态电流的峰值估计:设得太低,峰值电流被低估,压降看起来漂亮;设得太高,又过于悲观。我的习惯是先用默认值跑一版,再按设计里时钟门控的实际占比调一次,两次结果差多少心里有数。
set_time_window的步长要和时钟周期匹配。步长比时钟周期还大,就会漏掉时钟沿附近的电流尖峰,而这恰恰是动态压降最严重的时刻。经验做法是步长不超过最小时钟周期的十分之一。
提示:vectorless 动态分析的结果是统计意义上的最坏情况,不代表某个具体工作负载。拿它做 sign-off 时要在报告里注明激励模式,别和 VCD 驱动的结果混着比。
4.2 RTL VCD 与门级 VCD 的数据要求和差异
当你有仿真数据时,用 VCD 驱动比纯 vectorless 更贴近实际工作负载。手册区分了 RTL VCD 和门级 VCD 两条路径,差别在数据完整性和状态传播方式上。
| 维度 | RTL VCD | 门级 VCD |
|---|---|---|
| 信号层次 | RTL 信号名 | 门级网表信号名 |
| 状态传播 | 需要工具做状态推导 | 直接映射到 instance |
| 数据量 | 小 | 大,通常需要裁剪时间窗 |
| 适用阶段 | 设计中期,网表未定 | 设计后期,网表冻结 |
| 精度 | 依赖推导质量 | 接近实际 |
RTL VCD 路径的关键是状态传播。RTL 里的信号要映射到门级 instance 的开关状态,中间隔了综合这一步,映射不准就会导致某些模块的翻转被漏掉。手册里给了一组 GSR 关键字来支持这条流程,主要用来指定状态传播的规则和报告粒度。
# 启用 RTL VCD 驱动的 vectorless 流程 set_gsr RTL_VCD_FLOW true set_gsr STATE_PROPAGATION true set_gsr RTL_VCD_REPORT ./run/results/rtl_vcd.rpt # 指定 VCD 文件和顶层映射 read_vcd -file ./data/sim/core_rtl.vcd -scope top_tb/u_core run_dynamic_analysis -mode rtl_vcdSTATE_PROPAGATION打开后,工具会对 VCD 里没有直接覆盖到的信号做推导,推导规则在手册的状态传播章节里有说明。RTL_VCD_REPORT输出的报告会列出哪些信号成功映射、哪些被丢弃,这份报告比最终压降结果更值得先看,映射率低于八九成的话,后面的压降数字就不用太当真。
门级 VCD 路径相对直接,但数据量大。常见做法是先用波形工具把 VCD 裁到关心的几个时间窗,再喂给 RedHawk。不裁剪直接读,光是解析就能耗掉大半天。
4.3 VCD 关键周期选择与混合模式分析
完整 VCD 动态分析和前两种的区别在于,它不生成激励,而是逐周期重放 VCD 里的真实活动。代价是慢,所以手册专门讲了关键周期选择:从整段 VCD 里挑出电流冲击最大的若干周期,只对这些周期做分析。
# 从 VCD 中筛选关键周期 set_vcd_cycle_selection -method current_peak -top 20 \ -window 5 # 对选中的周期做动态分析 run_dynamic_analysis -mode vcd -cycles selected-method current_peak按峰值电流排序,-top 20取前二十个周期,-window 5表示每个选中周期前后各多看五个周期,避免只截到半个事件。选周期的逻辑是:动态压降的最坏值往往集中在少数几个时钟周期里,把所有周期都跑一遍,边际收益很低。
混合模式是另一种常见做法:用 vectorless 找出全局最坏的时间窗,再用 VCD 在这个窗口内做精细重放。这样既有 vectorless 的覆盖率,又有 VCD 的精度。
# 先用 vectorless 定位最坏时间窗 set_dynamic_mode vectorless run_dynamic_analysis report_dynamic -worst_window -top 5 # 在定位到的窗口内用 VCD 重放 set_dynamic_mode mixed set_vcd_window -file ./data/sim/core_gate.vcd -from 120n -to 140n run_dynamic_analysis这套组合我一般用在中后期:vectorless 负责告诉你「哪段时间最危险」,VCD 负责告诉你「那段时间到底有多危险」。两步之间不要改电源网络,否则窗口定位就失效了。
5. 避坑与排查:五条来自实际流程的踩坑记录
手册读一遍能记住流程,真正让人长记性的是跑出来的结果对不上。下面五条是这类分析里反复出现的,现象、原因、解决按顺序写,方便对着排查。
5.1 功耗算出来偏小三成:默认翻转率在替你做决定
现象:静态 IR 报告最大压降只有阈值的六成,看起来很宽裕,但同一版设计在另一套流程里算出来的功耗比这里高不少。
原因:set_toggle_rate的默认值被沿用,没有按模块调整。计算集群、DSP 这类高活动模块和低速外设用了同一个翻转率,高活动模块的功耗被系统性低估。
解决:按模块层次分批设翻转率,高活动模块单独调高,idle 模块显式标 idle。改完重跑calculate_power,把总功耗和综合报告里的功耗数字对一遍,量级对上再往下走。
5.2 DEF 导入后 PG pin 全是匿名网络
现象:分析启动时报找不到指定的电源网络,或者报告里电源网络数量比预期少。
原因:GDS2DEF 转换时-pin_layer和-text_layer与实际 GDS 导出设置不一致,pin 图形被识别成了普通金属,网络名丢失。
解决:核对 GDS 导出时的层号设置,重新跑gds_setup.pl。转换完成后 grep 一下输出 DEF 里的网络名,确认电源网络数量和 GDS 里标注的一致,再做后续分析。
5.3 动态分析报「无有效激励」
现象:run_dynamic_analysis直接返回空结果,日志里提示没有找到有效激励。
原因:VCD 的时间窗和set_time_window设的分析窗口没有交集,或者 VCD 里的时钟周期和set_frequency设的频率对不上,工具认为数据不可用。
解决:先看 VCD 头部的 timescale 和时间范围,把分析窗口调到和 VCD 重叠。频率对不上的情况更隐蔽,把set_frequency改成和 VCD 里实测的时钟周期一致再跑。
5.4 跨域单元被当成单域处理
现象:多电源域设计里,某条电源网络电流异常大,另一条几乎为零,和预期的域划分对不上。
原因:Liberty 库里跨域 cell 缺少显式 P/G arc 定义,工具按默认域处理,把跨域路径的电流全算到了一条网络上。
解决:检查跨域 cell 的库定义,补上 P/G arc。补不了的话,在 GSR 里显式指定这些 cell 的域归属,别让工具猜。
5.5 同样的配置跑两次结果不一样
现象:配置没改,两次跑出来的最大压降差了几个百分点。
原因:vectorless 模式的激励生成带随机性,种子没固定。统计模型本身允许一定波动,但做版本对比时这个波动会被误读成设计变化。
解决:在 GSR 里固定随机种子,同一版对比用同一个种子。跨版本对比时要么都固定种子,要么都跑多次取统计值,别拿一次随机结果下结论。
6. 结果验证与收敛判断:怎么确认一份 IR 报告可信
跑出报告只是开始,判断这份报告能不能用来做决策,需要看几个固定位置。我一般先看报告头部的输入摘要,确认 DEF、Liberty、工艺文件的版本和路径是这一次要分析的那一版,这一步能拦掉相当一部分「跑错版本」的低级错误。
6.1 报告字段与阈值的对应关系
静态 IR 报告里几个关键字段的含义和判断方式:
| 字段 | 含义 | 判断方式 |
|---|---|---|
| Worst IR drop | 全网最差节点压降 | 对比阈值,同时看位置是否落在高功耗区 |
| IR drop histogram | 压降分布直方图 | 长尾是否可接受,比单点最差值更有信息量 |
| Weakest path | 电阻最弱路径 | 与report_r输出交叉验证 |
| EM current density | 电流密度峰值 | 对比工艺给的限值,留够余量 |
| Violation count | 超阈值节点数 | 数量级比单点值更能反映网格质量 |
最差压降的位置比数值本身更值得看。位置落在预期的热点区域,说明模型和设计一致;位置出现在一个不该有电流的角落,多半是电源网络连接有问题,先查连接再谈优化。
动态报告多两个字段:峰值压降出现的时刻,以及对应的时间窗。时刻要和时钟沿对齐,对不上说明时间步长或者时钟定义有问题。
6.2 一次修复迭代的顺序
压降超标时的修复顺序,我按成本从低到高排:先调 pad 和 package 参数,确认模型不是过于悲观;再补电源网格的 strap,看薄弱路径上的电阻能不能降下来;最后才动 decap 和单元位置。手册里的示例流程也是这个顺序,先改 pad 再补 Metal 层 strap,最后看电阻率敏感性。
# 修复后重跑,只重算受影响的部分 update_power_grid -nets {VDD_CORE} extract_r -nets {VDD_CORE VSS} -incremental run_static_analysis -mode ir_em -reuse_power-incremental只重提改动网络的电阻,-reuse_power复用上一次的功耗结果。这两步能把一次迭代从小时级压到分钟级,适合反复试参数。但要注意复用功耗的前提是网表没变,网表一变就必须重算。
修复效果要用同一套指标对比:最差压降、超阈值节点数、最弱路径电阻。三个指标同方向改善才算真的改好了,只有一个改善往往是参数把问题挪到了别处。
从那以后我每次出报告,都强制先走一遍「输入版本核对 + 功耗量级对比 + 最弱路径交叉验证」这三步,再去看压降数字。这三步花不了十分钟,但能挡掉大部分事后让人后悔的结论。希望帮到你。
本文还有配套的精品资源,点击获取