svlens is intentionally positioned as a pre-signoff structural analysis tool.
On large SoC-scale RTL, the right workflow is usually:
- run the tool on the full elaborated design,
- separate tool noise from real design risk,
- record reviewed intent in waiver files,
- use baselines / diffs to keep CI focused on new changes.
This document captures the current recommended workflow, plus the replay results from two large open SoC designs that were used to tune the tool.
This guide covers:
- connectivity baselines for
svlens conn - CDC waivers for
svlens cdc - large-design triage on designs with many expected warnings
- how to keep CI actionable after the first adoption wave
It does not redefine severity semantics:
ERROR/VIOLATIONstill deserve review firstWARN/CAUTIONoften need project contextINFOshould usually be tracked but not block CI
The following large designs were replayed against current main after the
false-alarm reduction work landed:
| Design | Top | Mode | Result |
|---|---|---|---|
| Cheshire | cheshire_soc |
conn |
182 connections, 0 errors, 238 warnings |
| Cheshire | cheshire_soc |
cdc |
0 violations, 7 cautions, 2 info |
| PULPissimo | pulpissimo |
cdc |
0 violations, 16 cautions, 4 info |
- The highest-confidence false alarms that were observed during early SoC
replay are now handled in-tool:
- optional
id_queue-styleexists_*inputs disabled byexists_req_i == 0 - intentional
isochronous_4phase_handshakecrossings - intentional
syncregcrossings - combinational-only debug/JTAG mux logic being mistaken for FF state
- optional
- Large SoC designs can still produce many warnings/cautions even when hard failures are gone.
- That makes reviewed waivers + baselines essential for day-to-day CI use.
Generate a machine-readable report for the whole design:
svlens conn -F filelist.f --top soc_top --format json -o reports/connIf your design intentionally contains many no-connect or tie-off ports, try:
svlens conn -F filelist.f --top soc_top \
--ignore-nc --ignore-tie-off \
--format json -o reports/connPrefer JSON plus your best available clock intent:
svlens cdc -F filelist.f --top soc_top --format json -o reports/cdcWith timing intent:
svlens cdc -F filelist.f --top soc_top --sdc clocks.sdc --format json -o reports/cdcor:
svlens cdc -F filelist.f --top soc_top --clock-yaml clock_domains.yaml --format json -o reports/cdcUse this order:
ERROR/VIOLATION- repeated
WARN/CAUTIONfamilies - remaining noisy-but-intentional project conventions
- connectivity: record reviewed patterns in a conn waiver file
- CDC: use a CDC waiver file only after confirming the crossing is intentional
- connectivity CI drift: compare new reports against a reviewed baseline
svlens conn supports both waivers and JSON diffing.
Good candidates:
- intentional debug outputs left open
- well-known test-only ports
- permanently unused ports in validated wrappers
Good candidates:
- block-level reports already reviewed once
- top-level reports with many legacy warnings
- CI flows where the goal is “no new connectivity regressions”
Example:
svlens conn -F filelist.f --top soc_top --format json -o reports/conn
cp reports/conn/connect_report.json baseline/connect_report.json
svlens conn -F filelist.f --top soc_top \
--diff baseline/connect_report.json \
--format json -o reports/conn-next| Stage | Policy |
|---|---|
| Initial bring-up | Review all ERROR, inspect major warning families |
| First CI gate | Fail on active ERROR, allow reviewed legacy warnings |
| Mature CI gate | Use --diff against reviewed JSON baseline |
Connectivity waivers use glob-style path matching:
waivers:
- pattern: "*.o_debug*"
type: DANGLING_OUTPUT
reason: "Debug outputs are intentionally left open at SoC top"
- pattern: "top.u_test_*"
type: "*"
reason: "Temporary test harness block"
- source: "top.u_legacy_block.i_unused_cfg"
type: UNDRIVEN_INPUT
reason: "Reviewed legacy optional port; wrapper leaves it intentionally open"- Prefer narrow patterns over broad
"*"waivers. - Prefer
source:exact matches for one-off exceptions. - Do not waive an entire subsystem until you have reviewed the individual issue family and know why it is safe.
Use CDC waivers for reviewed intentional crossings, not for “unknown but probably okay” paths.
Good candidates:
- debug-domain crossings that are architecturally intentional
- reset / bring-up sequences with known synchronization wrappers
- top-level lab / DFT structures documented by the owning team
Bad candidates:
- unsynchronized raw data crossings that were never architecturally reviewed
- crossings whose severity changed only because clock intent is incomplete
- broad pattern waivers used as a substitute for SDC / clock YAML
CDC waivers support either an exact crossing string or a simple prefix pattern.
Example:
waivers:
- id: WAIVE-001
crossing: "top.u_dbg.req_sync_q -> top.u_core.req_q"
reason: "Reviewed debug synchronizer path"
owner: "soc-infra"
date: "2026-04-05"
- id: WAIVE-002
pattern: "top.u_dbg."
reason: "Reviewed debug-domain crossings in bring-up logic"
owner: "soc-infra"- Prefer
crossing:for specific reviewed paths. - Use
pattern:only for tightly-scoped ownership boundaries. - Keep
owneranddatepopulated so waivers can be re-reviewed later.
You can generate a starting template with:
svlens cdc -F filelist.f --top soc_top --format waiver -o reports/cdcRecommended progression:
- fail on active
ERROR - store reviewed baseline JSON
- run
--diffin CI - only page humans for new connectivity regressions
Recommended progression:
- fail on active
VIOLATION - keep reviewed intentional paths in a CDC waiver file
- keep clock intent (
--sdcor--clock-yaml) under version control - track
CAUTIONtrends even if they do not block merges
These two designs are useful references for what “healthy but noisy” can look like on a large open SoC:
- Cheshire connectivity still has many warnings after hard errors were removed. That is a baseline-management problem, not necessarily a tool failure.
- Cheshire / PULPissimo CDC now show reviewed non-zero
CAUTION/INFOcounts but no remainingVIOLATIONin the replayed configuration.
That means the practical next step for similar designs is usually waiver and baseline discipline, not more blanket suppression.
- Review every new
ERROR/VIOLATIONas potentially real. - Keep waivers specific, owned, and dated.
- Prefer clock intent over waiver growth for CDC.
- Prefer diff baselines over giant wildcard waivers for connectivity.
- Re-run SoC snapshots after upgrading
svlens; a tool improvement may let you delete legacy waivers.
- CLI contract:
docs/cli-help.md - install / offline usage:
docs/install.md - JSON report contracts: