Part 10 · Advanced Topics · Intermediate

Seeds and Coverage Merge

Per-seed coverage artifacts, merge strategy, and data interpretation for closure without overcounting.

Why one seed is never enough

Constrained-random verification explores state space over many seeds. A single seed can hit a narrow region and produce misleading closure confidence. Coverage planning must treat seed as an axis of exploration.

diagram
[REG] [COVER] seed contribution model

  test T, seed S1 -> coverage C1
  test T, seed S2 -> coverage C2
  test T, seed S3 -> coverage C3

  merged(T) = union(C1, C2, C3, ...)

  Stop condition should reference merged progress slope,
  not per-run pass/fail count alone.

Artifact naming for traceability

bash
# Keep seed in coverage artifact names
run_20260610_axi_random_seed821734.ucdb
run_20260610_axi_random_seed155002.ucdb
run_20260610_axi_random_seed993421.ucdb

Merge workflow

Coverage merge should be deterministic and auditable: known input set, stable merge command, and output manifest.

bash
# Generic pattern; actual tool command varies
python3 tools/merge_cov.py \
  --input-glob "out/cov/run_*_axi_random_seed*.ucdb" \
  --output out/cov/merged_axi_random.ucdb \
  --manifest out/cov/merged_axi_random_manifest.json
diagram
[REG] merge audit trail

  inputs:
    - run_id
    - test_name
    - seed
    - ucdb path
    - status (PASS/FAIL)

  output:
    merged ucdb
    merge manifest
    summary report with delta from previous merge

Include only valid runs

  • Exclude runs that crashed before coverage dump unless policy says otherwise.

  • Tag unstable or infra-failed runs separately from design failures.

  • Prevent duplicate ingestion of same run_id.


Interpreting merged coverage with seed context

Merged percentages can hide inefficiency. Two regressions with same merged number may differ massively in seed count and runtime cost.

diagram
[PERF] coverage efficiency view

  Regression A:
    200 seeds -> 94.1% merged

  Regression B:
    60 seeds  -> 93.8% merged

  Interpretation:
    B is likely better targeted unless gap analysis proves otherwise.
    Track coverage gain per additional seed.
python
def coverage_gain_curve(points):
    # points: list[(seed_index, merged_percent)]
    gains = []
    prev = 0.0
    for idx, pct in points:
        gains.append((idx, pct - prev))
        prev = pct
    return gains

Seed-aware closure dashboard fields

  • merged coverage %

  • seeds executed and seeds merged

  • coverage gain over last N seeds

  • top tests contributing new bins

  • plateau detection flag

Key takeaways

  • Coverage closure is a merged multi-seed property, not a single-run metric.

  • Keep per-seed coverage artifacts traceable by run_id and seed.

  • Audit merge inputs and exclude invalid/incomplete runs explicitly.

  • Track marginal coverage gain per seed to detect plateaus early.

Common pitfalls

  • Merging duplicate artifacts and inflating confidence.

  • Ignoring pass/fail context when selecting merge inputs.

  • Chasing raw coverage % without seed efficiency analysis.