2026-06-05 15:35:01 +02:00
// DESCRIPTION: Verilator: Verilog Test module
//
// Test automatic bins: bins auto[N]
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2026 by Wilson Snyder.
// SPDX-FileCopyrightText: 2026 Wilson Snyder
// SPDX-License-Identifier: CC0-1.0
// 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 ] data ; // 3-bit: 0-7
2026-06-05 15:35:01 +02:00
logic [ 3 : 0 ] data4 ; // 4-bit signal
logic [ 63 : 0 ] data64 ; // 64-bit signal
covergroup cg ;
coverpoint data {
bins auto [ 4 ] ; // Should create 4 bins: [0:1], [2:3], [4:5], [6:7]
}
endgroup
// 4-bit signal with auto[4]: creates 4 equal-width bins covering [0:15]
covergroup cg_4bit ;
coverpoint data4 {
bins auto [ 4 ] ; // Creates 4 bins: [0:3], [4:7], [8:11], [12:15]
}
endgroup
// 4-bit auto bins with one value excluded by ignore_bins
covergroup cg_4bit_excl ;
coverpoint data4 {
ignore_bins bad = { 0 } ; // value 0 excluded from auto expansion
bins auto [ 4 ] ;
}
endgroup
// 64-bit signal with auto_bin_max=2: creates 2 bins covering the full 64-bit range
covergroup cg2 ;
option . auto_bin_max = 2 ;
coverpoint data64 ;
endgroup
initial begin
2026-06-06 00:36:55 +02:00
automatic cg cg_inst = new ;
automatic cg_4bit cg4_inst = new ;
2026-06-05 15:35:01 +02:00
automatic cg_4bit_excl cg4e_inst = new ;
2026-06-06 00:36:55 +02:00
automatic cg2 cg2_inst = new ;
2026-06-05 15:35:01 +02:00
// Sample 3-bit cg: one value per bin - 4 bins: [0:1],[2:3],[4:5],[6:7]
data = 0 ; cg_inst . sample ( ) ;
`checkr ( cg_inst . get_inst_coverage ( ) , 25.0 ) ;
data = 2 ; cg_inst . sample ( ) ;
`checkr ( cg_inst . get_inst_coverage ( ) , 50.0 ) ;
data = 5 ; cg_inst . sample ( ) ;
`checkr ( cg_inst . get_inst_coverage ( ) , 75.0 ) ;
data = 7 ; cg_inst . sample ( ) ;
`checkr ( cg_inst . get_inst_coverage ( ) , 100.0 ) ;
// Sample 4-bit bins - 4 bins: [0:3],[4:7],[8:11],[12:15]
2026-06-06 00:36:55 +02:00
data4 = 0 ;
cg4_inst . sample ( ) ; // bin [0:3]
2026-06-05 15:35:01 +02:00
`checkr ( cg4_inst . get_inst_coverage ( ) , 25.0 ) ;
2026-06-06 00:36:55 +02:00
data4 = 7 ;
cg4_inst . sample ( ) ; // bin [4:7]
2026-06-05 15:35:01 +02:00
`checkr ( cg4_inst . get_inst_coverage ( ) , 50.0 ) ;
2026-06-06 00:36:55 +02:00
data4 = 10 ;
cg4_inst . sample ( ) ; // bin [8:11]
2026-06-05 15:35:01 +02:00
`checkr ( cg4_inst . get_inst_coverage ( ) , 75.0 ) ;
2026-06-06 00:36:55 +02:00
data4 = 14 ;
cg4_inst . sample ( ) ; // bin [12:15]
2026-06-05 15:35:01 +02:00
`checkr ( cg4_inst . get_inst_coverage ( ) , 100.0 ) ;
// Sample 4-bit with exclusion (value 0 excluded; 4 auto bins for remaining values)
2026-06-06 00:36:55 +02:00
data4 = 1 ;
cg4e_inst . sample ( ) ;
2026-06-05 15:35:01 +02:00
`checkr ( cg4e_inst . get_inst_coverage ( ) , 25.0 ) ;
2026-06-06 00:36:55 +02:00
data4 = 8 ;
cg4e_inst . sample ( ) ;
2026-06-05 15:35:01 +02:00
`checkr ( cg4e_inst . get_inst_coverage ( ) , 50.0 ) ;
// Sample 64-bit cg2 - SKIP checkr: Verilator 64-bit bin boundary bug causes 100% at first sample
2026-06-06 00:36:55 +02:00
data64 = 64 'd0 ;
cg2_inst . sample ( ) ;
data64 = 64 'hFFFF _FFFF_FFFF_FFFF ;
cg2_inst . sample ( ) ;
2026-06-05 15:35:01 +02:00
$write ( " *-* All Finished *-* \n " ) ;
$finish ;
end
endmodule