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:
- 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. - Do not treat
maxTWas the worst value: in the same reportavgTW 297.02 mVandminTW 335.68 mV, whilemaxTW 107.03 mV— different definitions, andmaxTWis clearly smaller. Quote onlyminTW/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_Vddcolumn 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):
# 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/arows = the instance has no timing window (not covered by STA); count them separately; in this example 14125 had data and 689 weren/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_dropand the.dvdcolumnsmin_vdd_tw/max_vss_twcross-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_countmatches 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
- Definition: VDD side only, or VDD+VSS;
minTW(worst) oravgTW(average);_twor_sim. - Corner and window: temperature + tech + spef + VCD + window (start-end in ns) + time step.
- Whether off-chip is ideal:
r/c/l = 0means 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_Vddas the worst value ⇒ reported too low; usingavgTWas the worst value ⇒ also too low. - Looking only at the
.dvdmaximum 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
.dvdreport 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)