Skip to main content

systemverilog-verification

Provides verification methodology, SVA assertion patterns, coverage techniques, and testbench templates. Use when the user mentions 'testbench', 'assertion', 'SVA', 'property', 'sequence', 'coverage', 'covergroup', 'coverpoint', 'bins', 'cross coverage', 'constrained random', 'randomize', 'constraint', 'simulate', 'waveform', 'VCD', '$display', '$finish', or 'self-checking'.

来源信息

仓库
codejunkie99/gateflow-cli
最近来源活动
2026年2月5日 21:22
检测到的 SKILL.md 语言
英语
星标
3
分支
0

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
name
SystemVerilog Verification
description
Provides verification methodology, SVA assertion patterns, coverage techniques, and testbench templates. Use when the user mentions 'testbench', 'assertion', 'SVA', 'property', 'sequence', 'coverage', 'covergroup', 'coverpoint', 'bins', 'cross coverage', 'constrained random', 'randomize', 'constraint', 'simulate', 'waveform', 'VCD', '$display', '$finish', or 'self-checking'.
version
1.0.0
# SystemVerilog Verification Reference ## SVA (SystemVerilog Assertions) ### Assertion Types | Type | Use Case | Example | |------|----------|---------| | Immediate | Procedural checks | `assert (a == b) else $error("mismatch");` | | Concurrent | Temporal sequences | `assert property (@(posedge clk) req |-> ##[1:5] ack);` | ### Temporal Operators ```systemverilog // Sequence operators ##N // Delay N cycles ##[M:N] // Delay M to N cycles ##[0:$] // Eventually (use sparingly - unbounded) // Property operators |-> // Overlapping implication (same cycle) |=> // Non-overlapping implication (next cycle) not // Property negation and // Both properties must hold or // Either property must hold ``` ### Common Assertion Patterns ```systemverilog // 1. Request-Acknowledge handshake property p_req_ack; @(posedge clk) disable iff (!rst_n) req |-> ##[1:5] ack; endproperty // 2. Mutual exclusion property p_mutex; @(posedge clk) disable iff (!rst_n) !(grant_a && grant_b); endproperty // 3. One-hot state encoding property p_onehot_state; @(posedge clk) disable iff (!rst_n) $onehot(state); endproperty // 4. Data stability during valid property p_data_stable; @(posedge clk) disable iff (!rst_n) (valid && !ready) |=> $stable(data); endproperty // 5. FIFO overflow protection property p_no_overflow; @(posedge clk) disable iff (!rst_n) full |-> !wr_en; endproperty // 6. Counter bounds property p_counter_bounds; @(posedge clk) disable iff (!rst_n) count <= MAX_VALUE; endproperty ``` ### System Functions for Assertions ```systemverilog $rose(sig) // Signal rose this cycle $fell(sig) // Signal fell this cycle $stable(sig) // Signal unchanged $changed(sig) // Signal changed $past(sig, N) // Value N cycles ago $onehot(vec) // Exactly one bit set $onehot0(vec) // At most one bit set $isunknown(sig) // Contains X or Z $countones(vec) // Number of 1s ``` ## Coverage ### Covergroup Structure ```systemverilog covergroup cg_name @(posedge clk); option.per_instance = 1; option.goal = 100; // Basic coverpoint cp_state: coverpoint state { bins idle = {IDLE}; bins active = {ACTIVE}; bins done = {DONE}; illegal_bins bad = {INVALID}; } // Range bins cp_data: coverpoint data { bins zero = {0}; bins low = {[1:63]}; bins mid = {[64:191]}; bins high = {[192:254]}; bins max = {255}; } // Transition bins cp_state_trans: coverpoint state { bins t1 = (IDLE => ACTIVE); bins t2 = (ACTIVE => DONE); bins t3 = (DONE => IDLE); } // Cross coverage cross_state_valid: cross cp_state, valid; endgroup ``` ### Coverage Best Practices 1. **Goal setting**: Set realistic goals (90-100%) 2. **Meaningful bins**: Cover interesting ranges, not just random values 3. **Illegal bins**: Mark invalid states to catch bugs 4. **Transition coverage**: Important for FSMs 5. **Cross coverage**: Test combinations that matter ## Testbench Architecture ### Recommended Structure ``` tb_top ├── Clock/Reset Generation ├── DUT Instance ├── Interface Connections ├── Stimulus (initial block or tasks) ├── Assertions (properties) ├── Coverage (covergroups) └── Result Checking (scoreboard) ``` ### Useful Tasks ```systemverilog // Reset task task automatic apply_reset(int cycles = 5); rst_n = 0; repeat(cycles) @(posedge clk); rst_n = 1; @(posedge clk); endtask // Wait for condition with timeout task automatic wait_for(ref logic condition, int timeout = 1000); fork begin wait(condition); end begin repeat(timeout) @(posedge clk); $error("Timeout waiting for condition"); end join_any disable fork; endtask // Randomized delay task automatic random_delay(int min_cycles, int max_cycles); int delay; delay = $urandom_range(max_cycles, min_cycles); repeat(delay) @(posedge clk); endtask ``` ## Constrained Random ```systemverilog class Transaction; rand bit [7:0] data; rand bit [3:0] addr; rand bit write; // Constraints constraint c_addr { addr inside {[0:10]}; // Valid address range } constraint c_data_special { data dist { 0 := 10, // 10% weight for 0 [1:254] := 80, // 80% weight for middle 255 := 10 // 10% weight for max }; } endclass // Usage Transaction tx = new(); repeat(100) begin assert(tx.randomize()); // Use tx.data, tx.addr, tx.write end ``` ## Debug Tips ### VCD File Generation ```systemverilog initial begin $dumpfile("simulation.vcd"); $dumpvars(0, tb_top); // Dump all signals // OR selective: $dumpvars(1, tb_top.u_dut); // Only DUT, 1 level deep end ``` ### Useful Display Formats ```systemverilog $display("Time=%0t data=0x%h valid=%b", $time, data, valid); $monitor("@%0t: state=%s", $time, state.name()); $strobe("End of timestep: count=%0d", count); // After NBA ``` ### Waveform Markers ```systemverilog // Add markers for key events always @(posedge error_flag) $display("=== ERROR at %0t ===", $time); ```
在 GitHub 查看