2026-06-05 15:35:01 +02:00
// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2024 by Wilson Snyder.
// SPDX-FileCopyrightText: 2024 Wilson Snyder
// SPDX-License-Identifier: CC0-1.0
// Test implicit auto-bin creation (no explicit bins) and option.auto_bin_max
// 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 ;
2026-06-06 00:36:55 +02:00
logic [ 2 : 0 ] data3 ;
logic [ 3 : 0 ] data4 ;
2026-06-05 15:35:01 +02:00
logic [ 63 : 0 ] data64 ; // 64-bit signal
// Test 1: auto_bin_max default (64) - creates 8 bins for 3-bit signal
covergroup cg1 ;
cp_data3: coverpoint data3 ;
endgroup
// Test 2: auto_bin_max = 4 at covergroup level - creates 4 bins: [0:1],[2:3],[4:5],[6:7]
covergroup cg2 ;
option . auto_bin_max = 4 ;
cp_data3: coverpoint data3 ;
endgroup
// Test 3: auto_bin_max and at_least set at coverpoint level
covergroup cg3 ;
cp_data3: coverpoint data3 {
option . auto_bin_max = 2 ; // coverpoint-level: creates 2 bins [0:3],[4:7]
2026-06-06 00:36:55 +02:00
option . at_least = 3 ; // coverpoint-level at_least
2026-06-05 15:35:01 +02:00
}
endgroup
// Test 4: auto-bins where all values in a range are excluded by ignore_bins
// auto_bin_max=4 on 4-bit signal -> 4 range bins: [0:3],[4:7],[8:11],[12:15].
// ignore_bins {[0:3]} excludes all values in the first range -> that bin is skipped.
covergroup cg4 ;
option . auto_bin_max = 4 ;
cp: coverpoint data4 {
2026-06-06 00:36:55 +02:00
ignore_bins ign = { [ 0 : 3 ] } ; // first range excluded from coverage
2026-06-05 15:35:01 +02:00
}
endgroup
// Test 5: auto-bins on a 64-bit coverpoint with auto_bin_max=4
covergroup cg5 ;
option . auto_bin_max = 4 ;
cp_data64: coverpoint data64 ;
endgroup
// Test option.auto_bin_max at covergroup level: creates 4 bins [0:1],[2:3],[4:5],[6:7]
covergroup cg6 ;
option . auto_bin_max = 4 ;
cp_data3: coverpoint data3 ;
endgroup
initial begin
cg1 cg1_inst ;
cg2 cg2_inst ;
cg3 cg3_inst ;
cg4 cg4_inst ;
cg5 cg5_inst ;
cg6 cg6_inst ;
cg1_inst = new ;
cg2_inst = new ;
cg3_inst = new ;
cg4_inst = new ;
cg5_inst = new ;
cg6_inst = new ;
2026-06-06 00:36:55 +02:00
data3 = 0 ;
cg1_inst . sample ( ) ;
2026-06-05 15:35:01 +02:00
`checkr ( cg1_inst . get_inst_coverage ( ) , 12.5 ) ; // 1/8 bins hit
2026-06-06 00:36:55 +02:00
data3 = 3 ;
cg1_inst . sample ( ) ;
2026-06-05 15:35:01 +02:00
`checkr ( cg1_inst . get_inst_coverage ( ) , 25.0 ) ; // 2/8 bins hit
2026-06-06 00:36:55 +02:00
data3 = 0 ;
cg2_inst . sample ( ) ;
2026-06-05 15:35:01 +02:00
`checkr ( cg2_inst . get_inst_coverage ( ) , 25.0 ) ; // 1/4 bins hit: [0:1]
2026-06-06 00:36:55 +02:00
data3 = 4 ;
cg2_inst . sample ( ) ;
2026-06-05 15:35:01 +02:00
`checkr ( cg2_inst . get_inst_coverage ( ) , 50.0 ) ; // 2/4 bins hit: [0:1],[4:5]
// cg3: at_least=3 at coverpoint level; both samples have count=1 < 3 -> 0% throughout
2026-06-06 00:36:55 +02:00
data3 = 1 ;
cg3_inst . sample ( ) ;
2026-06-05 15:35:01 +02:00
`checkr ( cg3_inst . get_inst_coverage ( ) , 0.0 ) ;
2026-06-06 00:36:55 +02:00
data3 = 5 ;
cg3_inst . sample ( ) ;
2026-06-05 15:35:01 +02:00
`checkr ( cg3_inst . get_inst_coverage ( ) , 0.0 ) ;
// Sample valid (non-ignored) values for cg4
// cg4: auto_bin_max=4 creates 4 bins [0:3],[4:7],[8:11],[12:15].
// ignore_bins ign={[0:3]} excludes [0:3] values; Verilator keeps all 4 bins in denominator.
// 3 of 4 bins hit -> 75% (the [0:3] bin is included in denominator but can never be hit)
2026-06-06 00:36:55 +02:00
data4 = 4 ;
cg4_inst . sample ( ) ; // [4:7] bin
data4 = 8 ;
cg4_inst . sample ( ) ; // [8:11] bin
data4 = 12 ;
cg4_inst . sample ( ) ; // [12:15] bin
2026-06-05 15:35:01 +02:00
`checkr ( cg4_inst . get_inst_coverage ( ) , 75.0 ) ;
// Sample cg5: 64-bit coverpoint - SKIP: Verilator 64-bit bin boundary bug causes 100% at first sample
2026-06-06 00:36:55 +02:00
data64 = 64 'h0 ;
cg5_inst . sample ( ) ;
data64 = 64 'h1111111111111111 ;
cg5_inst . sample ( ) ;
data64 = 64 'hffffffffffffffff ;
cg5_inst . sample ( ) ;
data3 = 0 ;
cg6_inst . sample ( ) ;
2026-06-05 15:35:01 +02:00
`checkr ( cg6_inst . get_inst_coverage ( ) , 25.0 ) ; // 1/4 bins hit: [0:1]
2026-06-06 00:36:55 +02:00
data3 = 7 ;
cg6_inst . sample ( ) ;
2026-06-05 15:35:01 +02:00
`checkr ( cg6_inst . get_inst_coverage ( ) , 50.0 ) ; // 2/4 bins hit: [0:1],[6:7]
$write ( " *-* All Finished *-* \n " ) ;
$finish ;
end
endmodule