Part 7 · Environment & Tests · Intermediate
Checking Integration Debug: Ordered Triage for Silent Failures
Debugging integrated scoreboard and coverage paths with ordered checks across publish, transport, ingest, compare, and report stages.
Triage order
Use strict order for debug: monitor publish -> env connect graph -> scoreboard ingest -> correlate/compare -> coverage sample/report.
[ENV][UVM][CHECK] integration triage matrix
symptom: no compares, no coverage
-> monitor publish or connect graph break
symptom: compares active, coverage flat
-> coverage subscriber path break
symptom: coverage active, compares zero
-> scoreboard ingest/correlation break
symptom: compares active, random mismatches
-> normalization or correlation ID drifttask checking_smoke(env_top env_h);
if (env_h.sb.compare_hits == 0)
`uvm_fatal("CHK", "no compares observed")
if (env_h.cov.sample_hits == 0)
`uvm_fatal("CHK", "no coverage samples observed")
`uvm_info("CHK", "checking integration smoke passed", UVM_LOW)
endtaskKey takeaways
Ordered triage eliminates guesswork in checker integration failures.
Counters are faster and more reliable than ad-hoc waveform hunts.
A smoke gate should validate checker and coverage liveness together.
Common pitfalls
Debugging compare logic before validating stream ingress.
Relying on one metric (coverage or compare) as full health proof.
Skipping negative tests for disconnected paths.
Applied Patterns
Emit one compact integration packet so failures from different seeds can be compared quickly.
[CHECK] integration packet
fields:
seed
testname
monitor publish counts
sb ingest counts by stream
compare/mismatch counts
coverage sample counts
timeout/dropped counts
objective:
identify first broken stage in under one minutefunction void print_check_packet();
`uvm_info("CHK_PKT",
$sformatf("seed=%0d cmp=%0d mis=%0d cov=%0d drop=%0d",
$get_initial_random_seed(),
sb.compare_hits,
sb.mismatch_hits,
cov.sample_hits,
sb.drop_hits),
UVM_LOW)
endfunctionPackets should be stable across branches for easy diffing.
Include stream-level counters, not only aggregate values.
Print packet once per test end to keep logs readable.
Integration Drilldown
Maintain a fail-injection suite that breaks one stage per run and validates expected diagnostics.
[CHECK] fail-injection catalog
inject 1: disable monitor publish
inject 2: remove one scoreboard connect
inject 3: corrupt correlation ID
inject 4: disable coverage subscriber write
expected:
each injection emits unique primary errorKey takeaways
Fail-injection preserves debug quality as code evolves.
Common pitfalls
Allowing generic errors that hide the failed stage.