1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2023 by Wilson Snyder.
// SPDX-License-Identifier: CC0-1.0
class ClsNarrow #(parameter int WIDTH);
randc bit [WIDTH-1:0] m_var;
function void test;
automatic int i;
automatic int count[2**WIDTH];
automatic int maxcount;
automatic bit bad;
automatic int randomize_result;
$display("Test %m");
for (int trial = 0; trial < 10; ++trial) begin
for (i = 0; i < (2 ** WIDTH); ++i) begin
randomize_result = randomize();
if (randomize_result !== 1) $stop;
`ifdef TEST_VERBOSE
$display("w%0d i=%0d m_var=%x", WIDTH, i, m_var);
`endif
++count[m_var];
end
end
maxcount = count[0];
bad = '0;
`ifndef TEST_IGNORE_RANDC
for (i = 0; i < (2 ** WIDTH); ++i) begin
if (maxcount != count[i]) bad = '1;
end
`endif
if (bad) begin
$display("%%Error: count mismatch");
for (i = 0; i < (2 ** WIDTH); ++i) begin
$display("w%0d entry[%0d]=%0d", WIDTH, i, count[i]);
end
$stop;
end
endfunction
endclass
class ClsWide #(parameter int WIDTH);
randc bit [WIDTH-1:0] m_var;
function void test;
automatic bit [WIDTH-1:0] last;
automatic int randomize_result;
$display("Test %m");
for (int i = 0; i < 100; ++i) begin
randomize_result = randomize();
if (randomize_result !== 1) $stop;
`ifdef TEST_VERBOSE
$display("ww%0d i=%0d m_var=%x", WIDTH, i, m_var);
`endif
if (i != 0) begin
`ifndef TEST_IGNORE_RANDC
if (m_var == last) $stop;
`endif
end
last = m_var;
end
endfunction
endclass
class ClsEnum;
typedef enum bit [3:0] {
TWO = 2,
FIVE = 5,
SIX = 6
} enum_t;
randc enum_t m_var;
function void test;
automatic enum_t last;
automatic int randomize_result;
$display("Test %m");
for (int trial = 0; trial < 10; ++trial) begin
for (int i = 0; i < 3; ++i) begin
randomize_result = randomize();
if (randomize_result !== 1) $stop;
`ifdef TEST_VERBOSE
$display("we i=%0d m_var=%x", i, m_var);
`endif
if (m_var != TWO && m_var != FIVE && m_var != SIX) $stop;
if (i != 0) begin
`ifndef TEST_IGNORE_RANDC
if (m_var == last) $stop;
`endif
end
last = m_var;
end
end
endfunction
endclass
module t (/*AUTOARG*/);
ClsNarrow #(1) c1; // Degenerate case
ClsNarrow #(2) c2;
ClsNarrow #(3) c3;
ClsNarrow #(3) c3b; // Need to have two of same size to cover dtype dedup code
ClsNarrow #(9) c9;
ClsWide #(31) c31;
ClsWide #(32) c32;
ClsEnum ce;
initial begin
c1 = new;
c1.test();
c2 = new;
c2.test();
c3 = new;
c3.test();
c3b = new;
c3b.test();
c9 = new;
c9.test();
c31 = new;
c31.test();
c32 = new;
c32.test();
ce = new;
ce.test();
$write("*-* All Finished *-*\n");
$finish();
end
endmodule
|