Step 5 of 9 — Design Verification

Claude for DV Engineers

SVA assertions, UVM testbenches, coverage closure, debug, and protocol checkers — 15 copy-ready prompts for Design Verification engineers using Claude AI.

SVA UVM Functional Coverage SystemVerilog Questa / VCS Extended Thinking

What Claude Does for DV Capabilities

Claude is one of the strongest AI tools available for hardware verification work in 2026. It consistently outperforms other LLMs on VLSI tasks because it handles long SystemVerilog context, understands protocol semantics, and generates syntactically correct SVA and UVM code.

SVA Assertions
Concurrent and immediate assertions, property/sequence blocks, disable iff reset, clock specification — bind-ready output
UVM Testbench
Agent, driver, monitor, sequencer, env, scoreboard, coverage collector, base/directed test classes — complete hierarchy
Functional Coverage
Covergroup design, cross coverage, bin definitions — and analysis of existing reports to identify uncovered scenarios
Debug Assistance
Paste simulation log + waveform values — Claude traces root cause, explains the violation, suggests fix + regression test
Protocol Checkers
AHB, APB, AXI4, AXI4-Lite, SPI, I2C, UART — complete SVA checker suites targeting protocol spec requirements
Constraint Randomization
rand/randc variables, constraint blocks, weight distributions, solve-before — targeted constraints to hit specific coverage bins

DV System Prompt Claude Projects

Paste this into your Claude Project system prompt (Settings → Project Instructions). This primes Claude for every conversation in the project — no need to repeat context each time.

DV Project System Prompt
You are an expert Design Verification (DV) engineer assistant specializing in SystemVerilog and UVM-based verification.

# My Role
I am a DV engineer writing testbenches, assertions, and coverage for ASIC/FPGA designs.

