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

  1. failure-classification-buckets — map symptoms to buckets before opening waves.

  2. hang-triage-objections — objection trace, drain_time, and handshake stalls.

  3. mismatch-triage-checking — first-failing-transaction protocol for scoreboards.

  4. config-failure-triage — config_db path/type/name mismatch diagnosis.

  5. stimulus-silent-failures — run_phase, vif, reset, and sequence-start triage.

  6. debug-playbook-checklist — reproducible capture, minimal repro, and sign-off.

diagram
[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
bash
# 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}.log

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

diagram
[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 audit

Triage priority ladder

  1. Read the last 50 log lines — what is the last UVM message before stall?

  2. Classify into one bucket — resist multi-bucket guessing.

  3. Run bucket-specific first move with seed frozen.

  4. Capture minimal reproducer before any fix attempt.

systemverilog
// 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)
endfunction

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