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.

diagram
[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 drift
systemverilog
task 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)
endtask

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

diagram
[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 minute
systemverilog
function 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)
endfunction
  • Packets 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.

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

Key takeaways

  • Fail-injection preserves debug quality as code evolves.

Common pitfalls

  • Allowing generic errors that hide the failed stage.