Part 11 · Senior Prep · Intermediate
Regression Coverage Merge: One Truth Across Seeds
Merging per-run UCDB/VDB databases from nightly regressions — seed attribution, merge scripts, and database hygiene for closure teams.
Single-seed coverage lies
A lucky seed can hit rare bins once; closure needs the union across all regression runs . Merge tools (Questa UCDB, VCS VDB, Xcelium IMC) combine per-test databases into one view where a bin is covered if any seed hit it.
[CLOSE][SENIOR][UVM] merge topology
seed_1001/test_axi_base.ucdb ──┐
seed_2048/test_axi_base.ucdb ──┼──► merge script
seed_4099/test_axi_rand.ucdb ──┤ │
seed_7777/test_axi_stress.ucdb──┘ ▼
merged_regression.ucdb
│
▼
hole report + trend dashboard[CLOSE] typical merge workflow (tool-agnostic)
1. Each test writes -coverage + ucdb/vdb at end of sim
2. Nightly job collects all *.ucdb from regression farm
3. merge -stats -out merged_$(date).ucdb *.ucdb
4. report -detail -uncovered > holes_$(date).txt
5. diff vs yesterday → new hits / regressionsTag each database with test name, seed, and git SHA in the regression manifest.
Merge includes all closure-relevant tests — not only the nightly smoke subset.
Track merge regressions: a bin that was covered yesterday but not today is a red flag.
Key takeaways
Closure metrics come from merged databases — never a single seed.
Manifest test+seed+SHA for reproducibility and audit.
Diff merged reports day-over-day to catch coverage regressions.
Common pitfalls
Merging only passing tests — failing runs may still contribute bin hits.
Stale databases from old RTL polluting the merged view.
No seed attribution when a hole closes — cannot reproduce the hit.
UVM report_phase and database export
Dump per-instance coverage in report_phase for smoke visibility; the regression merge still owns closure metrics:
function void report_phase(uvm_phase phase);
super.report_phase(phase);
real inst_cov = cg.get_inst_coverage();
`uvm_info("COV", $sformatf("%s inst_cov=%0.1f%%",
get_full_name(), inst_cov), UVM_LOW)
// sim flag -coverage writes UCDB; merge happens offline
endfunctionMerge hygiene checklist
Purge databases older than current RTL freeze tag.
Verify same coverage options (per_instance, cross auto-bin settings) across tests.
Confirm passive-agent coverage at chip level is included in merge.
Archive merged DB + hole report with milestone tags (M3, M4, sign-off).
[CLOSE][SENIOR] seed attribution example
HOLE CLOSED: x_wr_large.wr_large
FIRST HIT: test_axi_stress seed=4099 (2026-06-08 nightly)
REPRO: vsim +seed=4099 +UVM_TESTNAME=axi_stress_testKey takeaways
report_phase is for per-run visibility; merge is for closure truth.
Archive merged DBs at milestones — auditors will ask.
Common pitfalls
Changing covergroup definitions without invalidating old databases.
Mixing block-level and chip-level databases without hierarchy awareness.