# RedHawk 动态 IR drop 报告怎么读：文件、指标与术语表

RedHawk 动态 IR drop 的结论看四处：日志的 Worst Dynamic Voltage Drop 表、Dynamic/{design}.dvd、Dynamic/layer_drop.rpt 和 power_summary.rpt——先用日志确认角与窗口，再用 .dvd 的 min_pg_tw 算压降百分比，用 layer_drop 定位到层。

## 0. 阅读顺序（照这个次序走，不会得出假结论）


| 步 | 看什么                                                           | 目的                                                |
| -- | ---------------------------------------------------------------- | --------------------------------------------------- |
| 1  | 日志头的 TECH_FILE / SPEF / VCD / TEMPERATURE                    | 确认这是哪个角，混合角的数字不可归因                |
| 2  | 日志的 Selection resolution / Time span selected / Sim Start-End | 确认分析窗口；跨 run 比较前必须钉死窗口             |
| 3  | 日志 "Worst Dynamic Voltage Drop" 表                             | 拿到 4 个汇总数：WIRE(VDD)、WIRE(VSS)、avgTW、minTW |
| 4  | `Dynamic/{design}.dvd`                                           | 逐实例的最坏电压，定位到具体 instance 与坐标        |
| 5  | `Dynamic/layer_drop.rpt`                                         | 判断压降堆在哪一层（局部瓶颈 vs 全局网格）          |
| 6  | `power_summary.rpt`                                              | 核对功耗/频率域是否合理，窗口长度的推荐值           |
| 7  | `Error/`、`Warn/`、`*.unconnect`、`noTiming`                     | 确认这次运行本身有效                                |

`redhawk -b` 的**退出码恒为 0**，不能用来判定成功；判有效性只看有没有 `PWR-330` / `ANL-013` / `GEN-010`，以及 `adsRpt/Error/redhawk.err.<时间戳>` 的内容。

## 1. 先钉角：数字离开角落配置就没有意义

一次动态 IR drop 结果由五件事共同决定，报告里必须能回答这五个：


| 维度         | 在报告/配置里的位置                               | 常见取值                                         |
| ------------ | ------------------------------------------------- | ------------------------------------------------ |
| 温度         | 日志 `Temperature used for resistance extraction` | 125 °C（签核常用）                              |
| 金属电阻角   | GSR `TECH_FILE`                                   | `*_rcmax.tech` / `*_rcmin.tech` / `*_typ.tech`   |
| 信号网寄生角 | GSR `CELL_RC_FILE`                                | `{design}_max.spef` / `_min.spef`                |
| 波形         | GSR `VCD_FILE`                                    | `min.vcd`（最坏功耗）/ `max.vcd`                 |
| 窗口         | 日志 `Sim Start Time` / `Sim End Time`            | `DYNAMIC_SIMULATION_TIME` 是**宽度**，不是起止对 |

要点：

- **PG 网的 R 是 RedHawk 从 tech file 自己抽的**（SPEF 只覆盖信号网），所以 tech 角几乎线性决定压降。实测同一波形、同一窗口只把 rcmax 换 rcmin，最坏压降可差 6~7 倍——tech 是第一变量，比窗口/VCD 都大。
- `VCD_FILE { SELECT_RANGE -1 -1 SELECT_TYPE WORST_POWER_CYCLE }` 会让工具在整条波形上滑窗选最坏窗口；**选中窗口写在日志里**（`Time span selected (A ~ B)`），网格步长默认 = STA timing 里的最高频率的周期。
- 用 `START_TIME {ps}` 钉死窗口后再做对比，否则每个变体被分到不同窗口，差异 30~40% 全是窗口造成的。
- `setup package/wirebond/pad -r 0 -c 0 -l 0` = 片外理想，**没有 Ldi/dt**，算出来的压降只是片上电阻性部分，是**下限**。

## 2. 结论行：Worst Dynamic Voltage Drop 表

日志里这段是给结论用的，逐行含义：


