# How to read a RedHawk dynamic IR drop report: files, metrics and glossary

A dynamic IR drop run is answered by four files: the log's Worst Dynamic Voltage Drop table, `Dynamic/{design}.dvd`, `layer_drop.rpt` and `power_summary.rpt` — corner and window first.

## 0. Reading order (follow it, or you will draw false conclusions)


| Step | What to look at                                                              | Why                                                                          |
| ---- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| 1    | TECH_FILE / SPEF / VCD / TEMPERATURE in the log header                       | To establish the corner; numbers from a mixed corner cannot be attributed    |
| 2    | `Selection resolution` / `Time span selected` / `Sim Start`-`End` in the log | To establish the analysis window; pin it before comparing runs               |
| 3    | The `Worst Dynamic Voltage Drop` table in the log                            | Four summary numbers: WIRE(VDD), WIRE(VSS), avgTW, minTW                     |
| 4    | `Dynamic/{design}.dvd`                                                       | Worst voltage per instance — locates the individual instance and coordinate |
| 5    | `Dynamic/layer_drop.rpt`                                                     | Which layer the drop piles up on (local bottleneck vs global mesh)           |
| 6    | `power_summary.rpt`                                                          | Sanity of power / frequency domains, recommended window length               |
| 7    | `Error/`, `Warn/`, `*.unconnect`, `noTiming`                                 | Whether the run itself is valid                                              |

`redhawk -b` **always exits with status 0**, so the exit code proves nothing. Validity is judged only by the absence of `PWR-330` / `ANL-013` / `GEN-010` and by what `adsRpt/Error/redhawk.err.<timestamp>` says.

## 1. Pin the corner first: a number without its corner is meaningless

A dynamic IR drop result is decided by five things, and a report must be able to answer all five:


| Dimension                    | Where it lives                                        | Typical value                                                    |
| ---------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------- |
| Temperature                  | Log line `Temperature used for resistance extraction` | 125 °C (common for sign-off)                                    |
| Metal resistance corner      | GSR `TECH_FILE`                                       | `*_rcmax.tech` / `*_rcmin.tech` / `*_typ.tech`                   |
| Signal-net parasitics corner | GSR `CELL_RC_FILE`                                    | `{design}_max.spef` / `_min.spef`                                |
| Waveform                     | GSR `VCD_FILE`                                        | `min.vcd` (worst power) / `max.vcd`                              |
| Window                       | Log `Sim Start Time` / `Sim End Time`                 | `DYNAMIC_SIMULATION_TIME` is the **width**, not a start/end pair |

Key points:

- **RedHawk extracts the PG network's R from the tech file itself** (SPEF only covers signal nets), so the tech corner decides the drop almost linearly. Measured: same waveform, same window, only rcmax swapped for rcmin — worst drop differed by 6-7x. Tech is the number-one variable, bigger than window or VCD choice.
- `VCD_FILE { SELECT_RANGE -1 -1 SELECT_TYPE WORST_POWER_CYCLE }` makes the tool slide a window over the whole waveform and take the worst one; **the selected window is written to the log** (`Time span selected (A ~ B)`), and the grid step defaults to the period of the highest frequency in the STA timing file.
- Pin the window with `START_TIME {ps}` before comparing variants, otherwise each variant is assigned a different window and 30-40% of the difference is simply the window.
- `setup package/wirebond/pad -r 0 -c 0 -l 0` = ideal off-chip, i.e. **no Ldi/dt**, so the drop you get is only the on-die resistive part and is a **lower bound**.

## 2. The verdict line: the Worst Dynamic Voltage Drop table

This block in the log is what you quote. Line by line:


| Type              | Meaning                                                            | Note                                                  |
| ----------------- | ------------------------------------------------------------------ | ----------------------------------------------------- |
| `WIRE` (net=VDD)  | Worst **on-die PG metal drop** in the design                       | Matches the minimum `min_vdd_tw` in `.dvd`            |
| `WIRE` (net=VSS)  | Worst **ground bounce** in the design                              | Matches the maximum `max_vss_tw` in `.dvd`            |
| `avgTW`           | **Average** total drop over the window                             | Distinguishes a persistent low from a transient spike |
| `minTW` / `minWC` | Worst **total drop** in the design = 1.8 V − smallest `min_pg_tw` | **This is the "IR drop %" you report**                |

Two checks you must do yourself:

