// 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; logic [2:0] data3; logic [3:0] data4; 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] option.at_least = 3; // coverpoint-level at_least } 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 { ignore_bins ign = {[0 : 3]}; // first range excluded from coverage } 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; data3 = 0; cg1_inst.sample(); `checkr(cg1_inst.get_inst_coverage(), 12.5); // 1/8 bins hit data3 = 3; cg1_inst.sample(); `checkr(cg1_inst.get_inst_coverage(), 25.0); // 2/8 bins hit data3 = 0; cg2_inst.sample(); `checkr(cg2_inst.get_inst_coverage(), 25.0); // 1/4 bins hit: [0:1] data3 = 4; cg2_inst.sample(); `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 data3 = 1; cg3_inst.sample(); `checkr(cg3_inst.get_inst_coverage(), 0.0); data3 = 5; cg3_inst.sample(); `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) data4 = 4; cg4_inst.sample(); // [4:7] bin data4 = 8; cg4_inst.sample(); // [8:11] bin data4 = 12; cg4_inst.sample(); // [12:15] bin `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 data64 = 64'h0; cg5_inst.sample(); data64 = 64'h1111111111111111; cg5_inst.sample(); data64 = 64'hffffffffffffffff; cg5_inst.sample(); data3 = 0; cg6_inst.sample(); `checkr(cg6_inst.get_inst_coverage(), 25.0); // 1/4 bins hit: [0:1] data3 = 7; cg6_inst.sample(); `checkr(cg6_inst.get_inst_coverage(), 50.0); // 2/4 bins hit: [0:1],[6:7] $write("*-* All Finished *-*\n"); $finish; end endmodule