# Coding Standards
- Use SystemVerilog (IEEE 1800-2017) for all verification code
- Use UVM 1.2 class library and macros (`uvm_component_utils, `uvm_object_utils
- SVA: always specify @(posedge clk) and disable iff (rst) on concurrent assertions
- Use program/interface/clocking blocks for TB/DUT boundary isolation
- Randomization: always add constraint blocks, never use $random directly
- Coverage: define meaningful bins — avoid bin names like "bin0", "bin1"

# Output Format
- Provide complete, compilable code — no "..." placeholders
- Include // Comment headers for each section
- Show the bind statement when writing assertion modules
- For UVM components, show the full class with constructor and phase methods

# What I Need
When I give you a signal interface or protocol description, generate:
1. Complete SVA assertion module (with bind)
2. UVM sequence + sequence_item
3. Functional covergroup
Unless I specify otherwise.

DV Workflow with Claude 5 Steps

1

Upload interface + spec to Claude Project

Add your DUT interface (.sv file) and protocol spec (PDF or pasted text) as project files. Claude will reference them in every conversation without you re-pasting them.

2

Generate assertion suite first

Ask Claude to write a complete SVA module covering all protocol rules. Review it — Claude often catches edge cases you hadn't explicitly specified. Bind it to the DUT immediately.

3

Build the UVM env iteratively

Start with the sequence_item → sequence → driver → monitor → scoreboard — one component at a time. Claude maintains state across messages in a Project, so the later components reference the earlier ones correctly.

4

Close coverage with directed tests

Paste your coverage report and ask Claude to identify gaps and generate targeted sequences or new constraint modes to hit uncovered bins. Use Extended Thinking for complex cross-coverage analysis.

5

Debug failures with Claude

Paste the failing assertion message, the simulation log, and the signal values at the failing timestep. Claude traces root cause through the RTL and suggests both the fix and a regression test.

15 Copy-Ready Prompts SVA / UVM / Coverage

Each prompt is designed to generate complete, compilation-ready code. Replace the bracketed parameters with your actual signal names and requirements.

01
Full SVA Assertion Module
Concurrent assertions for a custom handshake protocol
Prompt
Write a complete SystemVerilog assertion module for a [PROTOCOL_NAME] interface with these signals:
  input logic clk, rst_n
  input logic req, ack, valid
  input logic [DATA_WIDTH-1:0] data

Protocol rules:
1. req must be followed by ack within 4 cycles
2. data must be stable while valid is high
3. ack cannot be asserted without a prior req
4. No back-to-back req without ack in between

Requirements:
- Use concurrent assertions with @(posedge clk) disable iff (!rst_n)
- Create named sequences for req_to_ack and data_stable
- Include a bind statement to attach to the DUT non-intrusively
- Add $info messages in the checker for passing assertions (useful for debug)
02
AXI4-Lite Protocol Checker
Complete SVA suite for AXI4-Lite manager/subordinate
Prompt
Write a complete AXI4-Lite protocol checker in SystemVerilog assertions. Cover:
- AWVALID/AWREADY handshake rules (valid must not drop without ready)
- WVALID/WREADY handshake
- BVALID/BREADY response timing (must respond within 16 cycles)
- ARVALID/ARREADY read address channel
- RVALID/RREADY data return
- BRESP and RRESP must be OKAY(2'b00) or SLVERR(2'b10) only
- No X/Z on control signals when valid is high

Use: module axi4lite_checker #(parameter TIMEOUT=16) with parameter for max latency.
Include bind statement for: bind [DUT_MODULE_NAME] axi4lite_checker chk_u(...)
03
UVM Sequence Item + Sequence
Randomized transaction class for any bus protocol
Prompt
Write a UVM sequence_item and two sequences for an [APB/AXI4/SPI] bus:

sequence_item (apb_transaction):
- rand logic [31:0] addr (constrained to valid range 0x0000_0000 - 0x0000_FFFF)
- rand logic [31:0] data
- rand logic [3:0]  strb (write byte enables)
- rand apb_dir_e    direction (READ, WRITE)
- rand int unsigned delay (1-10 cycles, weighted: 60% = 1-2 cycles)

Sequences:
1. apb_write_seq — 100 random writes
2. apb_targeted_seq — directed writes to addresses: 0x100, 0x104, 0x108 (covers register bank)

Use `uvm_object_utils_begin macros, call super.new() in constructor, define constraint blocks with meaningful names.
04
UVM Agent (Driver + Monitor + Sequencer)
Complete agent for a virtual interface-based protocol
Prompt
Write a complete UVM agent for an APB master interface using virtual interface (apb_if vif).

Include:
- apb_driver: extends uvm_driver, run_phase drives transactions onto vif, waits for PREADY
- apb_monitor: extends uvm_monitor, samples completed transactions and writes to analysis port
- apb_sequencer: extends uvm_sequencer (typedef only)
- apb_agent: extends uvm_agent, build_phase creates driver/monitor/sequencer based on is_active
- Connect sequencer-driver TLM in connect_phase

Use `uvm_component_utils, get_full_name() in messages, check vif != null in build_phase.
05
UVM Scoreboard with Reference Model
Transaction-level scoreboard comparing DUT vs golden model
Prompt
Write a UVM scoreboard for a [16-entry FIFO / register file / pipeline] DUT.

Requirements:
- Two uvm_analysis_imp ports: one from write-side monitor, one from read-side monitor
- Internal reference model: associative array [addr] -> data for register file, or queue for FIFO
- write_export: store expected data in reference model
- read_export: compare DUT output to expected, call `uvm_error on mismatch with full transaction details
- report_phase: print pass/fail summary with total checks and mismatches
- Handle X/Z comparison: a DUT output of X is always a failure

Use `uvm_analysis_imp_decl macros for multiple imp ports.
06
Functional Coverage Collector
Covergroups for protocol states, data ranges, and corner cases
Prompt
Write a UVM coverage collector (extends uvm_subscriber) for an APB interface covering:

Covergroup 1 - apb_transaction_cg:
- cp_direction: READ, WRITE
- cp_addr_range: bins low[0:0x1FF], mid[0x200:0x3FF], high[0x400:0x7FF]
- cp_data_corners: bins zero=0, all_ones=32'hFFFF_FFFF, other = default
- cross cp_direction, cp_addr_range

Covergroup 2 - apb_timing_cg:
- cp_wait_states: bins zero_wait=0, one_wait=1, multi_wait[2:5], long_wait[6:$]
- cp_back_to_back: bins yes=1, no=0 (consecutive transactions without idle)

Sample in write() function. Print coverage percentage in report_phase.
07
Coverage Gap Analysis
Paste your coverage report — Claude identifies uncovered bins
Prompt
Here is my functional coverage report from Questa after 50K simulation cycles:

[PASTE YOUR COVERAGE REPORT TEXT HERE]

Tasks:
1. List all bins with 0 hits — categorize as: unreachable (by design), missing test, or constraint issue
2. For each uncovered bin, suggest a targeted UVM sequence or constraint modification to hit it
3. Identify any cross-coverage combinations that are structurally impossible
4. Suggest 3 additional coverpoints I should add that my current covergroups are missing

My design is: [brief description — e.g. "AXI4 slave with 8 registers, no burst support"]
08
Simulation Failure Debug
Paste your failing assertion — get root cause analysis
Prompt
My simulation has an assertion failure. Help me debug it.

Failing assertion:
[PASTE ASSERTION TEXT HERE]

Simulation log at failure time:
[PASTE LOG LINES HERE]

Signal values at T=[TIMESTAMP]ns:
  clk=1, rst_n=1, req=1, ack=0, valid=0, state=WAIT_ACK

My RTL state machine (relevant portion):
[PASTE RTL CODE HERE]

Questions:
1. What is the root cause of this failure?
2. Is this an RTL bug or a testbench bug?
3. What is the minimal fix?
4. What regression assertion should I add to prevent this from recurring?
09
Clock Domain Crossing Assertion
SVA for CDC synchronizer and metastability prevention
Prompt
Write SVA assertions for a 2-FF CDC synchronizer between clk_a (100MHz) and clk_b (83MHz):

Signals:
  input logic clk_a, clk_b, rst_n
  input logic data_a         // source domain
  input logic sync_q1, sync_q2  // synchronizer flops in clk_b domain
  output logic data_b_sync   // synchronized output

Assert:
1. data_a must be stable for at least 2 clk_a cycles before transitioning (no glitches)
2. data_b_sync must equal sync_q2 (structural check)
3. Metastability window: sync_q1 must not change within 0.5ns of clk_b rising edge (use $realtime)
4. Max synchronization latency from data_a to data_b_sync is 4 clk_b cycles

Use separate clocking blocks for each clock domain in the assertion module.
10
Constrained Random Test — Corner Cases
Directed-random sequences to hit hard-to-reach bins
Prompt
Write a UVM sequence targeting these uncovered corner cases for my FIFO DUT:

1. Write to FULL FIFO (wfull=1) — should be silently dropped
2. Read from EMPTY FIFO (rempty=1) — should return X
3. Simultaneous read and write at exact FIFO depth boundary (depth=15/16)
4. Burst write until full, then burst read until empty — back-to-back
5. Single write followed immediately by single read (depth oscillates 0→1→0)

For each case:
- Write a named sequence class (e.g. fifo_full_write_seq)
- Add assertions in the sequence body using `uvm_info to annotate what's being tested
- Specify the expected DUT behavior in a comment at the top
11
Verification Plan from Spec
Turn a block spec into a structured verification plan
Prompt
I'm verifying a [BLOCK NAME — e.g. AXI4 DMA controller]. Here is the block specification:

[PASTE SPEC SECTION OR DESCRIBE KEY FEATURES]

Generate a structured verification plan covering:
1. Feature list (each verifiable feature from the spec)
2. For each feature: verification method (directed, constrained-random, formal, or gate-level sim)
3. Coverpoints needed (what functional coverage to close)
4. SVA assertions needed (which protocol rules to encode)
5. Corner cases (the 10 most likely sources of RTL bugs in this block type)
6. Regression exit criteria (minimum coverage % and assertion pass rate)

Format as a table where possible.
12
Formal Property Spec (PSL / SVA)
Properties for JasperGold / SymbiYosys formal verification
Prompt
Write formal verification properties (SVA) for a [FIFO / arbiter / FSM] suitable for JasperGold.

Requirements:
- Safety properties: things that must never happen (assert)
- Liveness properties: things that must eventually happen (assert ...eventually)
- Assumptions (assume) to constrain the formal environment
- Cover properties to verify reachability of key states

For the [BLOCK]:
- Safety: FIFO cannot overflow (wcount > DEPTH)
- Safety: Grant cannot go to two requestors simultaneously (arbiter)
- Liveness: Every request must eventually receive a grant (within 32 cycles)
- Assumption: rst is asserted for at least 2 cycles at startup

Make properties parametric where possible. Include a comment explaining what each property verifies and what bug it would catch.
13
UVM Register Model (RAL)
Complete UVM RAL model from a register map
Prompt
Generate a UVM Register Abstraction Layer (RAL) model for these registers:

Base address: 0x4000_0000

| Offset | Name      | Width | Reset      | Access | Description               |
|--------|-----------|-------|------------|--------|---------------------------|
| 0x000  | CTRL      | 32    | 0x0000_0000| RW     | Control: [0]=enable, [1]=loopback, [7:4]=mode |
| 0x004  | STATUS    | 32    | 0x0000_0001| RO     | Status: [0]=ready, [31:1]=reserved |
| 0x008  | DATA_IN   | 32    | 0x0000_0000| WO     | Write data register       |
| 0x00C  | DATA_OUT  | 32    | 0x0000_0000| RO     | Read data register        |

Generate: individual register classes, reg_block class with build() method, map configuration.
Include a basic reg_sequence that reads STATUS, writes CTRL enable bit, then reads back.
14
Extended Thinking — Complex Debug
Use Claude's deep reasoning for multi-signal race conditions
Prompt
[Use this prompt with Extended Thinking enabled — click the lightbulb icon in Claude.ai]

I have an intermittent simulation failure that only occurs at specific seed values.
The failure involves a timing race between [two clock domains / two FSMs / pipeline stages].

Here is the full simulation log for a failing seed:
[PASTE LOG]

Here is the RTL for the modules involved:
[PASTE RTL — up to 500 lines is fine with Extended Thinking]

The failure pattern: [describe when it happens — e.g. "assertion fires 847 cycles in, but only with seeds ending in 3"]

Please:
1. Trace the exact sequence of events leading to the failure
2. Identify whether this is a functional bug, constraint issue, or timing arc problem
3. Propose the minimal RTL change to fix it
4. Explain why other seeds don't trigger it
15
Gate-Level Simulation Setup
GLS testbench with SDF back-annotation for post-synthesis sim
Prompt
Write a gate-level simulation (GLS) testbench setup for my design:

DUT: [MODULE_NAME].v (gate-level netlist from synthesis)
SDF: timing.sdf (back-annotated delays from synthesis tool)
Technology cell library: [TECH_LIB].v

Requirements:
- Include `timescale 1ns/1ps
- Use $sdf_annotate("timing.sdf", dut_inst) for back-annotation
- Add $shm_open / $vcd_dumpfile for waveform capture
- Instantiate the gate-level netlist (not RTL)
- Initialize all flops with specific reset sequence: assert rst for 10 cycles
- Add supply voltage nets (VDD=1, VSS=0) if required by standard cells
- Show the compilation command for Questa: vlog -sv +define+GATE_SIM netlist.v tb.sv

Prompt Quality Before / After

The difference in output quality is dramatic when you give Claude proper context.

❌ Weak prompt

"Write SVA for my FIFO"

✅ Strong prompt

"Write concurrent SVA for a 16-entry sync FIFO with signals wclk, rclk, rst_n, wr_en, rd_en, wfull, rempty, wcount[4:0]. Assert: wcount never exceeds 16; wfull is asserted when wcount==16; rd_en when rempty causes rempty to stay high; consecutive writes increment wcount by 1. Use disable iff (!rst_n). Show bind statement."

Extended Thinking tip

Enable Extended Thinking in Claude.ai (lightbulb icon) when debugging intermittent failures, designing a verification plan from scratch, or analyzing complex cross-coverage interactions. Claude will reason through the problem step-by-step before answering — typically catching issues that a direct answer would miss.

FAQ DV + Claude

Can Claude write SVA assertions for Verilog/SystemVerilog?
Yes. Claude excels at SVA. Give it your signal names, protocol rules, and ask for both concurrent assertions and sequences. Always specify the clock (@(posedge clk)) and reset (disable iff (!rst_n)) in your prompt — otherwise Claude may generate assertions without these, which won't work as expected. Claude also generates the bind statement automatically when asked.
Can Claude generate a complete UVM testbench?
Claude generates compilable UVM code for agents (driver, monitor, sequencer), env, scoreboard, coverage, and test classes. Use Claude Projects — upload your interface definition as a project file so Claude always knows the signal names. Build the testbench iteratively: sequence_item first, then sequences, then driver/monitor, then env. One component per conversation turn works best.
Claude vs ChatGPT — which is better for DV?
Claude is significantly better for hardware verification work. Claude Sonnet 4 generates syntactically correct SVA and UVM code more reliably, handles longer RTL context (200K tokens), understands protocol semantics more deeply, and is less prone to hallucinating non-existent UVM API calls. In 2026, most professional DV engineers using AI for VLSI verification prefer Claude over ChatGPT for these tasks.
How does Extended Thinking help with DV?
Extended Thinking gives Claude extra token budget for step-by-step reasoning before responding. For DV engineers: use it for complex debug (intermittent failures, race conditions), coverage analysis (why certain cross-bins are structurally unreachable), and verification planning (building a complete test plan from a block spec). Enable it by clicking the lightbulb icon in Claude.ai or setting thinking: {type: "enabled", budget_tokens: 10000} in the API.
What DV tasks is Claude NOT good at?
Claude cannot run simulations or access EDA tool GUIs — it works entirely on text/code. For actual simulation runs, waveform viewing, and coverage merge, you still use Questa/VCS/Xcelium. Claude also doesn't have access to your foundry PDK or proprietary IP details unless you paste them in. And for highly tool-specific Tcl scripting (e.g. JasperGold property loading commands), always verify the output against the tool's actual documentation.