1. **Self-consistency**: `WIRE(VDD) + WIRE(VSS) ≈ minTW`. Measured once: 171.30 + 164.50 = 335.80 mV against minTW 335.68 mV — the worst point is the same location where both sides add up.
2. **Do not treat `maxTW` as the worst value**: in the same report `avgTW 297.02 mV` and `minTW 335.68 mV`, while `maxTW 107.03 mV` — different definitions, and `maxTW` is clearly smaller. Quote only `minTW`/`minWC`.

**Definition of the drop percentage** (state it when reporting to a project or a customer, otherwise the number differs by a factor of two):

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

- VDD side only: `171.30 / 1800 = 9.52%`
- VDD + VSS (the voltage the device actually loses): `335.68 / 1800 = 18.65%`
- The `eff_Vdd` column **is not the worst value**; it is a window-average definition

A common sign-off habit is dynamic IR drop ≤ 10% (digital core, depending on process / voltage / product), so 18.65% has to be judged together with `min_pg_tw` and the standard cells' minimum operating voltage, not as a percentage alone. Also state that this is the lower bound of an off-chip-ideal run.

## 3. `Dynamic/{design}.dvd`: per-instance data, down to the point

Column order (line 1 is a comment):

```
# 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
```


| Column                      | Meaning                                              | Use                                                              |
| --------------------------- | ---------------------------------------------------- | ---------------------------------------------------------------- |
| `loc_x loc_y`               | Instance coordinate (µm)                            | Map to layout; check whether hotspots sit on one row / one block |
| `eff_Vdd`                   | Effective supply voltage (window-average definition) | Trend only, never as the worst value                             |
| `max_pg_tw`                 | Maximum PG voltage in the window                     | Usually close to the ideal value                                 |
| **`min_pg_tw`**             | **Minimum PG voltage in the window (TW definition)** | **The drop percentage comes from this**                          |
| `min_pg_sim` / `max_pg_sim` | Raw simulation extremes                              | Differing from `_tw` means window weighting is active            |
| `min_vdd_tw`                | Lowest VDD-side voltage of the instance              | `1.8 − value` = supply wire drop at that point                  |
| `max_vss_tw`                | Highest VSS-side voltage = ground bounce             | `value − 0` = bounce                                            |
| `domain` / `inst_name`      | Power domain / instance name                         | Aggregate by hierarchy to find hotspots                          |

Practical commands (rank the worst, look at the distribution):

```bash
# the 10 worst instances
grep -v '^#' {design}.dvd | awk '$5!="n/a"' | sort -k5,5g | head -10

# distribution: how many instances exceed 10%/15%/20%
# (says more about "one point" vs "the whole block" than a single maximum)
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}'
```

Rules of thumb:

- Worst top-10 all on **the same coordinate row / the same instance type** (e.g. a row of IBUF) ⇒ **local supply bottleneck**; local strap/via work is enough.
- Areal distribution, top-10 scattered ⇒ a genuine global PG mesh problem.
- `n/a` rows = the instance has no timing window (not covered by STA); count them separately; in this example 14125 had data and 689 were `n/a`.
- **Same instance, same coordinate across runs** is the most reliable "same-point" comparison (especially after a layout swap, when coordinates drift: pair by instance name plus nearest coordinate).

## 4. `Dynamic/layer_drop.rpt`: local bottleneck or global mesh

Format: `#Layer Min_drop Max_drop`, in three blocks: `#TOP` / `Net VDD` / `Net VSS`. One measured example (maximum drop per layer):


| 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  |

How to read it:

- **Worst drop concentrated on M1 (bottom layer)** ⇒ segments/vias too close to the devices are insufficient; local. The layers above add only ~70 mV, so the backbone mesh is fine.
- Near-uniform per layer with large values on the upper layers ⇒ global mesh / power-planning problem (number and width of straps, pad placement).
- `layer_drop` and the `.dvd` columns `min_vdd_tw` / `max_vss_tw` cross-check each other: at the same location the numbers should agree.

## 5. `power_summary.rpt`: first prove the run itself is sane

- `Recommended dynamic simulation time, {T} psec, to include {P}% of total power`: **follows the STA clock** (1/highest frequency), independent of the VCD. If the window is much shorter, power statistics are incomplete.
- Power split by frequency domain / clock root / Vdd domain / cell type: use it to check (a) whether the clock-network share is implausible (in this example clock network 11.85 mW / 39.75 mW = 29.8%), (b) whether a large block of instances lands in `NA*` (not connected to power, or not assigned to a clock root), (c) whether `#inst_count` matches expectations.
- Order-of-magnitude self-check: `Iavg = P_total / V`. In this example 39.75 mW / 1.8 V ≈ 22 mA, consistent with the voltage distribution seen in the dynamic run — that is how you know the power really got in.

## 6. When to look at the other files


