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
  • Testbench Architecture in SystemVerilog23
  • Advanced Language & Integration25
  • Senior & Interview Preparation21
    • Senior Debug Playbook
    • Reviewing Verification Code
    • Verification Strategy: Spec to Sign-Off
      • Spec to Verification Plan
      • Choosing the Methodology Mix
      • Milestones and Progress Metrics
      • Risk, Schedule, and Sign-Off
    • SystemVerilog Interview Q&A Bank
    • Capstone: Verify a Parameterized FIFO
  • Principal-Level Verification28
Loading lesson

‹Verification Strategy: Spec to Sign-Off
  1. Topics
  2. SystemVerilog
  3. Senior & Interview Preparation
  4. Verification Strategy: Spec to Sign-Off
  5. Milestones and Progress Metrics

Part 8 · Senior & Interview Prep · Intermediate

Milestones and Progress Metrics

Four phases with exits, a weekly dashboard, and audits that keep every metric honest.

On this page

    Move through four phases

    Verification projects move through recognizable phases, each with its own exit criterion. Knowing the current phase tells the team what to measure: counting coverage during bring-up is noise, and counting written tests during closure is noise.

    Diagram
    VERIFICATION TIMELINE
    
      BRING-UP          FEATURE-COMPLETE      COVERAGE CLOSURE    CONVERGENCE
      ─────────────────►─────────────────────►───────────────────►────────────►
      first txn         every plan row has    merged coverage     bug rate
      through DUT,      a test exercising     hits goal, holes    flat-lines
      smoke passes      it at least once      analyzed/waived     near zero
    
      exit: smoke       exit: 100% plan       exit: coverage      exit: N weeks
      green on every    rows “passing”        goal + hole         clean regression
      checkin                                 review done         + bug review
    
      bugs/week:   ramps up           peaks then falls         tail
                   (TB bugs first,    (random finds the        (each late bug
                    then DUT bugs)     weird ones)              is a red flag)
    1. Bring-up: one transaction end to end, testbench bugs fixed, regression skeleton standing. Days to a couple of weeks.

    2. Feature-complete: tests until every plan row is exercised. A climbing bug rate is success here, not failure.

    3. Coverage closure: seeds plus directed fills until merged functional coverage hits goal, with every hole dispositioned in writing.

    4. Convergence: regression soak. The exit is consecutive clean weeks at full volume, not a calendar date.

    Read the dashboard as trends

    Four numbers, tracked weekly, tell the real story. The trend matters more than the value: flat coverage for three weeks alarms louder than a low number climbing fast.

    Diagram
    WEEKLY METRICS DASHBOARD
    
      Metric            │ Week 6 │ Week 7 │ Week 8 │ Read it as...
      ──────────────────┼────────┼────────┼────────┼──────────────────────────
      Regression pass % │  91%   │  96%   │  94%   │ health of TB + RTL now
      Functional cov %  │  61%   │  72%   │  74%   │ progress toward closure
      (merged)          │        │        │        │ slope flattening → holes?
      Open bugs (P1/P2) │  9/14  │  6/16  │  3/11  │ P1 trend gates milestones
      Code churn        │  high  │  med   │  med   │ RTL still moving →
      (RTL commits/wk)  │        │        │        │ coverage results are stale
    
      Plus per-phase extras:
      - bring-up: tests passing smoke
      - closure:  uncovered bins by feature area, seeds/night
      - convergence: weeks since last P1, regression runtime

    The next listing is a coverage module with no testbench, so this course's checks do not run it. It shows what one merged-coverage bin looks like.

    fifo_fill_cov.sv
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // not-run: fragment: a coverage module with no testbench top
    module fifo_fill_cov (
      input logic clk,
      input logic [2:0] fill
    );
      covergroup cg_fill @(posedge clk);
        cp_fill: coverpoint fill {
          bins empty = {0};
          bins mid = {[1:3]};
          bins full = {4};
        }
      endgroup
      cg_fill cov = new();
    endmodule

    Pair every metric with an audit

    Every dashboard number can be gamed, usually by accident. Read each metric adversarially: name the failure mode that still produces this value, then run the audit that rules it out.

    Diagram
    METRIC vs REALITY
    
      Dashboard says           Could actually mean
      ──────────────────────── ─────────────────────────────────────
      pass rate 100%       →   checkers too weak to fail
      coverage 95%         →   trivial bins; real corners unmeasured
      bug rate ~0          →   stimulus exhausted, not design clean
      churn low            →   designers stopped committing...
                               or stopped fixing
    
      Defense: pair every metric with its audit
      pass rate   ↔ bug-injection spot checks
      coverage    ↔ bin-quality review in hole analysis
      bug rate    ↔ stimulus freshness (new seeds finding new bins?)
    • A test with no scoreboard passes everything. Audit it by planting a bug and confirming a test catches it.

    • One bin per feature closes fast and proves little. Audit bins during hole review, not after.

    • Random stimulus with converged constraints stops exploring. Watch the new-seed coverage delta, not just totals.

    • Track the test count beside the pass percentage, so disabled tests cannot inflate the rate quietly.

    Common mistakes

    Common pitfall

    Celebrating full pass rate without checker audits mistakes silence for correctness. Reporting single-seed coverage instead of merged regression coverage overstates closure. Letting dates rather than exit criteria declare a phase done moves the risk to silicon.

    Interview

    “Coverage is 100% but a bug escapes to silicon. What happened?”

    • Coverage measures the plan, not the design: the bug sat outside the planned features, in a bin too coarse to distinguish it, or under a checker too weak to fail.

    • Closure proves execution. Completeness of the plan itself is a review question, answered before sign-off.

    • Done is a bundle: plan rows closed, merged coverage at goal with holes reviewed, code coverage reviewed, bug rate converged, bugs dispositioned.

    Check yourself Pass rate reads 100% for three weeks. Good news or audit trigger?

    Audit trigger. Either the design converged, the checkers are too weak to fail, or failing tests were disabled. The bug-injection spot check below tells which.

    Check yourself Coverage climbs from 30% to 50% while a second block sits flat at 70%. Which needs attention?

    The flat 70%. Trends beat snapshots: three flat weeks signal unexplored holes, while the climber is still finding new bins.

    Testbench

    A checker audit in miniature. The DUT asserts full one cycle late; a pass-rate style check stays green while a cycle-exact check flags the planted difference.

    late_full_fifo.sv
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    module late_full_fifo #(parameter int DEPTH = 4) (
      input  logic clk,
      input  logic rst_n,
      input  logic push,
      output logic full
    );
      localparam int CW = $clog2(DEPTH + 1);
      logic [CW-1:0] count;
      always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
          count <= '0;
          full <= 1'b0;
        end else begin
          if (push && !full) count <= count + 1'b1;
          full <= (count == DEPTH);  // planted bug: full lags the count by one cycle
        end
      end
    endmodule
    

    Related topics

    • Choosing the Methodology Mix

    • Risk, Schedule, and Sign-Off

    Previous

    221 / 259

    Next: Risk, Schedule, and Sign-Off

    Up next

    Up nextRisk, Schedule, and Sign-Off

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • Spec to Verification Plan