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.

diagram
[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
diagram
[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 / regressions
  • Tag 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:

systemverilog
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
endfunction

Merge hygiene checklist

  1. Purge databases older than current RTL freeze tag.

  2. Verify same coverage options (per_instance, cross auto-bin settings) across tests.

  3. Confirm passive-agent coverage at chip level is included in merge.

  4. Archive merged DB + hole report with milestone tags (M3, M4, sign-off).

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

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