| Type              | 含义                                               | 备注                               |
| ----------------- | -------------------------------------------------- | ---------------------------------- |
| `WIRE` (net=VDD)  | 全设计最坏的**片上 PG 金属压降**                   | 对应 `.dvd` 的 `min_vdd_tw` 最小值 |
| `WIRE` (net=VSS)  | 全设计最坏的**地弹（ground bounce）**              | 对应 `.dvd` 的 `max_vss_tw` 最大值 |
| `avgTW`           | 窗口内总压降的**平均值**                           | 判断是持续偏低还是瞬时尖峰         |
| `minTW` / `minWC` | 全设计最差的**总压降** = 1.8 V − 最小 `min_pg_tw` | **报“IR drop %”就用这个**        |

两个必须自己做的校验：

1. **自洽性**：`WIRE(VDD) + WIRE(VSS) ≈ minTW`。实测一例 171.30 + 164.50 = 335.80 mV，与 minTW 335.68 mV 对得上，说明最坏点就是这两侧压降叠加的同一个位置。
2. **`maxTW` 不要当最坏值**：同一份报告里实测 `avgTW 297.02 mV`、`minTW 335.68 mV`，而 `maxTW 107.03 mV`——三者口径不同，`maxTW` 明显偏小，报数时只用 `minTW/minWC`。

**压降百分比口径**（报给项目/客户时写清口径，否则差一倍）：

```
IR_drop% = (Videal − min_pg_tw) / Videal
         = (1.800 − 1.4643) / 1.800 = 18.65%
```

- 只算 VDD 侧：`171.30 / 1800 = 9.52%`
- VDD + VSS（器件真正少掉的电压）：`335.68 / 1800 = 18.65%`
- `eff_Vdd` 列**不是最差值**，它是窗内平均口径

常见的 sign-off 习惯是动态 IR drop ≤ 10%（数字核心，视工艺/电压/产品而定），所以 18.65% 必须结合 `min_pg_tw` 与标准单元的最低工作电压一起判断，不能只看百分比。同时要说明这是片外理想的下限值。

## 3. `Dynamic/{design}.dvd`：逐实例数据，定位到点

列顺序（第 1 行是注释）：

```
# loc_x loc_y eff_Vdd max_pg_tw min_pg_tw min_pg_sim max_pg_sim min_vdd_tw max_vss_tw domain inst_name
xxx.xx yyyy.yy 1.5466 1.7991 1.4643 1.4643 1.7994 1.6289 0.1645 VDD C_{n}_IBUF
```


| 列                          | 含义                            | 用法                                  |
| --------------------------- | ------------------------------- | ------------------------------------- |
| `loc_x loc_y`               | 实例坐标（µm）                 | 和版图对应，看是否聚集在同一行/同一块 |
| `eff_Vdd`                   | 窗内有效供电电压（平均口径）    | 趋势参考，不能当最坏值                |
| `max_pg_tw`                 | 窗内最大 PG 电压                | 一般接近理想值                        |
| **`min_pg_tw`**             | **窗内最小 PG 电压（TW 口径）** | **压降百分比就用它**                  |
| `min_pg_sim` / `max_pg_sim` | 仿真原始极值                    | 与 `_tw` 不同说明窗口加权起了作用     |
| `min_vdd_tw`                | 该实例 VDD 侧最低电压           | 与 1.8 差 = 该点电源线压降            |
| `max_vss_tw`                | 该实例 VSS 侧最高电压 = 地弹    | 与 0 差 = 地弹量                      |
| `domain` / `inst_name`      | 电源域 / 实例名                 | 按层次聚合找热点                      |

实操（排序取最坏、看分布）：

```bash
# 最坏的 10 个实例
grep -v '^#' {design}.dvd | awk '$5!="n/a"' | sort -k5,5g | head -10

# 分布：超过 10%/15%/20% 的实例数（比单个最大值更能说明是点问题还是面问题）
grep -v '^#' {design}.dvd | awk '$5!="n/a"{d=(1.8-$5)/1.8*100; if(d>10)a++; if(d>15)b++; if(d>20)c++} END{print a,b,c}'
```

经验判据：

