File: t_randc.v

package info (click to toggle)
verilator 5.038-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 162,552 kB
  • sloc: cpp: 139,204; python: 20,931; ansic: 10,222; yacc: 6,000; lex: 1,925; makefile: 1,260; sh: 494; perl: 282; fortran: 22
file content (134 lines) | stat: -rw-r--r-- 3,243 bytes parent folder | download | duplicates (2)
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