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.

diagram
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 tests

report_phase and merge commands

systemverilog
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
bash
# 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*.ucdb

Closure sign-off workflow

Step-by-step

  1. Run regression with coverage enabled — each seed writes a .ucdb or .vdb file.

  2. Merge all seed databases — union operation, not average.

  3. Generate merged report — map bin names to plan feature IDs.

  4. Identify open bins — plan rows with zero hits after merge.

  5. Add directed tests or constraint tweaks for open bins.

  6. Re-run regression and re-merge until all plan rows hit.

  7. Document sign-off — merged report + plan traceability matrix.

diagram
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 gap
  • Single 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%.