Part 8 · Checking & Coverage · Intermediate
Regression Merge, Closure, and report_phase
Coverage databases, merge across seeds, per-instance coverage, and sign-off workflow.
Why merge is required
A single simulation seed rarely hits every bin and cross. Different seeds exercise different scenarios — random address ranges, varied burst lengths, different FSM paths. Regression merge unions bin hits across all seeds to produce the closure number for sign-off.
Legend: [COVER]
REGRESSION MERGE WORKFLOW
Seed 1 sim ──► cov_seed1.ucdb ──┐
Seed 2 sim ──► cov_seed2.ucdb ──┤
Seed 3 sim ──► cov_seed3.ucdb ──├──► MERGE (union of bins)
... ──┤ │
Seed N sim ──► cov_seedN.ucdb ──┘ ▼
merged.ucdb
│
▼
Map to plan rows
│
▼
Closure report
F-040 ✓ F-042 ✓ F-055 ✗ (open)
│
▼
Sign-off or add testsreport_phase and merge commands
function void report_phase(uvm_phase phase);
super.report_phase(phase);
`uvm_info("COV", $sformatf("inst coverage %0.1f%%",
cg.get_inst_coverage()), UVM_LOW)
`uvm_info("COV", $sformatf("group coverage %0.1f%%",
cg.get_coverage()), UVM_LOW)
endfunction# Run each seed with coverage enabled
simv +UVM_TESTNAME=bus_test +ntb_random_seed=1 -coverage -covfile bus.cf
simv +UVM_TESTNAME=bus_test +ntb_random_seed=2 -coverage -covfile bus.cf
# Merge all seed databases (union of bin hits)
vcover merge -out merged.ucdb cov_seed1.ucdb cov_seed2.ucdb cov_seed3.ucdb
# Report merged coverage
vcover report merged.ucdb -detail -binratio
# Questa equivalent:
# vcover merge -stats=none -out merged.ucdb cov_seed*.ucdbClosure sign-off workflow
Step-by-step
Run regression with coverage enabled — each seed writes a .ucdb or .vdb file.
Merge all seed databases — union operation, not average.
Generate merged report — map bin names to plan feature IDs.
Identify open bins — plan rows with zero hits after merge.
Add directed tests or constraint tweaks for open bins.
Re-run regression and re-merge until all plan rows hit.
Document sign-off — merged report + plan traceability matrix.
CLOSURE DECISION [COVER]
Merged bin hit > 0 for plan row?
│
├─ YES → row closed ✓
│
└─ NO
├─ Reachable with current constraints?
│ ├─ YES → add directed test or adjust weights
│ └─ NO → set_goal(0) or ignore_bins (document why)
│
└─ illegal_bins hit in any seed?
└─ YES → protocol bug, not coverage gapSingle seed rarely closes all crosses — always merge before assessing closure.
ignore_bins or set_goal(0) for provably unreachable features — document in plan.
option.per_instance = 1 for multi-agent — merge instances separately or together per plan.
illegal_bins hit in merge report — investigate protocol violation, not coverage gap.
Key takeaways
Closure = merged coverage mapped to verification plan, not single-run %.
report_phase coverage summary is per-seed; sign-off uses merged database.
Open bins after merge drive directed test creation — that is the closure loop.
Common pitfalls
Declaring closure on single seed without merge — false sign-off.
Averaging coverage % across seeds — wrong; merge unions bin hits.
Ignoring per_instance coverage — one agent at 100%, other at 0%.