Skip to content
DenseChip
Learn
PracticeCode labInterview

DenseChip

Navigate

Menu

LearnPracticeCode labInterview

Tools

All toolsSV editorCode repoResume
DenseChip

Practice, courses, and chip-design tools in one focused workspace.

LearnPracticeCode labInterviewToolsLearning paths

© 2026 DenseChip

AboutContactPrivacyTerms
Skip to lesson

Course contents

  • Start Here6
  • SystemVerilog Language Foundations28
  • Object-Oriented SystemVerilog for Verification30
  • Constraint Randomization — Interview-Critical Deep Dive36
  • SystemVerilog Assertions — Interview-Critical Deep Dive40
  • Functional Coverage in SystemVerilog22
    • Covergroups & Coverpoints
    • Bins: Explicit, Auto, Illegal & Ignore
    • Cross Coverage
    • Coverage Options & Methods
    • Coverage Closure & Sign-Off
      • From Spec to Coverage Plan
      • Hole Analysis and Triage
      • Closing Techniques
      • Exclusions and Waivers
      • Sign-Off Metrics and Review
  • Testbench Architecture in SystemVerilog23
  • Advanced Language & Integration25
  • Senior & Interview Preparation21
  • Principal-Level Verification28
Loading lesson

‹Coverage Closure & Sign-Off
  1. Topics
  2. SystemVerilog
  3. Functional Coverage in SystemVerilog
  4. Coverage Closure & Sign-Off
  5. Hole Analysis and Triage

Part 5 · Functional Coverage · Intermediate

Hole Analysis and Triage

Read merged reports, sort holes into four classes, and triage cheapest-first with a worked example.

On this page

    Why this matters

    An engineer spent two days writing a test for a hole seen in one seed. The merged database showed another seed had hit it forty times.

    After this lesson you can: read a merged report, sort each hole into one of four classes, and triage cheapest question first.

    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, and 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 cause, not ten.

    Merged report, 500 seeds

    Hits or coverage

    Status

    dma_cg

    88.9%, goal 100

    cp_len: one, mid, max_len

    48,211, 1.2 M, 9,077

    100%

    cp_btype

    100%

    x_shape

    66.7%

    <incr,one,aligned>

    3,022

    Covered

    <incr,max_len,unalign>

    0

    Hole

    <wrap,mid,aligned>

    640

    Covered

    <fixed,one,unalign>

    18

    Hole: below at_least 32

    err_cg

    66.7%, goal 90

    cp_err: parity, timeout, crc

    211, 0, 3

    timeout is a hole

    • UNREACHABLE: the scenario is impossible. Action: illegal_bins when the spec forbids it, otherwise ignore_bins plus a documented waiver, not a test.

    • NEEDS-NEW-TEST: reachable, but no stimulus aims there. Action: a directed test or a new sequence.

    • NEEDS-CONSTRAINT-CHANGE: existing random stimulus reaches it once its constraints or distribution change. Action: retune constraints, no new test.

    • WRONG-BIN: the model is buggy, through a bad range, wrong signal, or wrong sample event. Action: fix the model, since past data for that bin is void.

    The triage flow

    A hole, meaning merged hits below at_least, goes through four questions. Q1: is the bin definition correct? If not, it is a wrong bin: fix the model and void its old data. Q2: is the scenario reachable? If not, it is unreachable: illegal_bins if the spec forbids it, otherwise ignore_bins plus a waiver. Q3: can existing stimulus reach it with a constraint change? If yes, retune dist, inline constraints or targeted seeds. Otherwise it needs a new directed test or sequence.
    Triage each hole, cheapest question first.

    Order matters: checking the bin (Q1) costs minutes, and 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 of five holes

    Hole

    Finding

    Class and action

    1. <incr,max_len,unalign>, 0 hits

    The constraint file aligns the address to 4 in every sequence; the spec allows unaligned INCR

    NEEDS-CONSTRAINT-CHANGE: relax alignment in one sequence

    2. cp_err.timeout, 0 hits

    The timeout is 10 ms and tests run 1 ms of simulated time: it can never fire

    NEEDS-NEW-TEST: a short-timeout configuration and a directed timeout test

    3. <wrap,one,*> cells, 0 hits

    Spec s7.2.1 forbids WRAP of length 1. The two-way plan cross has the illegal_bins, but x_shape adds cp_align and never got it, so both alignment cells sit in the goal

    UNREACHABLE (a spec NO): add illegal_bins for wrap × one to x_shape; a binsof without cp_align covers both alignments

    4. cp_occ.full64, 0 hits

    The bin is coded {64} but the occupancy counter runs 0 to 63, with full at 63 and a separate flag

    WRONG-BIN: fix to {63} and re-run; the old cp_occ data is suspect

    5. <fixed,one,unalign>, 18 hits

    Present but below at_least 32: reachable, just rare

    NEEDS-CONSTRAINT-CHANGE: weight the dist toward fixed bursts

    • Five holes, four different classes. Treating every hole as “write more tests” would waste effort on four of the five.

    • Hole 4 is the dangerous one: the model was wrong, so the 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 is a spec-forbidden cell left in the auto product. A spec NO becomes illegal_bins, never ignore_bins; writing it into every cross at plan time would have prevented the triage cost.

    Interview

    “When do you use cross coverage?” Only when design logic examines the fields together, such as burst type with length and alignment. Two coverpoints at 100% prove nothing about combinations, and every unpruned cell is future triage work.

    Common pitfall

    Triaging from a single seed instead of the merged database. Half the holes are already hit in other seeds, and the rest mislead without merged counts.

    Check yourself A cross cell shows 18 hits with at_least 32. Is it a hole?

    Yes. Below-at_least is a hole: hits exist but are too few to count as covered. The fix is distribution, not a new test.

    Check yourself Twenty empty cells share one source bin. How many problems is that?

    Likely one. Holes cluster by covergroup and cross, so fix the shared cause instead of triaging cells one by one.

    Testbench

    The bench counts the error coverpoint from the report above in three seeds with the bins model, at_least 32, then merges them the way a regression merge does: the same bins, hit counts summed.

    Predict first Seed 1 alone shows timeout, crc and overflow as holes. Which are still holes after the merge?

    Timeout, at 0 in every seed, and crc: its 2 + 9 + 7 = 18 hits are real but below at_least 32. Overflow closes, because seed 2 hit it 40 times. Triaging seed 1 alone would have chased a hole that was already closed.

    design.sv
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // uses: covmodel
    // Three seeds merged: a hole in one seed is often hit in another, and a bin below at_least is still a hole.
    module tb_hole_merge;
      cm_point seed[3], merged;
      function automatic cm_point make(string n);
        cm_point p = new(n);
        p.add("parity", 0, 0); p.add("timeout", 1, 1); p.add("crc", 2, 2); p.add("overflow", 3, 3);
        p.at_least = 32;
        return p;
      endfunction
      initial begin
        // Hits per seed for parity, timeout, crc and overflow.
        int hits[3][4] = '{'{80, 0, 2, 0}, '{70, 0, 9, 40}, '{61, 0, 7, 0}};
        foreach (seed[s]) begin
          seed[s] = make($sformatf("cp_err seed %0d", s + 1));
          foreach (hits[s][b]) repeat (hits[s][b]) seed[s].sample(b);
        end
        // The merge: the same bins, hit counts summed over every seed.
        merged = make("cp_err merged");
        foreach (seed[s]) foreach (merged.bin_list[b]) merged.bin_list[b].hits += seed[s].bin_list[b].hits;
        seed[0].report(); merged.report();
        if (seed[0].n_covered() != 1 || merged.n_covered() != 2 || merged.bin_list[2].hits != 18) $fatal(1, "FAIL: merge math");
        $display("PASS: seed 1 alone showed 3 holes; merged, overflow closed, crc sat at 18 of 32 and timeout at 0");
        $finish;
      end
    endmodule
    Terminal
      coverpoint cp_err seed 1: 25.00% (1 of 4 bins)  below goal 100
        parity         80
        timeout        0     <- hole
        crc            2     <- hole
        overflow       0     <- hole
      coverpoint cp_err merged: 50.00% (2 of 4 bins)  below goal 100
        parity         211
        timeout        0     <- hole
        crc            18    <- hole
        overflow       40
    PASS: seed 1 alone showed 3 holes; merged, overflow closed, crc sat at 18 of 32 and timeout at 0

    Remember

    • Triage from the merged database, never one seed.

    • Below at_least is a hole, even with hits.

    • Wrong bin, unreachable, constraint change, new test: check in that order.

    Rule of thumb: never pay directed-test prices for a wrong-bin problem.

    How this was checked

    Counted with the course's bins model (rich/coverage/cov_model.sv, listed on the Coverage hub) on Verilator 5.048 (--binary --timing) on 2026-10-18; every bench printed the PASS line shown. Verilator 5.048 parses covergroups with a COVERIGN warning and ignores their bins, and Icarus 13 has none, so each covergroup listing is marked not run and its bench counts the same bins with the model.

    Seed 1 alone showed three holes; merged, overflow closed, crc sat at 18 of 32 and timeout at 0.

    Related topics

    • Cross coverage

    • Covergroup options and methods

    Previous

    159 / 259

    Next: Closing Techniques

    Up next

    Up nextClosing Techniques

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • Exclusions and Waivers
    • Sign-Off Metrics and Review