- 最坏 Top-10 全部落在**同一行坐标 / 同一类实例**（例如一排 IBUF）⇒ 是**局部供电瓶颈**，改局部 strap/via 就够。
- 压降面状分布、top-10 分散 ⇒ 才是全局 PG 网格问题。
- `n/a` 行 = 该实例没有 timing window（未覆盖 STA），数量要单独记；本例 14125 有数据、689 为 n/a。
- **同实例同坐标跨 run 对比**是最可靠的“同点对比”抓手（尤其当版图被换过、坐标会漂移时，要按实例名 + 最近坐标配对）。

## 4. `Dynamic/layer_drop.rpt`：是局部瓶颈还是全局网格

格式：`#Layer Min_drop Max_drop`，分 `#TOP` / `Net VDD` / `Net VSS` 三段。实测一例的最大压降：


| Layer | VDD max   | VSS max   |
| ----- | --------- | --------- |
| M1    | 171.33 mV | 164.54 mV |
| T1    | 73.22 mV  | 73.13 mV  |
| M2    | 70.90 mV  | 70.91 mV  |
| T2    | 55.48 mV  | 55.48 mV  |
| M3    | 55.36 mV  | 55.36 mV  |

读法：

- **最大压降集中在 M1（最下层）** ⇒ 该点靠器件很近的段/过孔不够，属局部；上面几层加起来才 ~70 mV，说明主干网格没问题。
- 逐层几乎均匀、上层也很大 ⇒ 全局网格/电源规划问题（strap 数量、宽度、pad 位置）。
- layer_drop 与 `.dvd` 的 `min_vdd_tw`、`max_vss_tw` 可以互相校验：同一位置的数应当吻合。

## 5. `power_summary.rpt`：先证明“这次运行合理”

- `Recommended dynamic simulation time, {T} psec, to include {P}% of total power`：**跟随 STA 时钟**（1/最高频率），与 VCD 无关。窗口远小于它时，功耗统计不完整。
- 分频域/clock root/Vdd 域/单元类型的功耗拆分：用来核对 (a) 时钟网络占比是否离谱（本例 clock network 11.85 mW / 39.75 mW = 29.8%），(b) 是否有大块实例落在 `NA*`（未连电源或未归属 clock root），(c) `#inst_count` 是否符合预期。
- 量级自检：`Iavg = P_total / V`。本例 39.75 mW / 1.8 V ≈ 22 mA，与动态 IR drop 里看到的电压分布量级对得上，才说明功耗喂进去了。

## 6. 其他文件什么时候看


| 文件                                           | 内容                                | 场景                                                                            |
| ---------------------------------------------- | ----------------------------------- | ------------------------------------------------------------------------------- |
| `worst_power_cycle.rpt`                        | 按窗内平均功耗排名的前 500 个 cycle | 确认选窗是否合理、第 2 名和第 1 名差多少                                        |
| `worst_dpdt_cycle.rpt`                         | 按 ΔP/cycle 排名                   | `SELECT_TYPE WORST_DPDT_CYCLE` 时用                                             |
| `worst.block.cycle.rpt`                        | 逐 cycle 平均功耗曲线               | 当“功耗波形”看，找活动突发                                                    |
| `Dynamic/mcyc_effvdd.rpt`、`mcyc_rpt_time.rpt` | 逐实例、逐周期的有效 Vdd 与发生时刻 | 看最坏电压发生在窗口内哪个时刻                                                  |
| `Dynamic/{design}.ipwr/.ivdd/.ignd`            | 时间序列电流                        | 峰值/平均值比（本例 peak/avg ≈ 1.5）                                           |
| `Dynamic/decaps.rpt`                           | decap 统计                          | 判断电压跌落是否有本地储能支撑                                                  |
| `{design}.noTiming`、`vcd_missing_nets`        | 未覆盖 STA / VCD 未映射的网         | 覆盖率不足时，压降可能被低估                                                    |
| `Error/` `Warn/`                               | 错误与告警                          | 例如库温度越界（SLB-121）、tech file 缺 Tnom（TEC-065，会让该层温度效应被忽略） |

