Every coupled pair has two ends. Changing the victim's drive affects only the victim and anything driven by it. Changing the aggressor affects every victim it couples to, and the aggressor's own path. The trade-off differs from case to case.
import math
Vdd, Cc, Cg = 0.8, 6.0, 8.0
def peak(R_ohm, tr_ps):
tau = R_ohm * (Cc + Cg) / 1000.0
return (Cc * R_ohm / 1000.0) * Vdd / tr_ps * (1 - math.exp(-tr_ps / tau))
base = peak(2000.0, 10.0)
victim_fix = peak(1000.0, 10.0) # halve the victim driver resistance
aggressor_fix = peak(2000.0, 40.0) # slow the aggressor edge from 10 ps to 40 ps
assert round(base, 3) == 0.288 and round(victim_fix, 3) == 0.245 and round(aggressor_fix, 3) == 0.182
# delta delay scales with the victim driver resistance (same Cc): halving R halves it
delta_before, delta_after = 8.28, 8.28 / 2
assert round(delta_after, 2) == 4.14
# side effect of slowing the aggressor: its own path loses 12 ps of slack
aggressor_slack_before, aggressor_extra_delay = 15.0, 12.0
aggressor_slack_after = aggressor_slack_before - aggressor_extra_delay
assert aggressor_slack_after == 3.0
print("PASS: glitch", round(base, 3), "-> victim fix", round(victim_fix, 3), "or aggressor fix", round(aggressor_fix, 3), "; aggressor slack", aggressor_slack_before, "->", aggressor_slack_after, "ps")Option | Glitch peak (V) | Delta delay (ps) | Side effect |
|---|---|---|---|
Baseline | 0.288 | 8.28 | none |
Halve victim driver resistance | 0.245 | 4.14 | Area; load on the previous stage |
Slow aggressor edge to 40 ps | 0.182 | smaller (not computed here) | Aggressor's path loses 12 ps (15 to 3 ps slack) |
A stronger victim driver halves the delta (4.14 ps) and lowers the glitch to 0.245 V. Slowing the aggressor lowers the glitch more, to 0.182 V, but costs the aggressor's own path 12 ps, leaving it with 3 ps of slack: a fix that nearly creates a new problem. The aggressor change also helps every other net that aggressor couples to, which the victim change does not. The choice depends on how many victims share the aggressor and how much slack the aggressor has.
Aggressor changes are checked on the aggressor's own timing, in every scenario.
When one aggressor hurts many victims, changing it is usually cheaper than fixing each victim.
Victim changes are checked for their effect on the preceding stage and on the victim's own downstream timing.
When one aggressor couples to many victims and has slack to spare, so one change helps several nets without hurting its own timing.