verilator/test_regress/t/t_covergroup_trans.v

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