## 7. 报数时必须一起给的三件事

1. **口径**：VDD 单侧还是 VDD+VSS；`minTW`（最坏）还是 `avgTW`（平均）；`_tw` 还是 `_sim`。
2. **角与窗口**：温度 + tech + spef + VCD + 窗口（起止 ns）+ 时间步长。
3. **片外是否理想**：`r/c/l = 0` 就等于没有 Ldi/dt，结论要写成“片上电阻性下限”。

## 8. 常见坑（都是用真实数据换来的）

- 换了 DEF/SPEF/GSR 却没注意 mtime，直接和上周的数字比大小 ⇒ 差异其实来自版图。改版后的对比必须重跑同一套角，并且核对最坏点的实例坐标是否还成立。
- 用 `eff_Vdd` 当最坏值 ⇒ 报小了；用 `avgTW` 当最坏值 ⇒ 也报小了。
- 只看 `.dvd` 最大值，不看分布 ⇒ 分不清“一个点坏了”还是“整片不够”。
- 片外理想却按“含封装”的口径汇报 ⇒ 结论过于乐观；反之拿它当实测值也一样错。
- VCD 的频率与 STA 声明的频率不一致（行为模型生成的时钟很常见），此时**不要靠改 SDC 去迁就 VCD**：VCD 驱动下修改 SDC 频率对 IR drop 几乎无影响，正确做法是在报告里写明“波形来自哪个模式/速率”，并补最坏/全速场景。

## 9. 术语与缩写表

### 9.1 物理量与概念


| 术语            | 含义                                    | 说明                                         |
| --------------- | --------------------------------------- | -------------------------------------------- |
| IR drop         | 电流流过电阻造成的电压降 `ΔV = I·R`   | 电源网（VDD）上叫压降，地网（VSS）上升叫地弹 |
| static IR drop  | 只算平均电流的电阻性压降                | 与开关活动无关，快，但偏乐观                 |
| dynamic IR drop | 按时间变化的电流波形（VCD）仿真出的压降 | 含充放电瞬态，签核用这个                     |
| ground bounce   | 地网上的电压抬升（VSS 从 0 抬高）       | 与 VDD 压降一起决定器件实际电压              |
| Ldi/dt          | 封装/走线电感引起的动态过冲             | 片外设 `r=c=l=0` 时为 0，压降被低估          |
| droop           | 供电电压跌落（泛指）                    | 报告里用 mV 或 % 表示                        |
| PG mesh / strap | 电源地网格 / 电源条带                   | 压降集中在 M1 时多半是 strap/via 局部不足    |
| decap           | 去耦电容单元                            | 抑制瞬时 droop                               |
| P/G pin         | 单元/宏的电源地引脚                     | 与网格连接不良会造成局部高阻                 |
| sign-off        | 签核：用最坏角出结论                    | 需要角、窗口、片外模型三者都说清             |

### 9.2 报告字段与特定缩写


