Part 5 · Functional Coverage · Intermediate
Hole Analysis
Reading merged reports, the four hole classes, the triage flow, and a worked triage of five example holes.
Reading a merged report
Hole analysis starts from the merged regression database — never a single seed. The report lists every bin with its merged hit count; a hole is a bin below its at_least threshold. Read holes grouped by covergroup and cross, because holes cluster: ten empty cells sharing one source bin usually mean one underlying cause, not ten.
MERGED REPORT (excerpt) 500 seeds merged
dma_cg 87.5% goal 100
cp_len 100.0%
one: 48211 mid: 1.2M max_len: 9077
cp_btype 100.0%
x_shape 66.7%
<incr,one,aligned> : 3022
<incr,max_len,unalign> : 0 ◄── HOLE
<wrap,mid,aligned> : 18
<fixed,one,unalign> : 0 ◄── HOLE
...
err_cg 60.0% goal 90
cp_err
parity: 211 timeout: 0 ◄── HOLE crc: 3The four hole classes
UNREACHABLE — design or environment makes the scenario impossible. Action: ignore_bins/exclusion with documented reason. Not a test problem.
NEEDS-NEW-TEST — reachable, but no stimulus aims there. Action: directed test or new sequence.
NEEDS-CONSTRAINT-CHANGE — random stimulus could reach it but the distribution starves it. Action: retune constraints/weights, no new test.
WRONG-BIN — the coverage model is buggy: bad range, wrong signal, sampling at the wrong event. Action: fix the model; past data for that bin is void.
The triage flow
HOLE TRIAGE FLOW (run per hole, cheapest test first)
hole (merged hits < at_least)
│
▼
Q1: Is the bin definition correct? (range, signal, sample event)
├─ NO ──► WRONG-BIN: fix model, invalidate old data for bin
▼ yes
Q2: Is the scenario reachable? (spec + designer + constraints)
├─ NO ──► UNREACHABLE: ignore_bins/exclusion + waiver doc
▼ yes
Q3: Can current random stimulus produce it?
├─ YES, but rare ──► NEEDS-CONSTRAINT-CHANGE: retune dist /
│ inline constraints / more targeted seeds
▼ no
Q4 ─────────────────────► NEEDS-NEW-TEST: directed test or
new sequence aimed at the hole
Order matters: checking the bin (Q1) costs minutes; a directed
test (Q4) costs days. Never pay Q4 prices for Q1 problems.Q2 is the step that involves people: reachability questions are answered fastest by the designer, who knows whether the combination shares logic or is structurally cut off.
Worked triage — five holes
HOLE FINDING CLASS / ACTION
───────────────────────────────────────────────────────────────────────────
1 <incr,max_len,unalign> constraint file: addr aligned NEEDS-CONSTRAINT-
cross cell, 0 hits to 4 in ALL sequences; spec CHANGE: relax
allows unaligned INCR alignment in one seq
2 cp_err.timeout, 0 hits timeout = 10ms; tests run 1ms NEEDS-NEW-TEST:
sim time — can never fire short-timeout cfg +
directed timeout test
3 <wrap,one,*> cells, 0 hits spec s7.2.1: WRAP len-1 UNREACHABLE:
forbidden; already illegal these cells were auto
elsewhere product — ignore_bins
4 cp_occ.full64, 0 hits bin coded {64} but occupancy WRONG-BIN: fix to
counter is 0..63 (full at 63 {63}; re-run — old
with separate full flag) cp_occ data suspect
5 <fixed,one,unalign>, 18 present but below at_least=32 NEEDS-CONSTRAINT-
hits (at_least = 32) reachable, just rare CHANGE: weight dist
toward fixed burstsWhat the worked triage shows
Five holes, four different classes — bulk-treating all holes as 'write more tests' would have wasted effort on 1, 3, 4, and 5.
Hole 4 is the dangerous one: the model was wrong, so the covergroup's past 'coverage' of that area was fiction.
Hole 5 is not empty — below-at_least bins are holes too, and the fix is distribution, not existence.
Hole 3 shows auto-product residue: pruning decided at plan time (previous lessons) would have prevented the triage cost.
Interview angle: "Coverage is stuck at 90% a week before tape-out — what do you do?" wants the triage flow, in order: verify the bins are right, split holes by reachability with the designer, prune the unreachable with documentation, steer constraints for the rare, and spend directed-test effort only on the remainder. Naming the four classes and the cheapest-first ordering is the senior signal.
Key takeaways
Triage from the merged database, grouped by cross — clustered holes share single causes.
Every hole lands in one of four classes: unreachable, needs-new-test, needs-constraint-change, wrong-bin.
Run the triage questions cheapest-first: model correctness, reachability, distribution, then directed tests.
Below-at_least bins are holes too — existence of hits is not sufficiency of hits.
Common pitfalls
Triaging from a single seed's report — half your 'holes' are already hit in other seeds.
Writing directed tests for unreachable cells — days of effort to hit a structurally impossible scenario.
Trusting hit counts from a wrong-bin — fixing the bin silently invalidates previously claimed coverage.
Triaging holes one by one when twenty share a source bin — fix the shared cause once.