brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
functional-verificationUVM-based functional verification — testbench architecture, test planning, directed and constrained-random stimulus, functional and code coverage closure, formal assist, and regression sign-off. Use when building a UVM testbench, writing tests, analysing coverage, or managing a verification regression.
Independent GitHub snapshot · Automated classification · Original documentation governs
When this skill is loaded and a user presents a verification task, do not
execute stages directly. Immediately spawn the
digital-chip-design-agents:verification-orchestrator agent and pass the full
user request and any available context to it. The orchestrator enforces the stage
sequence, loop-back rules, and sign-off criteria defined below.
Use the domain rules in this file only when the orchestrator reads this skill mid-flow for stage-specific guidance, or when the user asks a targeted reference question rather than requesting a full flow execution.
Before executing or advising on any stage, read the following files if they exist:
memory/verification/knowledge.md — known failure patterns, successful tool flags, PDK/tool quirks.
Incorporate its guidance into every stage decision. If absent, proceed without it.memory/verification/run_state.md — current run identity (run_id, design_name, tool,
last_stage). Use this to resume correctly after interruption. If absent, a new run
is starting; the orchestrator will create this file before the first stage.This pre-run read applies whether this skill is loaded by a user or called by the orchestrator mid-flow. It ensures the fix database is consulted before any diagnosis step.
Guide the complete UVM functional verification flow from testbench architecture through coverage-closed regression sign-off. Produces a verified RTL package with documented coverage and a clean regression.
verilator) — fast cycle-accurate simulator; UVM support via verilator+UVMiverilog) — event-driven simulation for quick testbench checkspip install cocotb)vcs, dialect synopsys) — industry-standard SV/UVM simulatorxrun, dialect cadence) — multi-language simulator with coverage enginevsim / vlog / vcom, dialect siemens) — mixed-language simulation with UVM supportuvm_test
└─ uvm_env
├─ agent_A (active) driver + monitor + sequencer
├─ agent_B (passive) monitor only
├─ scoreboard
├─ coverage_collector
└─ virtual_sequencer
ready low for many cycles) and maximum-rate input with no gapsWIDTH=1,
DEPTH=1 and 2, N=1, and a non-power-of-two value. A value the RTL is meant to
reject gets a test that it refuses to elaboratedesign_state.rtl.unverified[] (claims
the RTL flow concluded without a tool run) gets a test or is marked as assigned to formal.
cdc and reset entries cannot be closed by functional simulation — record them as
needing a CDC/RDC tool run rather than as coveredfeature_id: F001
description: AXI write burst handling
tests: [direct_single_write, burst_len_256, narrow_transfer]
assertions: [axi_valid_stable, axi_handshake_check]
covergroups: [burst_len_cg, burst_type_cg]
priority: P0
Testbench code is exempt from the RTL synthesis rules — initial, #delay and blocking
assignments are correct here — but it is still SystemVerilog that has to elaborate the same
way in every simulator.
`default_nettype none at the top of every testbench, interface and bind file, restored
with `default_nettype wire at the end so library code compiled after it is unaffected;
a typo in a DUT connection must be an error, not an implicit one-bit net#(.WIDTH(8))), never positional — a positional connection mis-wires silently when a
port list is reorderedint unsigned, logic [W-1:0]). An untyped parameter
and a size-cast bare literal (WIDTH'(1)) are signed; in a scoreboard comparison that
yields a false pass or a false mismatch on values with the top bit set!== so
an X or Z on the DUT output is a mismatch, not a silent passvalid without
waiting for ready, then hold valid and the payload stable until the beat is accepted. As
a sink: ready may depend on valid. A driver that waits for ready before asserting
valid deadlocks against a DUT that waits for valid, and hides DUT bugs that only appear
under back-pressurevalid && ready; valid not retracted before the beat is accepted; payload stable while
valid && !ready; valid and ready deasserted (not X) in resetImplement one directed test per V-plan entry — tests must be deterministic
Each test: verify the exact functional requirement it targets (no catch-all tests)
Error/exception paths: explicit stimulus to trigger each one
Corner cases: boundary values, max/min, overflow, underflow — one test each
Reset during active transaction: at least one test per interface
P0 tests must all pass before constrained-random phase begins
DUT bug found during directed test: write a fix_request entry to design_state.fix_requests[] per the schema in the verification-orchestrator Design State section; terminate with decision=escalate. The pipeline-orchestrator (chip-design-meta) handles RTL re-invocation — do not loop locally or wait for user confirmation.
Before filing, classify the failure as DUT bug or testbench bug, and name the mechanism,
not just the location — the reported symptom is not necessarily the bug. Set
suspected_rtl.basis to traced only when you followed the mismatch back to that signal
in the waveform; otherwise hypothesis. Start from the symptom:
| Symptom | Look first at |
|---|---|
| Intermittent, rate scales with clock ratio | Clock-domain crossing |
| Fails at bring-up, fine once running | Reset release and reset values |
| Hangs until reset | FSM state with no exit, protocol wait-for cycle |
| Wrong only for large values | Width truncation, arithmetic overflow |
| Wrong only for negative values | Signed/unsigned mix |
| Fails only under sustained load | Arbitration fairness, retracted valid, unstable payload |
| Passes in RTL sim, fails in gate sim | Blocking assignment in clocked block, incomplete sensitivity list, X-optimism |
| Degrades slowly over a long run | Leaked credit or token |
Never make a failing test pass by weakening the check: do not loosen the scoreboard comparison, disable or waive an assertion, or constrain stimulus away from the failing case unless that stimulus was illegal per the spec. A fix to the testbench must leave every other test's checking at least as strict as before
directed_tests rule 8| Type | Target | Priority |
|---|---|---|
| Functional (V-plan) | design_state.constraints.coverage.functional_pct% (default: 100%) | P0 |
| Code Line | ≥ design_state.constraints.coverage.line_pct% (default: 95%) | P1 |
| Code Branch | ≥ design_state.constraints.coverage.branch_pct% (default: 90%) | P1 |
| Code Toggle | ≥ design_state.constraints.coverage.toggle_pct% (default: 85%) | P2 |
| FSM State | design_state.constraints.coverage.fsm_state_pct% (default: 100%) | P0 |
| FSM Transition | ≥ design_state.constraints.coverage.fsm_transition_pct% (default: 95%) | P0 |
| Assertion triggered | design_state.constraints.coverage.assertion_pct% (default: 100%) | P1 |
| Tier | Trigger | Duration | Contents |
|---|---|---|---|
| Smoke | Every RTL commit | < 30 min | P0 directed tests |
| Nightly | Every night | < 8 hr | All directed + 100 random seeds |
| Weekly | Weekly gate | < 48 hr | Full suite, 1000 seeds |
| Sign-off | Tape-out gate | Unlimited | Full suite, 10,000 seeds |
coverage_analysis targets; driven by design_state.constraints.coverage.*)See plugins/meta/skills/pipeline-orchestration/SKILL.md §Constraints Schema for the authoritative schema and stage-entry validation rule.
No required keys for functional verification — all constraints in this domain are optional with schema defaults.
Optional (schema defaults apply when absent):
constraints.coverage.functional_pct (default: 100) — functional/V-plan coverage target %constraints.coverage.line_pct (default: 95) — code line coverage target %constraints.coverage.branch_pct (default: 90) — code branch coverage target %constraints.coverage.toggle_pct (default: 85) — toggle coverage target %constraints.coverage.fsm_state_pct (default: 100) — FSM state coverage target %constraints.coverage.fsm_transition_pct (default: 95) — FSM transition coverage target %constraints.coverage.assertion_pct (default: 100) — assertion trigger coverage target %Tag constraint_ref in history entries when evaluating QoR against these values (e.g. "coverage.functional_pct").
After each stage completes (regardless of whether an orchestrator session is active),
write or overwrite one JSON record in memory/verification/experiences.jsonl keyed by
run_id. This ensures data is persisted even if the flow is interrupted or called
without full orchestrator context.
Use run_id = verification_<YYYYMMDD>_<HHMMSS> (set once at flow start; reuse on each
stage update). Set signoff_achieved: false until the final sign-off stage completes.
Write memory/verification/run_state.md as the first action before launching any tool:
run_id: verification_<YYYYMMDD>_<HHMMSS>
design_name: <design>
tool: <primary tool>
start_time: <ISO-8601>
last_stage: <first stage name>
Update last_stage after each stage completes. This file lets wakeup-loop prompts
and resumed sessions identify the correct run without relying on in-memory state.
Create the file and parent directories if they do not exist.
If mcp__plugin_ecc_memory__add_observations is available in this session, emit each
applied fix as an observation to entity chip-design-verification-fixes after writing to
experiences.jsonl. Skip silently if the tool is absent — JSONL is the canonical record.