Senior debug is a loop: triage the failure, shrink it to a minimal repro, hypothesize one cause, and run the cheapest experiment that falsifies it. Only the first error matters, the testbench is the prime suspect, and every fix leaves a regression behind.
Legend: [TRIAGE] [WAVE] [TB] [X/RACE]
THE DEBUG LOOP — every failure goes through this cycle
failure report
│
▼
┌─────────────────────┐
│ 1. TRIAGE [TRIAGE] │ first error only · classify signature
│ where to look? │ TB bug? RTL bug? spec ambiguity?
└─────────┬───────────┘
▼
┌─────────────────────┐
│ 2. REPRODUCE │ same seed · same build · minimal test
│ shrink the case │ shorter sim · fewer agents · one txn
└─────────┬───────────┘
▼
┌─────────────────────┐
│ 3. HYPOTHESIZE │ one suspect at a time
│ cheapest test? │ log? assertion? wave? code read?
└─────────┬───────────┘
▼
┌─────────────────────┐
│ 4. EXPERIMENT │ waves [WAVE] · TB instrumentation [TB]
│ falsify it │ X-trace [X/RACE] · directed re-run
└─────────┬───────────┘
▼
hypothesis survives? ──no──► back to 3 with new evidence
│ yes
▼
fix + add a regression test that would have caught itLesson | What it covers |
|---|---|
First-error discipline, six signature classes, and the testbench versus RTL verdict. | |
Backward tracing, first-divergence markers, sampler pitfalls, and a monitor case. | |
Activity gates, loud failures, hang triage, and two testbench cases. | |
First-X back-propagation, reset audits, race protocol, and a gate-level case. |
The first one. Everything after it ran in a corrupted state, so later errors are usually echoes of the original fault.