1// DESCRIPTION: Verilator: Verilog Test module
2// Ref. to  IEEE Std 1800-2017  11.4.14 & A.8.1
3//
4// stream pack/unpack for integer_type only
5// slice_size ::= simple_type | constant_expression
6//  simple_type ::=
7//   integer_type | non_integer_type | ps_type_identifier | ps_parameter_identifier
8//                  non_integer_type ::= shortreal | real | realtime
9//   integer_type ::=
10//   integer_vector_type | integer_atom_type
11//                         integer_atom_type ::= byte | shortint | int | longint | integer | time
12//   integer_vector_type ::= bit | logic | reg
13//
14// This file ONLY is placed under the Creative Commons Public Domain, for
15// any use, without warranty, 2020 by Victor Besyakov.
16// SPDX-License-Identifier: CC0-1.0
17
18module t (/*AUTOARG*/
19   // Inputs
20   clk
21   );
22   input clk;
23
24   logic [31:0] packed_data_32;
25   logic [31:0] packed_data_32_ref;
26
27   logic [31:0] v_packed_data_32;
28   logic [31:0] v_packed_data_32_ref;
29
30   logic [63:0] packed_data_64;
31   logic [63:0] packed_data_64_ref;
32
33   logic [63:0] v_packed_data_64;
34   logic [63:0] v_packed_data_64_ref;
35
36   logic [127:0] packed_data_128;
37   logic [127:0] packed_data_128_ref;
38
39   logic [127:0] v_packed_data_128;
40   logic [127:0] v_packed_data_128_ref;
41
42   logic [127:0] packed_data_128_i;
43   logic [127:0] packed_data_128_i_ref;
44
45   logic [255:0] packed_data_256;
46   logic [255:0] packed_data_256_ref;
47
48   logic [255:0] packed_time_256;
49   logic [255:0] packed_time_256_ref;
50   //
51   //integer_atom_type
52   //
53   byte          byte_in[4];
54   byte          byte_out[4];
55   //
56   int           int_in[4];
57   int           int_out[4];
58   //
59   //
60   shortint      shortint_in[4];
61   shortint      shortint_out[4];
62   //
63   longint       longint_in[4];
64   longint       longint_out[4];
65   //
66   integer       integer_in[4];
67   integer       integer_out[4];
68   //
69   time          time_in[4];
70   time          time_out[4];
71
72   //integer_vector_type
73   typedef bit [7:0] test_byte;
74   typedef bit [15:0] test_short;
75   typedef bit [31:0] test_word;
76   typedef bit [63:0] test_long;
77   //
78   test_byte bit_in[4];
79   test_byte bit_out[4];
80   //
81   test_short logic_in[4];
82   test_short logic_out[4];
83   //
84   test_word reg_in[4];
85   test_word reg_out[4];
86   //
87   string             error = "";
88
89   initial begin
90      //init
91      $write("*-* START t_stream_pack_unpack *-*\n");
92      error = test_integer_type_1(error);
93`ifdef TEST_VERBOSE
94      print_all_data("test_integer_type_1");
95`endif
96      error = test_integer_type_2(error);
97`ifdef TEST_VERBOSE
98      print_all_data("test_integer_type_2");
99`endif
100      //
101      if (error == "") $write("*-* All Finished *-*\n");
102      else begin
103         $write("*-* TEST failed error %s *-*:\n", error);
104         print_data_error(error);
105      end
106      $finish;
107   end // initial begin
108
109   function string test_integer_type_1(string error);
110      automatic string error_;
111      automatic string function_name_ = "test_integer_type_1";
112
113      error_ = error;
114      if (error_ == "") begin
115         clean_packed_data ();
116         init_data();
117         //pack
118         packed_data_32    = {<<8{byte_in}};
119         packed_data_64    = {<<16{shortint_in}};
120         packed_data_128   = {<<32{int_in}};
121         packed_data_128_i = {<<32{integer_in}};
122         packed_data_256   = {<<64{longint_in}};
123         packed_time_256   = {<<64{time_in}};
124         v_packed_data_32  = {<<8{bit_in}};
125         v_packed_data_64  = {<<16{logic_in}};
126         v_packed_data_128 = {<<32{reg_in}};
127         //unpack
128         {<<8{byte_out}}      = packed_data_32;
129         {<<16{shortint_out}} = packed_data_64;
130         {<<32{int_out}}      = packed_data_128;
131         {<<32{integer_out}}  = packed_data_128_i;
132         {<<64{longint_out}}  = packed_data_256;
133         {<<64{time_out}}     = packed_time_256;
134         {<<8{bit_out}}       = v_packed_data_32;
135         {<<16{logic_out}}    = v_packed_data_64;
136         {<<32{reg_out}}      = v_packed_data_128;
137         error_ = comp_in_out();
138      end // if (error == "")
139      return error_;
140   endfunction : test_integer_type_1
141
142   function string test_integer_type_2(string error);
143      automatic string error_;
144      automatic string function_name_ = "test_integer_type_2";
145      error_ = error;
146      if (error_ == "") begin
147         clean_packed_data ();
148         init_data();
149         //pack
150         packed_data_32    = {<<byte{byte_in}};
151         packed_data_64    = {<<shortint{shortint_in}};
152         packed_data_128   = {<<int{int_in}};
153         packed_data_128_i = {<<integer{integer_in}};
154         packed_data_256   = {<<longint{longint_in}};
155         packed_time_256   = {<<time{time_in}};
156         v_packed_data_32  = {<<test_byte{bit_in}};
157         v_packed_data_64  = {<<test_short{logic_in}};
158         v_packed_data_128 = {<<test_word{reg_in}};
159         //unpack
160         {<<byte{byte_out}}         = packed_data_32;
161         {<<shortint{shortint_out}} = packed_data_64;
162         {<<int{int_out}}           = packed_data_128;
163         {<<integer{integer_out}}   = packed_data_128_i;
164         {<<longint{longint_out}}   = packed_data_256;
165         {<<time{time_out}}         = packed_time_256;
166         {<<test_byte{bit_out}}     = v_packed_data_32;
167         {<<test_short{logic_out}}  = v_packed_data_64;
168         {<<test_word{reg_out}}     = v_packed_data_128;
169         error_ = comp_in_out();
170      end // if (error_ == "")
171      return error_;
172   endfunction : test_integer_type_2
173
174   function void clean_packed_data ();
175      packed_data_32    = 0;
176      packed_data_64    = 0;
177      packed_data_128   = 0;
178      v_packed_data_32  = 0;
179      v_packed_data_64  = 0;
180      v_packed_data_128 = 0;
181      packed_data_128_i = 0;
182      packed_data_256   = 0;
183      packed_time_256   = 0;
184   endfunction : clean_packed_data
185
186   function void print_packed_data ();
187      $display("TEST: packed_data_32=%0h", packed_data_32);
188      $display("TEST: packed_data_64=%0h", packed_data_64);
189      $display("TEST: packed_data_128=%0h", packed_data_128);
190      $display("TEST: packed_data_128_i=%0h", packed_data_128_i);
191      $display("TEST: packed_data_256=%0h", packed_data_256);
192      $display("TEST: packed_time_256=%0h", packed_time_256);
193      //
194      $display("TEST: v_packed_data_32=%0h", v_packed_data_32);
195      $display("TEST: v_packed_data_64=%0h", v_packed_data_64);
196      $display("TEST: v_packed_data_128=%0h", v_packed_data_128);
197   endfunction : print_packed_data
198
199   function void print_data_error (string error);
200      if (error == "integer_atom_type byte") begin
201         foreach (byte_in[i]) $display("byte_in[%0d]=%0h, byte_out=%0h ", i, byte_in[i], byte_out[i]);
202         $display("packed_data_32=%0h, packed_data_32_ref=%0h", packed_data_32, packed_data_32_ref);
203      end
204      if (error == "integer_atom_type shortint") begin
205         foreach (shortint_in[i]) $display("shortint_in[%0d]=%0h, shortint_ou=%0h", i, shortint_in[i], shortint_out[i]);
206         $display("packed_data_64=%0h, packed_data_64_ref=%0h", packed_data_64, packed_data_64_ref);
207      end
208      if (error == "integer_atom_type int") begin
209         foreach (int_in[i]) $display("int_in[%0d]=%0h, int_out=%0h", i, int_in[i], int_out[i]);
210         $display("packed_data_128=%0h, packed_data_128_ref=%0h ", packed_data_128, packed_data_128_ref);
211      end
212      if (error == "integer_atom_type integer") begin
213         foreach (integer_in[i]) $display("integer_in[%0d]=%0h, integer_out=%0h", i, integer_in[i], integer_out[i]);
214         $display("packed_data_128_i=%0h, packed_data_128_i_ref=%0h", packed_data_128_i, packed_data_128_i_ref);
215      end
216      if (error == "integer_atom_type longin") begin
217         foreach (longint_in[i]) $display("longint_in[%0d]=%0h, longint_out=%0h", i, longint_in[i], longint_out[i]);
218         $display("packed_data_256=%0h, packed_data_256_ref=%0h ", packed_data_256, packed_data_256_ref);
219      end
220      if (error == "integer_atom_type time") begin
221         foreach (time_in[i]) $display("time_in[%0d]=%0h, time_out=%0h", i, time_in[i], time_out[i]);
222         $display("packed_time_256=%0h, packed_time_256=%0h", packed_time_256, packed_time_256_ref);
223      end
224      //
225      if (error == "integer_vector_type bit") begin
226         foreach (bit_in[i]) $display("bit_in[%0d]=%0h, bit_out=%0h", i, bit_in[i], bit_out[i]);
227         $display("v_packed_data_32=%0h, v_packed_data_32_ref=%0h", v_packed_data_32, v_packed_data_32_ref);
228      end
229      if (error == "integer_vector_type logic") begin
230         foreach (logic_in[i]) $display("logic_in[%0d]=%0h, logic_out=%0h", i, logic_in[i], logic_out[i]);
231         $display("v_packed_data_64=%0h, v_packed_data_64_ref=%0h", v_packed_data_64, v_packed_data_64_ref);
232      end
233      if (error == "integer_vector_type reg") begin
234         foreach (reg_in[i]) $display("reg_in[%0d]%0h, reg_out=%0h", i, reg_in[i], reg_out[i]);
235         $display("v_packed_data_128=%0h, v_packed_data_128_ref=%0h", v_packed_data_128, v_packed_data_128_ref);
236      end
237   endfunction : print_data_error
238
239   function void print_all_data (string name = "");
240      foreach (byte_in[i]) $display(" %s byte_in[%0d]=%0h, byte_out=%0h ", name, i, byte_in[i], byte_out[i]);
241      $display(" %s packed_data_32=%0h, packed_data_32_ref=%0h", name, packed_data_32, packed_data_32_ref);
242
243      foreach (shortint_in[i]) $display(" %s shortint_in[%0d]=%0h, shortint_ou=%0h", name, i, shortint_in[i], shortint_out[i]);
244      $display(" %s packed_data_64=%0h,packed_data_64_ref=%0h", name, packed_data_64, packed_data_64_ref);
245
246      foreach (int_in[i]) $display(" %s int_in[%0d]=%0h, int_out=%0h", name, i, int_in[i], int_out[i]);
247      $display(" %s packed_data_128=%0h,packed_data_128_ref=%0h ",name, packed_data_128, packed_data_128_ref);
248
249      foreach (integer_in[i]) $display(" %s integer_in[%0d]=%0h, integer_out=%0h", name, i, integer_in[i], integer_out[i]);
250      $display(" %s packed_data_128_i=%0h,packed_data_128_i_ref=%0h", name, packed_data_128_i, packed_data_128_i_ref);
251
252      foreach (longint_in[i]) $display(" %s longint_in[%0d]=%0h, longint_out=%0h", name, i, longint_in[i], longint_out[i]);
253      $display(" %s packed_data_256=%0h, packed_data_256_ref=%0h ", name, packed_data_256, packed_data_256_ref);
254
255      foreach (time_in[i]) $display(" %s time_in[%0d]=%0h, time_out=%0h", name, i, time_in[i], time_out[i]);
256      $display(" %s packed_time_256=%0h,packed_time_256=%0h", name, packed_time_256, packed_time_256_ref);
257      //
258      foreach (bit_in[i]) $display(" %s bit_in[%0d]=%0h, bit_out=%0h", name, i, bit_in[i], bit_out[i]);
259      $display(" %s v_packed_data_32=%0h, v_packed_data_32_ref=%0h", name, v_packed_data_32, v_packed_data_32_ref);
260
261      foreach (logic_in[i]) $display(" %s logic_in[%0d]=%0h, logic_out=%0h", name, i, logic_in[i], logic_out[i]);
262      $display(" %s v_packed_data_64=%0h, v_packed_data_64_ref=%0h", name, v_packed_data_64, v_packed_data_64_ref);
263
264      foreach (reg_in[i]) $display(" %s reg_in[%0d]%0h, reg_out=%0h", name, i, reg_in[i], reg_out[i]);
265      $display(" %s v_packed_data_128=%0h, v_packed_data_128_ref=%0h", name, v_packed_data_128, v_packed_data_128_ref);
266   endfunction : print_all_data
267
268   function void init_data();
269      foreach (byte_in[i])     byte_in[i]     = byte'(i)+1;
270      foreach (shortint_in[i]) shortint_in[i] = 'h100+shortint'(i)+1;
271      foreach (int_in[i])      int_in[i]      = 'h200+int'(i)+1;
272      foreach (integer_in[i])  integer_in[i]  = 'h300+integer'(i)+1;
273      foreach (longint_in[i])  longint_in[i]  = 'h400+longint'(i)+1;
274      foreach (time_in[i])     time_in[i]     = 'h500+time'(i)+1;
275      //
276      foreach (bit_in[i])   bit_in[i]   = 'h10+test_byte'(i)+1;
277      foreach (logic_in[i]) logic_in[i] = 'h700+test_short'(i)+1;
278      foreach (reg_in[i])   reg_in[i]   = 'h800+test_word'(i)+1;
279      //
280      packed_data_32_ref    = {byte_in[3], byte_in[2], byte_in[1], byte_in[0]};
281      packed_data_64_ref    = {shortint_in[3], shortint_in[2], shortint_in[1], shortint_in[0]};
282      packed_data_128_ref   = {int_in[3], int_in[2], int_in[1], int_in[0]};
283      packed_data_128_i_ref = {integer_in[3], integer_in[2], integer_in[1], integer_in[0]};
284      packed_data_256_ref   = {longint_in[3], longint_in[2], longint_in[1], longint_in[0]};
285      packed_time_256_ref   = {time_in[3], time_in[2], time_in[1], time_in[0]};
286      v_packed_data_32_ref  = {bit_in[3], bit_in[2], bit_in[1], bit_in[0]};
287      v_packed_data_64_ref  = {logic_in[3], logic_in[2], logic_in[1], logic_in[0]};
288      v_packed_data_128_ref = {reg_in[3], reg_in[2], reg_in[1], reg_in[0]};
289      //
290      packed_data_32    = 0;
291      packed_data_64    = 0;
292      packed_data_128   = 0;
293      packed_data_128_i = 0;
294      packed_data_256   = 0;
295      packed_time_256   = 0;
296   endfunction : init_data
297
298   function string comp_in_out();
299      automatic string error_ = "";
300      automatic string function_name_ = "comp_in_out";
301
302      if (error_ == "") foreach (byte_in[i]) if (byte_in[i] !== byte_out[i]) error_ = "integer_atom_type byte";
303      if (error_ == "") if (packed_data_32 !== packed_data_32_ref) error_ = "integer_atom_type byte";
304
305      if (error_ == "") foreach (shortint_in[i]) if (shortint_in[i] !== shortint_out[i]) error_ = "integer_atom_type shortint";
306      if (error_ == "") if (packed_data_64 !== packed_data_64_ref)  error_ = "integer_atom_type shortint";
307
308      if (error_ == "") foreach (int_in[i]) if (int_in[i] !== int_out[i]) error_ = "integer_atom_type int";
309      if (error_ == "") if (packed_data_128 !== packed_data_128_ref) error_ = "integer_atom_type int";
310
311      if (error_ == "") foreach (integer_in[i]) if (integer_in[i] !== integer_out[i]) error_ = "integer_atom_type integer";
312      if (error_ == "") if (packed_data_128_i !== packed_data_128_i_ref) error_ = "integer_atom_type integer";
313
314      if (error_ == "") foreach (longint_in[i]) if (longint_in[i] !== longint_out[i]) error_ = "integer_atom_type longin";
315      if (error_ == "") if (packed_data_256 !== packed_data_256_ref) error_ = "integer_atom_type longin";
316
317      if (error_ == "") foreach (time_in[i]) if (time_in[i] !== time_out[i]) error_ = "integer_atom_type time";
318      if (error_ == "") if (packed_time_256 !== packed_time_256_ref) error_ = "integer_atom_type time";
319      //
320      if (error_ == "") foreach (bit_in[i]) if (bit_in[i] !== bit_out[i]) error_ = "integer_vector_type bit";
321      if (error_ == "") if (v_packed_data_32 !== v_packed_data_32_ref) error_ = "integer_vector_type bit";
322
323      if (error_ == "") foreach (logic_in[i]) if (logic_in[i] !== logic_out[i]) error_ = "integer_vector_type logic";
324      if (error_ == "") if (v_packed_data_64 !== v_packed_data_64_ref) error_ = "integer_vector_type logic";
325
326      if (error_ == "") foreach (reg_in[i]) if (reg_in[i] !== reg_out[i]) error_ = "integer_vector_type reg";
327      if (error_ == "") if (v_packed_data_128 !== v_packed_data_128_ref) error_ = "integer_vector_type reg";
328
329      return error_;
330   endfunction : comp_in_out
331
332endmodule
333