Part 2 · Phases & Lifecycle · Intermediate

Banner Diagnostics: Self-Documenting Regression Logs

Designing banners, cfg dumps, and metadata blocks that make every regression log reproducible and triage-friendly.

Why banners matter

A good banner answers what ran, with what seed, and what config — before any stimulus log noise. It is the anchor for every downstream triage conversation.

diagram
[PHASE][UVM] banner information hierarchy

TIER 1 (always UVM_LOW):
  test name, seed, sim time at start

TIER 2 (UVM_LOW):
  agent active/passive summary
  enabled checkers (sb, cov)

TIER 3 (UVM_MEDIUM):
  full cfg.print()
  factory override list
systemverilog
function void print_run_banner();
  string banner;
  banner = {"\n",
    "╔══════════════════════════════════════╗\n",
    $sformatf("║ TEST %-30s ║\n", get_type_name()),
    $sformatf("║ SEED %-30d ║\n", $get_initial_random_seed()),
    "╚══════════════════════════════════════╝\n"};
  `uvm_info("RUN_BANNER", banner, UVM_LOW)
endfunction

Key takeaways

  • Banner at UVM_LOW survives default regression verbosity.

  • Always include seed — every failure report needs it.

  • Cfg dump immediately after banner links intent to structure.

Common pitfalls

  • Banner only at UVM_NONE — filtered out in most runs.

  • Multi-line banner without structured fields — hard to grep.

  • Omitting plusarg overrides that changed cfg from defaults.


Diagnostic blocks for triage

Extend banners with machine-grepable key=value lines for CI dashboards.

Structured metadata lines

systemverilog
function void emit_run_metadata();
  `uvm_info("META", $sformatf("test=%s", get_type_name()), UVM_LOW)
  `uvm_info("META", $sformatf("seed=%0d", $get_initial_random_seed()), UVM_LOW)
  `uvm_info("META", $sformatf("agt_tx_mode=%s", cfg.tx_mode.name()), UVM_LOW)
  `uvm_info("META", $sformatf("sb_en=%0d cov_en=%0d", cfg.enable_sb, cfg.enable_cov), UVM_LOW)
endfunction
diagram
[PHASE] grep-friendly log patterns

grep '^UVM_INFO.*META' sim.log
   instant test/seed/cfg summary for dashboard ingest

grep 'RUN_BANNER' sim.log
   human-readable block for manual triage

Plusarg and override summary

systemverilog
function void report_active_overrides();
  `uvm_info("OVERRIDE_SUMMARY", "=== Factory Overrides ===", UVM_LOW)
  uvm_factory::get().print(1);
endfunction

function string plusarg_summary();
  string s = "PLUSARGS: ";
  if ($value$plusargs("UVM_TESTNAME=%s", s)) ; // extend per project
  return s;
endfunction
  • Log resolved plusargs, not just raw $test$plusargs presence.

  • Factory print after banner links substitutions to topology.

  • Include cmdline seed if different from SV random seed.

diagram
[PHASE][UVM] regression log anatomy

[build logs]         construction order
[connect logs]       wiring confirmation
[ELAB topology]      structure audit
[RUN_BANNER/META]    intent anchor  ← triage starts here
[run_phase logs]     behavior

Common pitfalls

  • Dumping entire cfg object at UVM_HIGH — invisible when needed.

  • Inconsistent META key names across tests — breaks dashboards.

  • Banner after first run_phase log — anchor arrives too late.