| 缩写                             | 全称/含义                                                     | 在本报告里怎么用                          |
| -------------------------------- | ------------------------------------------------------------- | ----------------------------------------- |
| `.dvd`                           | dynamic voltage drop 报告                                     | 逐实例最坏/平均电压，定位热点             |
| `TW`                             | timing window                                                 | `*_tw` 字段 = 按 timing window 加权后的值 |
| `min_pg_tw`                      | 窗内最小 PG 电压                                              | **算 IR drop % 就用它**                   |
| `max_pg_tw`                      | 窗内最大 PG 电压                                              | 一般接近理想电压，用来看波动范围          |
| `min_pg_sim` / `max_pg_sim`      | 仿真原始极值（未按窗口加权）                                  | 与 `_tw` 差异说明窗口加权生效             |
| `min_vdd_tw`                     | 该实例 VDD 侧最低电压                                         | `1.8 − 该值` = 电源线压降                |
| `max_vss_tw`                     | 该实例 VSS 侧最高电压                                         | `该值 − 0` = 地弹                        |
| `eff_Vdd`                        | 有效供电电压（窗内平均口径）                                  | 只能看趋势，不是最坏值                    |
| `WIRE`                           | 只看片上 PG 金属的压降（不含器件/封装）                       | 与 VSS 侧相加 ≈ 总压降                   |
| `avgTW`                          | 窗口内总压降平均值                                            | 与 `minTW` 的差看“偶发尖峰 vs 持续偏低” |
| `minTW` / `minWC`                | 全设计最差总压降（worst case 口径）                           | 业界“IR drop X%”通常指这个              |
| `maxTW`                          | 另一种口径的极值，数值可能小于 avgTW                          | **不要拿它当最坏值**                      |
| `#TOP`                           | layer_drop 里 VDD/VSS 合并后的口径                            | 与 Net VDD / Net VSS 两段对照             |
| `n/a`                            | 该实例无 timing window                                        | 统计覆盖率时必须单独计数                  |
| `NA*`                            | 未归属任何 clock root 的实例汇总行                            | 出现在 power_summary 的 clock root 表里   |
| VCD / FSDB / VPD                 | 值变化转储波形 / Verdi 波形格式 / 另一家波形格式              | 动态分析的激励来源                        |
| cycle selection                  | 在长波形里自动挑最坏窗口                                      | 由 `SELECT_TYPE` 决定排序口径             |
| `WORST_POWER_CYCLE`              | 按窗内平均功耗选窗（默认）                                    | 与 `worst_power_cycle.rpt` 对应           |
| `WORST_DPDT_CYCLE`               | 按 `ΔP/cycle` 选窗                                           | 与 `worst_dpdt_cycle.rpt` 对应            |
| grid size / Selection resolution | 滑窗步长，默认 = 1/最高时钟频率                               | 换 SDC 会连带换网格与选中窗口             |
| presim                           | 正式窗口前的预仿真                                            | 让网格/器件进入稳态                       |
| time step                        | 动态仿真步长（如 20 ps）                                      | 越小越准越慢                              |
| window                           | 分析窗口 = `START_TIME` + `DYNAMIC_SIMULATION_TIME`           | 对比实验必须钉死                          |
| `DYNAMIC_SIMULATION_TIME`        | **窗口宽度**（单值）                                          | 写两个值会被当“第二个是宽度”，易报错    |
| GSR                              | RedHawk 的设置/命令脚本文件（`.gsr`）                         | 角、波形、窗口都在里面                    |
| DEF / LEF / SPEF / DSPF          | 版图交换格式 / 库抽象 / 寄生参数 / 另一种寄生格式             | DEF 换了版图就变了，别跨版本比数字        |
| tech file                        | 工艺文件（层、方阻、via、温度系数）                           | RedHawk 用它抽 PG 网 R，头号变量          |
| corner                           | 角（`rcmax` / `rcmin` / `typ`）                               | 必须与 spef、VCD 同角                     |
| APL                              | 单元电流/功耗模型库（`apl.current`、`apl.cdev`、`apl.pwcap`） | 决定单元级电流波形精度                    |
| STA / timing file / SDC          | 静态时序分析 / 时序库 / 约束文件                              | 提供频率与 timing window                  |
| EM                               | 电迁移                                                        | 与 IR drop 同源（电流密度），常一起做     |
| IBUF                             | 输入缓冲单元                                                  | 本例热点集中在一排 IBUF 上                |
| FILLER / decap                   | 填充单元 / 去耦电容单元                                       | 常在 `IGNORE_CELLS` 里被忽略功耗          |

## Sources

- RedHawk 19.0.3 User Manual（Ansys/Apache），动态电压降章节与 `.dvd` 报告格式说明
- 实测数据：一次 1.8 V、1P3M 数字核设计（约 1.9 万实例）的 RedHawk 19.0.3 动态 IR drop 运行，125 °C、rcmax tech、max SPEF、min VCD、30 ns 窗口、20 ps 步长
- 敏感度结论来自同角单变量对比实验（tech 角 / spef 角 / VCD / 窗口 / SDC 频率）

