Part 11 · Senior Prep · Intermediate
UVM Debug Playbook Hub: Systematic Senior Triage
Hub — failure classification buckets, hang triage via objections, mismatch checking flow, config failure diagnosis, silent stimulus failures, and a deterministic debug checklist.
Overview
Senior debug is not faster waveform scrolling — it is symptom classification first , then applying the known first move for that bucket before touching RTL or random edits.
Every regression failure lands in one of five buckets: completion, checking, config, stimulus, or prediction . Each bucket has a deterministic 15-minute playbook.
Sub-lessons in this topic
failure-classification-buckets — map symptoms to buckets before opening waves.
hang-triage-objections — objection trace, drain_time, and handshake stalls.
mismatch-triage-checking — first-failing-transaction protocol for scoreboards.
config-failure-triage — config_db path/type/name mismatch diagnosis.
stimulus-silent-failures — run_phase, vif, reset, and sequence-start triage.
debug-playbook-checklist — reproducible capture, minimal repro, and sign-off.
[DEBUG][SENIOR][UVM] debug playbook architecture
regression failure
-> classify symptom (5 buckets)
-> apply bucket first move (15 min)
-> capture seed + plusargs + minimal repro
-> only then deep dive (waves / RTL)
senior rule: no waveform without bucket evidence# standard senior triage invocation
simv +UVM_TESTNAME=$TEST \
+ntb_random_seed=$SEED \
+UVM_PHASE_TRACE \
+UVM_OBJECTION_TRACE \
+UVM_VERBOSITY=UVM_MEDIUM \
-l triage_${TEST}_${SEED}.logKey takeaways
Classify the failure bucket before any waveform work.
Each bucket has a known first move — apply it systematically.
Capture seed, plusargs, and logs before editing testbench code.
Senior triage is evidence-driven, not intuition-driven.
Common pitfalls
Opening waveforms before classifying the symptom bucket.
Editing the test before capturing a reproducible seed and log.
Cranking verbosity to UVM_FULL on the entire testbench.
Treating every hang as an RTL bug without checking objections.
The five failure buckets
Use this matrix at the start of every triage session. The bucket determines tooling, not personal preference.
[DEBUG][SENIOR][UVM] symptom → bucket → first move
SYMPTOM BUCKET FIRST MOVE
sim hangs / never ends completion +UVM_OBJECTION_TRACE
UVM_ERROR mismatch checking print first failing txn
value not configured config grep set/get path+type
no activity, sim ends fast stimulus run_phase + vif + reset
RAL mirror check fails prediction predictor wiring auditTriage priority ladder
Read the last 50 log lines — what is the last UVM message before stall?
Classify into one bucket — resist multi-bucket guessing.
Run bucket-specific first move with seed frozen.
Capture minimal reproducer before any fix attempt.
// senior quick objection snapshot (any component in run_phase)
function void dump_objections(uvm_phase phase);
`uvm_info("TRIAGE", phase.phase_done.convert2string(), UVM_NONE)
endfunctionCommon pitfalls
Jumping between buckets without finishing the first-move protocol.
Assuming stimulus failure when the real issue is an objection leak.
Debugging RAL prediction before confirming basic config_db paths.