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