| File                                           | Content                                                | When                                                                                                                                        |
| ---------------------------------------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `worst_power_cycle.rpt`                        | Top 500 cycles ranked by average power in the window   | Whether the selected window makes sense; how far #2 is from #1                                                                              |
| `worst_dpdt_cycle.rpt`                         | Ranked by ΔP/cycle                                    | Used with `SELECT_TYPE WORST_DPDT_CYCLE`                                                                                                    |
| `worst.block.cycle.rpt`                        | Average power per cycle                                | Treat it as a power waveform; find activity bursts                                                                                          |
| `Dynamic/mcyc_effvdd.rpt`, `mcyc_rpt_time.rpt` | Effective Vdd per instance per cycle, with time stamps | When within the window the worst voltage occurs                                                                                             |
| `Dynamic/{design}.ipwr/.ivdd/.ignd`            | Current time series                                    | Peak/average ratio (≈1.5 in this example)                                                                                                  |
| `Dynamic/decaps.rpt`                           | Decap statistics                                       | Whether local charge storage supports the droop                                                                                             |
| `{design}.noTiming`, `vcd_missing_nets`        | Nets without STA coverage / not mapped from the VCD    | Insufficient coverage means the drop may be underestimated                                                                                  |
| `Error/`, `Warn/`                              | Errors and warnings                                    | e.g. library temperature out of range (SLB-121), tech file missing Tnom (TEC-065, which makes the temperature effect on that layer ignored) |

## 7. Three things that must ship with any number

1. **Definition**: VDD side only, or VDD+VSS; `minTW` (worst) or `avgTW` (average); `_tw` or `_sim`.
2. **Corner and window**: temperature + tech + spef + VCD + window (start-end in ns) + time step.
3. **Whether off-chip is ideal**: `r/c/l = 0` means no Ldi/dt, so the conclusion must read "on-die resistive lower bound".

## 8. Common traps (each one paid for with real data)

- DEF/SPEF/GSR was swapped but the mtime was missed, and the number is compared with last week's ⇒ the difference actually comes from the layout. A post-ECO comparison must re-run the same corner set and check whether the worst-point instance coordinate still holds.
- Using `eff_Vdd` as the worst value ⇒ reported too low; using `avgTW` as the worst value ⇒ also too low.
- Looking only at the `.dvd` maximum and not at the distribution ⇒ cannot tell "one point is bad" from "the whole block is short".
- Reporting an off-chip-ideal run with an "including package" definition ⇒ too optimistic; using it as a measured value is equally wrong.
- The frequency in the VCD disagrees with what the STA deck declares (common with behaviour-model clocks): **do not bend the SDC to match the VCD** — under VCD-driven analysis, changing the SDC frequency has almost no effect on IR drop. State which mode/rate the waveform came from, and add a worst/full-speed scenario.

## 9. Glossary

### 9.1 Physics and concepts


| Term            | Meaning                                                   | Note                                                                              |
| --------------- | --------------------------------------------------------- | --------------------------------------------------------------------------------- |
| IR drop         | Voltage lost to resistance, `ΔV = I·R`                  | On the supply net (VDD) it is a drop; on the ground net (VSS) it is ground bounce |
| static IR drop  | Resistive drop from average current only                  | Independent of switching activity, fast, optimistic                               |
| dynamic IR drop | Drop simulated from a time-varying current waveform (VCD) | Includes charge/discharge transients; this is what sign-off uses                  |
| ground bounce   | Voltage rise on the ground net (VSS lifted above 0)       | Together with the VDD drop it decides the voltage the device actually sees        |
| Ldi/dt          | Dynamic overshoot caused by package/trace inductance      | Zero when off-chip is set to `r=c=l=0`, and the drop is then underestimated       |
| droop           | Generic term for supply collapse                          | Reported in mV or %                                                               |
| PG mesh / strap | Power/ground mesh / power strap                           | A drop concentrated on M1 usually means local strap/via shortage                  |
| decap           | Decoupling capacitor cell                                 | Damps transient droop                                                             |
| P/G pin         | Power/ground pin of a cell or macro                       | Poor connection to the mesh gives local high resistance                           |
| sign-off        | Concluding from the worst corner                          | Requires corner, window and off-chip model all stated                             |

### 9.2 Report fields and jargon


