1// DESCRIPTION: Verilator: Verilog Test module
2//
3// This file ONLY is placed into the Public Domain, for any use,
4// without warranty, 2012 by Iztok Jeras.
5// SPDX-License-Identifier: CC0-1.0
6
7module t (/*AUTOARG*/
8   // Inputs
9   clk
10   );
11
12   input clk;
13
14   integer cnt = 0;
15   integer mod = 0;
16
17   // event counter
18   always @ (posedge clk)
19   if (cnt==20) begin
20      cnt <= 0;
21      mod <= mod + 1;
22   end else begin
23      cnt <= cnt + 1;
24   end
25
26   // finish report
27   always @ (posedge clk)
28   if (mod==3) begin
29      $write("*-* All Finished *-*\n");
30      $finish;
31   end
32
33   // anonymous type variable declaration
34   enum logic [2:0] {red=1, orange, yellow, green, blue, indigo, violet} rainbow7;
35
36   // named type
37   typedef enum logic {OFF, ON} t_switch;
38   t_switch switch;
39
40   // numbering examples
41   enum integer {father, mother, son[2], daughter, gerbil, dog[3]=10, cat[3:5]=20, car[3:1]=30} family;
42
43   // test of raibow7 type
44   always @ (posedge clk)
45   if (mod==0) begin
46      // write value to array
47      if      (cnt== 0)  begin
48         rainbow7 <= rainbow7.first();
49         // check number
50         if (rainbow7.num()  !== 7      ) begin $display("%d", rainbow7.num() ); $stop(); end
51         if (rainbow7        !== 3'bxxx ) begin $display("%b", rainbow7       ); $stop(); end
52      end
53      else if (cnt== 1)  begin
54         if (rainbow7        !== 3'd1   ) begin $display("%b", rainbow7       ); $stop(); end
55         if (rainbow7        !== red    ) begin $display("%b", rainbow7       ); $stop(); end
56         rainbow7 <= rainbow7.next();
57      end
58      else if (cnt== 2)  begin
59         if (rainbow7        !== 3'd2   ) begin $display("%b", rainbow7       ); $stop(); end
60         if (rainbow7        !== orange ) begin $display("%b", rainbow7       ); $stop(); end
61         rainbow7 <= rainbow7.next();
62      end
63      else if (cnt== 3)  begin
64         if (rainbow7        !== 3'd3   ) begin $display("%b", rainbow7       ); $stop(); end
65         if (rainbow7        !== yellow ) begin $display("%b", rainbow7       ); $stop(); end
66         rainbow7 <= rainbow7.next();
67      end
68      else if (cnt== 4)  begin
69         if (rainbow7        !== 3'd4   ) begin $display("%b", rainbow7       ); $stop(); end
70         if (rainbow7        !== green  ) begin $display("%b", rainbow7       ); $stop(); end
71         rainbow7 <= rainbow7.next();
72      end
73      else if (cnt== 5)  begin
74         if (rainbow7        !== 3'd5   ) begin $display("%b", rainbow7       ); $stop(); end
75         if (rainbow7        !== blue   ) begin $display("%b", rainbow7       ); $stop(); end
76         rainbow7 <= rainbow7.next();
77      end
78      else if (cnt== 6)  begin
79         if (rainbow7        !== 3'd6   ) begin $display("%b", rainbow7       ); $stop(); end
80         if (rainbow7        !== indigo ) begin $display("%b", rainbow7       ); $stop(); end
81         rainbow7 <= rainbow7.next();
82      end
83      else if (cnt== 7)  begin
84         if (rainbow7        !== 3'd7   ) begin $display("%b", rainbow7       ); $stop(); end
85         if (rainbow7        !== violet ) begin $display("%b", rainbow7       ); $stop(); end
86         rainbow7 <= rainbow7.next();
87      end
88      else if (cnt== 8)  begin
89         if (rainbow7        !== 3'd1   ) begin $display("%b", rainbow7       ); $stop(); end
90         if (rainbow7        !== red    ) begin $display("%b", rainbow7       ); $stop(); end
91         rainbow7 <= rainbow7.next();
92      end
93   end else if (mod==1) begin
94      // write value to array
95      if      (cnt== 0)  begin
96         rainbow7 <= rainbow7.last();
97         // check number
98         if (rainbow7.num()  !== 7      ) begin $display("%d", rainbow7.num() ); $stop(); end
99      end
100      else if (cnt== 1)  begin
101         if (rainbow7        !== 3'd7   ) begin $display("%b", rainbow7       ); $stop(); end
102         if (rainbow7        !== violet ) begin $display("%b", rainbow7       ); $stop(); end
103         rainbow7 <= rainbow7.prev();
104      end
105      else if (cnt== 2)  begin
106         if (rainbow7        !== 3'd6   ) begin $display("%b", rainbow7       ); $stop(); end
107         if (rainbow7        !== indigo ) begin $display("%b", rainbow7       ); $stop(); end
108         rainbow7 <= rainbow7.prev();
109      end
110      else if (cnt== 3)  begin
111         if (rainbow7        !== 3'd5   ) begin $display("%b", rainbow7       ); $stop(); end
112         if (rainbow7        !== blue   ) begin $display("%b", rainbow7       ); $stop(); end
113         rainbow7 <= rainbow7.prev();
114      end
115      else if (cnt== 4)  begin
116         if (rainbow7        !== 3'd4   ) begin $display("%b", rainbow7       ); $stop(); end
117         if (rainbow7        !== green  ) begin $display("%b", rainbow7       ); $stop(); end
118         rainbow7 <= rainbow7.prev();
119      end
120      else if (cnt== 5)  begin
121         if (rainbow7        !== 3'd3   ) begin $display("%b", rainbow7       ); $stop(); end
122         if (rainbow7        !== yellow ) begin $display("%b", rainbow7       ); $stop(); end
123         rainbow7 <= rainbow7.prev();
124      end
125      else if (cnt== 6)  begin
126         if (rainbow7        !== 3'd2   ) begin $display("%b", rainbow7       ); $stop(); end
127         if (rainbow7        !== orange ) begin $display("%b", rainbow7       ); $stop(); end
128         rainbow7 <= rainbow7.prev();
129      end
130      else if (cnt== 7)  begin
131         if (rainbow7        !== 3'd1   ) begin $display("%b", rainbow7       ); $stop(); end
132         if (rainbow7        !== red    ) begin $display("%b", rainbow7       ); $stop(); end
133         rainbow7 <= rainbow7.prev();
134      end
135      else if (cnt== 8)  begin
136         if (rainbow7        !== 3'd7   ) begin $display("%b", rainbow7       ); $stop(); end
137         if (rainbow7        !== violet ) begin $display("%b", rainbow7       ); $stop(); end
138         rainbow7 <= rainbow7.prev();
139      end
140   end
141
142   // test of t_switch type
143   always @ (posedge clk)
144   if (mod==0) begin
145      // write value to array
146      if      (cnt== 0)  begin
147         switch <= switch.first();
148         // check number
149         if (switch.num()  !== 2   ) begin $display("%d", switch.num() ); $stop(); end
150         if (switch        !== 1'bx) begin $display("%b", switch       ); $stop(); end
151      end
152      else if (cnt== 1)  begin
153         if (switch        !== 1'b0) begin $display("%b", switch       ); $stop(); end
154         if (switch        !== OFF ) begin $display("%b", switch       ); $stop(); end
155         switch <= switch.next();
156      end
157      else if (cnt== 2)  begin
158         if (switch        !== 1'b1) begin $display("%b", switch       ); $stop(); end
159         if (switch        !== ON  ) begin $display("%b", switch       ); $stop(); end
160         switch <= switch.next();
161      end
162      else if (cnt== 3)  begin
163         if (switch        !== 1'b0) begin $display("%b", switch       ); $stop(); end
164         if (switch        !== OFF ) begin $display("%b", switch       ); $stop(); end
165         switch <= switch.next();
166      end
167   end else if (mod==1) begin
168      // write value to array
169      if      (cnt== 0)  begin
170         rainbow7 <= rainbow7.last();
171         // check number
172         if (switch.num()  !== 2   ) begin $display("%d", switch.num() ); $stop(); end
173      end
174      else if (cnt== 1)  begin
175         if (switch        !== 1'b1) begin $display("%b", switch       ); $stop(); end
176         if (switch        !== ON  ) begin $display("%b", switch       ); $stop(); end
177         switch <= switch.prev();
178      end
179      else if (cnt== 2)  begin
180         if (switch        !== 1'b0) begin $display("%b", switch       ); $stop(); end
181         if (switch        !== OFF ) begin $display("%b", switch       ); $stop(); end
182         switch <= switch.prev();
183      end
184      else if (cnt== 3)  begin
185         if (switch        !== 1'b1) begin $display("%b", switch       ); $stop(); end
186         if (switch        !== ON  ) begin $display("%b", switch       ); $stop(); end
187         switch <= switch.prev();
188      end
189   end
190
191   // test of raibow7 type
192   always @ (posedge clk)
193   if (mod==0) begin
194      // write value to array
195      if      (cnt== 0)  begin
196         family <= family.first();
197         // check number
198         if (family.num()  !== 15       ) begin $display("%d", family.num() ); $stop(); end
199         if (family        !== 32'dx    ) begin $display("%b", family       ); $stop(); end
200      end
201      else if (cnt== 1)  begin
202         if (family        !== 0        ) begin $display("%b", family       ); $stop(); end
203         if (family        !== father   ) begin $display("%b", family       ); $stop(); end
204         family <= family.next();
205      end
206      else if (cnt== 2)  begin
207         if (family        !== 1        ) begin $display("%b", family       ); $stop(); end
208         if (family        !== mother   ) begin $display("%b", family       ); $stop(); end
209         family <= family.next();
210      end
211      else if (cnt== 3)  begin
212         if (family        !== 2        ) begin $display("%b", family       ); $stop(); end
213         if (family        !== son0     ) begin $display("%b", family       ); $stop(); end
214         family <= family.next();
215      end
216      else if (cnt== 4)  begin
217         if (family        !== 3        ) begin $display("%b", family       ); $stop(); end
218         if (family        !== son1     ) begin $display("%b", family       ); $stop(); end
219         family <= family.next();
220      end
221      else if (cnt== 5)  begin
222         if (family        !== 4        ) begin $display("%b", family       ); $stop(); end
223         if (family        !== daughter ) begin $display("%b", family       ); $stop(); end
224         family <= family.next();
225      end
226      else if (cnt== 6)  begin
227         if (family        !== 5        ) begin $display("%b", family       ); $stop(); end
228         if (family        !== gerbil   ) begin $display("%b", family       ); $stop(); end
229         family <= family.next();
230      end
231      else if (cnt== 7)  begin
232         if (family        !== 10       ) begin $display("%b", family       ); $stop(); end
233         if (family        !== dog0     ) begin $display("%b", family       ); $stop(); end
234         family <= family.next();
235      end
236      else if (cnt== 8)  begin
237         if (family        !== 11       ) begin $display("%b", family       ); $stop(); end
238         if (family        !== dog1     ) begin $display("%b", family       ); $stop(); end
239         family <= family.next();
240      end
241      else if (cnt== 9)  begin
242         if (family        !== 12       ) begin $display("%b", family       ); $stop(); end
243         if (family        !== dog2     ) begin $display("%b", family       ); $stop(); end
244         family <= family.next();
245      end
246      else if (cnt== 10)  begin
247         if (family        !== 20       ) begin $display("%b", family       ); $stop(); end
248         if (family        !== cat3     ) begin $display("%b", family       ); $stop(); end
249         family <= family.next();
250      end
251      else if (cnt== 11)  begin
252         if (family        !== 21       ) begin $display("%b", family       ); $stop(); end
253         if (family        !== cat4     ) begin $display("%b", family       ); $stop(); end
254         family <= family.next();
255      end
256      else if (cnt== 12)  begin
257         if (family        !== 22       ) begin $display("%b", family       ); $stop(); end
258         if (family        !== cat5     ) begin $display("%b", family       ); $stop(); end
259         family <= family.next();
260      end
261      else if (cnt== 13)  begin
262         if (family        !== 30       ) begin $display("%b", family       ); $stop(); end
263         if (family        !== car3     ) begin $display("%b", family       ); $stop(); end
264         family <= family.next();
265      end
266      else if (cnt== 14)  begin
267         if (family        !== 31       ) begin $display("%b", family       ); $stop(); end
268         if (family        !== car2     ) begin $display("%b", family       ); $stop(); end
269         family <= family.next();
270      end
271      else if (cnt== 15)  begin
272         if (family        !== 32       ) begin $display("%b", family       ); $stop(); end
273         if (family        !== car1     ) begin $display("%b", family       ); $stop(); end
274         family <= family.next();
275      end
276   end
277endmodule
278