80 lines
2.8 KiB
Systemverilog
80 lines
2.8 KiB
Systemverilog
// DESCRIPTION: Verilator: Verilog Test module
|
|
//
|
|
// This file ONLY is placed under the Creative Commons Public Domain
|
|
// SPDX-FileCopyrightText: 2026 Wilson Snyder
|
|
// SPDX-License-Identifier: CC0-1.0
|
|
|
|
// Test transition bins: simple 2-value, 3-value sequences, array bins,
|
|
// and multi-value items in transition steps.
|
|
|
|
// verilog_format: off
|
|
`define stop $stop
|
|
`define checkr(gotv,expv) do if ((gotv) != (expv)) begin $write("%%Error: %s:%0d: got=%f exp=%f\n", `__FILE__,`__LINE__, (gotv), (expv)); `stop; end while(0);
|
|
// verilog_format: on
|
|
|
|
module t;
|
|
logic [2:0] state;
|
|
|
|
covergroup cg;
|
|
// Simple 2-value transitions
|
|
cp_trans2: coverpoint state {
|
|
bins trans1 = (0 => 1); bins trans2 = (1 => 2); bins trans3 = (2 => 3);
|
|
}
|
|
// 3-value sequence transitions
|
|
cp_trans3: coverpoint state {
|
|
bins seq_a = (0 => 1 => 2); bins seq_b = (2 => 3 => 4);
|
|
}
|
|
// Array bins: creates a separate bin per listed transition
|
|
cp_array: coverpoint state {
|
|
bins arr[] = (0 => 1), (1 => 2), (2 => 3);
|
|
}
|
|
// Multi-value item (comma list) in transition: matches 1 or 2 in second step
|
|
cp_multi_item: coverpoint state {
|
|
bins multi = (0 => 1, 2); // second element is a two-value list
|
|
}
|
|
// Repetition-type bins: goto ([->N]) and non-consecutive ([=N]) repetition
|
|
cp_reptype: coverpoint state {
|
|
bins goto_bin = (0 => 1 [-> 2]); // goto repetition - currently matched as simple (0=>1)
|
|
bins noncons_bin = (2 [=1] => 3); // non-consecutive repetition - currently matched as simple (2=>3)
|
|
}
|
|
endgroup
|
|
|
|
// Non-convertible coverpoint (it has a transition bin) that also carries a value-array bin,
|
|
// so the legacy array codegen path (which converted coverpoints bypass) is still exercised.
|
|
covergroup cg_legacy;
|
|
cp_mix: coverpoint state {
|
|
bins tr = (0 => 1);
|
|
bins vals[] = {2, [4:5]}; // discrete + range elements (both legacy array paths)
|
|
}
|
|
endgroup
|
|
|
|
cg cg_inst = new;
|
|
cg_legacy cg_legacy_inst = new;
|
|
|
|
initial begin
|
|
// Drive sequence 0->1->2->3->4 which hits all bins
|
|
state = 0;
|
|
cg_inst.sample();
|
|
`checkr(cg_inst.get_inst_coverage(), 0.0);
|
|
state = 1;
|
|
cg_inst.sample(); // 0=>1: trans1, seq_a pos1, arr[0=>1], multi
|
|
state = 2;
|
|
cg_inst.sample(); // 1=>2: trans2, seq_a done, arr[1=>2]
|
|
state = 3;
|
|
cg_inst.sample(); // 2=>3: trans3, seq_b pos1, arr[2=>3]
|
|
state = 4;
|
|
cg_inst.sample(); // 3=>4: seq_b done
|
|
`checkr(cg_inst.get_inst_coverage(), 100.0);
|
|
|
|
// cg_legacy: exercise legacy array codegen (non-convertible coverpoint)
|
|
state = 0; cg_legacy_inst.sample();
|
|
state = 1; cg_legacy_inst.sample(); // 0=>1: tr
|
|
state = 2; cg_legacy_inst.sample(); // vals
|
|
state = 3; cg_legacy_inst.sample(); // vals
|
|
|
|
$write("*-* All Finished *-*\n");
|
|
$finish;
|
|
end
|
|
|
|
endmodule
|