| Term                             | Meaning                                                                              | How it is used in this report                                                |
| -------------------------------- | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------- |
| `.dvd`                           | dynamic voltage drop report                                                          | Worst/average voltage per instance; locates hotspots                         |
| `TW`                             | timing window                                                                        | `*_tw` fields = values weighted over timing windows                          |
| `min_pg_tw`                      | Minimum PG voltage in the window                                                     | **The drop percentage comes from this**                                      |
| `max_pg_tw`                      | Maximum PG voltage in the window                                                     | Usually near the ideal value; shows the swing                                |
| `min_pg_sim` / `max_pg_sim`      | Raw simulation extremes (not window-weighted)                                        | Differing from `_tw` shows window weighting is active                        |
| `min_vdd_tw`                     | Lowest VDD-side voltage of the instance                                              | `1.8 − value` = supply wire drop                                            |
| `max_vss_tw`                     | Highest VSS-side voltage of the instance                                             | `value − 0` = ground bounce                                                 |
| `eff_Vdd`                        | Effective supply voltage (window-average definition)                                 | Trend only, not the worst value                                              |
| `WIRE`                           | Drop considering on-die PG metal only (no device/package)                            | Added to the VSS side ≈ total drop                                          |
| `avgTW`                          | Average total drop over the window                                                   | Difference from `minTW` separates "occasional spike" from "persistently low" |
| `minTW` / `minWC`                | Worst total drop in the design (worst-case definition)                               | What the industry usually means by "IR drop X%"                              |
| `maxTW`                          | An extreme under a different definition; may be smaller than avgTW                   | **Do not use it as the worst value**                                         |
| `#TOP`                           | In layer_drop, the VDD/VSS combined view                                             | Read it against the `Net VDD` / `Net VSS` blocks                             |
| `n/a`                            | The instance has no timing window                                                    | Must be counted separately for coverage                                      |
| `NA*`                            | Summary row of instances not assigned to any clock root                              | Appears in the clock-root table of `power_summary`                           |
| VCD / FSDB / VPD                 | Value-change dump / Verdi waveform format / another vendor's waveform format         | The stimulus for dynamic analysis                                            |
| cycle selection                  | Automatically picking the worst window in a long waveform                            | The ranking criterion is set by `SELECT_TYPE`                                |
| `WORST_POWER_CYCLE`              | Select the window by average power (default)                                         | Corresponds to `worst_power_cycle.rpt`                                       |
| `WORST_DPDT_CYCLE`               | Select the window by `ΔP/cycle`                                                     | Corresponds to `worst_dpdt_cycle.rpt`                                        |
| grid size / Selection resolution | Sliding-window step, default = 1/highest clock frequency                             | Changing the SDC changes both the grid and the selected window               |
| presim                           | Pre-simulation before the analysis window                                            | Lets the mesh and devices reach steady state                                 |
| time step                        | Dynamic simulation step (e.g. 20 ps)                                                 | Smaller is more accurate and slower                                          |
| window                           | Analysis window = `START_TIME` + `DYNAMIC_SIMULATION_TIME`                           | Must be pinned for comparison experiments                                    |
| `DYNAMIC_SIMULATION_TIME`        | **Window width** (single value)                                                      | Writing two values makes the second one the width — easy to trip over       |
| GSR                              | RedHawk settings/command script (`.gsr`)                                             | Corner, waveform and window all live there                                   |
| DEF / LEF / SPEF / DSPF          | Layout exchange format / library abstraction / parasitics / another parasitic format | A new DEF means a new layout — do not compare across versions               |
| tech file                        | Process file (layers, sheet resistance, vias, temperature coefficients)              | RedHawk extracts the PG network R from it; the number-one variable           |
| corner                           | Process corner (`rcmax` / `rcmin` / `typ`)                                           | Must match spef and VCD                                                      |
| APL                              | Cell current/power model library (`apl.current`, `apl.cdev`, `apl.pwcap`)            | Determines cell-level current waveform accuracy                              |
| STA / timing file / SDC          | Static timing analysis / timing library / constraints                                | Supply frequency and timing windows                                          |
| EM                               | Electromigration                                                                     | Same root as IR drop (current density); usually done together                |
| IBUF                             | Input buffer cell                                                                    | In this example the hotspots sit on one row of IBUFs                         |
| FILLER / decap                   | Fill cell / decoupling capacitor cell                                                | Often listed in `IGNORE_CELLS` so their power is ignored                     |

## Sources

- RedHawk 19.0.3 User Manual (Ansys/Apache), dynamic voltage drop chapter and `.dvd` report format
- Measured: one RedHawk 19.0.3 dynamic IR drop run on a 1.8 V, 1P3M digital core design (about 19k instances), 125 °C, rcmax tech, max SPEF, min VCD, 30 ns window, 20 ps step
- Sensitivity conclusions come from single-variable comparison experiments at the same corner (tech corner / spef corner / VCD / window / SDC frequency)

