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.
[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 listfunction 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)
endfunctionKey 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
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[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 triagePlusarg and override summary
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;
endfunctionLog 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.
[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] → behaviorCommon 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.