1// DESCRIPTION: Verilator: Verilog Test module 2// 3// Copyright 2020 by Geza Lore. This program is free software; you can 4// redistribute it and/or modify it under the terms of either the GNU 5// Lesser General Public License Version 3 or the Perl Artistic License 6// Version 2.0. 7// SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 8 9`ifdef VCS 10 `define NO_TIME 11`endif 12 13`ifdef NC 14 `define NO_TIME 15 `define NO_INTEGER 16 `define NO_SHORTREAL 17`endif 18 19`ifdef MS 20`endif 21 22`ifdef VERILATOR 23 `define NO_SHORTREAL 24 `define NULL 64'd0 25`else 26 `define NULL null 27`endif 28 29module t (/*AUTOARG*/ 30 // Inputs 31 clk 32 ); 33 input clk; 34 35`ifdef VERILATOR 36 wire _unused = &{1'b0, clk}; 37`endif 38 39 // Legal input argument types for DPI functions 40 41 //====================================================================== 42 // Type definitions 43 //====================================================================== 44 45 // Basic types as per IEEE 1800-2017 35.5.6 46 typedef byte byte_t; 47 typedef byte unsigned byte_unsigned_t; 48 typedef shortint shortint_t; 49 typedef shortint unsigned shortint_unsigned_t; 50 typedef int int_t; 51 typedef int unsigned int_unsigned_t; 52 typedef longint longint_t; 53 typedef longint unsigned longint_unsigned_t; 54`ifndef NO_TIME 55 typedef time time_t; 56`endif 57`ifndef NO_INTEGER 58 typedef integer integer_t; 59`endif 60 typedef real real_t; 61`ifndef NO_SHORTREAL 62 typedef shortreal shortreal_t; 63`endif 64 typedef chandle chandle_t; 65 typedef string string_t; 66 typedef bit bit_t; 67 typedef logic logic_t; 68 69 // 2-state packed structures 70 typedef struct packed { bit x; } struct_2_state_1; 71 typedef struct packed { bit [15:0] x; bit [15:0] y; } struct_2_state_32; 72 typedef struct packed { bit [15:0] x; bit [16:0] y; } struct_2_state_33; 73 typedef struct packed { bit [31:0] x; bit [31:0] y; } struct_2_state_64; 74 typedef struct packed { bit [31:0] x; bit [32:0] y; } struct_2_state_65; 75 typedef struct packed { bit [63:0] x; bit [63:0] y; } struct_2_state_128; 76 77 // 2-state packed unions 78 typedef union packed { bit x; bit y; } union_2_state_1; 79 typedef union packed { bit [31:0] x; bit [31:0] y; } union_2_state_32; 80 typedef union packed { bit [32:0] x; bit [32:0] y; } union_2_state_33; 81 typedef union packed { bit [63:0] x; bit [63:0] y; } union_2_state_64; 82 typedef union packed { bit [64:0] x; bit [64:0] y; } union_2_state_65; 83 typedef union packed { bit [127:0] x; bit [127:0] y; } union_2_state_128; 84 85 // 4-state packed structures 86 typedef struct packed { logic x; } struct_4_state_1; 87 typedef struct packed { logic [15:0] x; bit [15:0] y; } struct_4_state_32; 88 typedef struct packed { logic [15:0] x; bit [16:0] y; } struct_4_state_33; 89 typedef struct packed { logic [31:0] x; bit [31:0] y; } struct_4_state_64; 90 typedef struct packed { logic [31:0] x; bit [32:0] y; } struct_4_state_65; 91 typedef struct packed { logic [63:0] x; bit [63:0] y; } struct_4_state_128; 92 93 // 4-state packed unions 94 typedef union packed { logic x; bit y; } union_4_state_1; 95 typedef union packed { logic [31:0] x; bit [31:0] y; } union_4_state_32; 96 typedef union packed { logic [32:0] x; bit [32:0] y; } union_4_state_33; 97 typedef union packed { logic [63:0] x; bit [63:0] y; } union_4_state_64; 98 typedef union packed { logic [64:0] x; bit [64:0] y; } union_4_state_65; 99 typedef union packed { logic [127:0] x; bit [127:0] y; } union_4_state_128; 100 101 //====================================================================== 102 // Imports 103 //====================================================================== 104 105 // Basic types as per IEEE 1800-2017 35.5.6 106 import "DPI-C" function void i_byte (input byte i); 107 import "DPI-C" function void i_byte_unsigned (input byte unsigned i); 108 import "DPI-C" function void i_shortint (input shortint i); 109 import "DPI-C" function void i_shortint_unsigned (input shortint unsigned i); 110 import "DPI-C" function void i_int (input int i); 111 import "DPI-C" function void i_int_unsigned (input int unsigned i); 112 import "DPI-C" function void i_longint (input longint i); 113 import "DPI-C" function void i_longint_unsigned (input longint unsigned i); 114`ifndef NO_TIME 115 import "DPI-C" function void i_time (input time i); 116`endif 117`ifndef NO_INTEGER 118 import "DPI-C" function void i_integer (input integer i); 119`endif 120 import "DPI-C" function void i_real (input real i); 121`ifndef NO_SHORTREAL 122 import "DPI-C" function void i_shortreal (input shortreal i); 123`endif 124 import "DPI-C" function void i_chandle (input chandle i); 125 import "DPI-C" function void i_string (input string i); 126 import "DPI-C" function void i_bit (input bit i); 127 import "DPI-C" function void i_logic (input logic i); 128 129 // Basic types via typedef 130 import "DPI-C" function void i_byte_t (input byte_t i); 131 import "DPI-C" function void i_byte_unsigned_t (input byte_unsigned_t i); 132 import "DPI-C" function void i_shortint_t (input shortint_t i); 133 import "DPI-C" function void i_shortint_unsigned_t (input shortint_unsigned_t i); 134 import "DPI-C" function void i_int_t (input int_t i); 135 import "DPI-C" function void i_int_unsigned_t (input int_unsigned_t i); 136 import "DPI-C" function void i_longint_t (input longint_t i); 137 import "DPI-C" function void i_longint_unsigned_t (input longint_unsigned_t i); 138`ifndef NO_TIME 139 import "DPI-C" function void i_time_t (input time_t i); 140`endif 141`ifndef NO_INTEGER 142 import "DPI-C" function void i_integer_t (input integer_t i); 143`endif 144 import "DPI-C" function void i_real_t (input real_t i); 145`ifndef NO_SHORTREAL 146 import "DPI-C" function void i_shortreal_t (input shortreal_t i); 147`endif 148 import "DPI-C" function void i_chandle_t (input chandle_t i); 149 import "DPI-C" function void i_string_t (input string_t i); 150 import "DPI-C" function void i_bit_t (input bit_t i); 151 import "DPI-C" function void i_logic_t (input logic_t i); 152 153 // 2-state packed arrays 154 import "DPI-C" function void i_array_2_state_1 (input bit [ 0:0] i); 155 import "DPI-C" function void i_array_2_state_32 (input bit [ 31:0] i); 156 import "DPI-C" function void i_array_2_state_33 (input bit [ 32:0] i); 157 import "DPI-C" function void i_array_2_state_64 (input bit [ 63:0] i); 158 import "DPI-C" function void i_array_2_state_65 (input bit [ 64:0] i); 159 import "DPI-C" function void i_array_2_state_128(input bit [127:0] i); 160 161 // 2-state packed structures 162 import "DPI-C" function void i_struct_2_state_1 (input struct_2_state_1 i); 163 import "DPI-C" function void i_struct_2_state_32 (input struct_2_state_32 i); 164 import "DPI-C" function void i_struct_2_state_33 (input struct_2_state_33 i); 165 import "DPI-C" function void i_struct_2_state_64 (input struct_2_state_64 i); 166 import "DPI-C" function void i_struct_2_state_65 (input struct_2_state_65 i); 167 import "DPI-C" function void i_struct_2_state_128 (input struct_2_state_128 i); 168 169 // 2-state packed unions 170 import "DPI-C" function void i_union_2_state_1 (input union_2_state_1 i); 171 import "DPI-C" function void i_union_2_state_32 (input union_2_state_32 i); 172 import "DPI-C" function void i_union_2_state_33 (input union_2_state_33 i); 173 import "DPI-C" function void i_union_2_state_64 (input union_2_state_64 i); 174 import "DPI-C" function void i_union_2_state_65 (input union_2_state_65 i); 175 import "DPI-C" function void i_union_2_state_128(input union_2_state_128 i); 176 177 // 4-state packed arrays 178 import "DPI-C" function void i_array_4_state_1 (input logic [ 0:0] i); 179 import "DPI-C" function void i_array_4_state_32 (input logic [ 31:0] i); 180 import "DPI-C" function void i_array_4_state_33 (input logic [ 32:0] i); 181 import "DPI-C" function void i_array_4_state_64 (input logic [ 63:0] i); 182 import "DPI-C" function void i_array_4_state_65 (input logic [ 64:0] i); 183 import "DPI-C" function void i_array_4_state_128(input logic [127:0] i); 184 185 // 4-state packed structures 186 import "DPI-C" function void i_struct_4_state_1 (input struct_4_state_1 i); 187 import "DPI-C" function void i_struct_4_state_32 (input struct_4_state_32 i); 188 import "DPI-C" function void i_struct_4_state_33 (input struct_4_state_33 i); 189 import "DPI-C" function void i_struct_4_state_64 (input struct_4_state_64 i); 190 import "DPI-C" function void i_struct_4_state_65 (input struct_4_state_65 i); 191 import "DPI-C" function void i_struct_4_state_128 (input struct_4_state_128 i); 192 193 // 4-state packed unions 194 import "DPI-C" function void i_union_4_state_1 (input union_4_state_1 i); 195 import "DPI-C" function void i_union_4_state_32 (input union_4_state_32 i); 196 import "DPI-C" function void i_union_4_state_33 (input union_4_state_33 i); 197 import "DPI-C" function void i_union_4_state_64 (input union_4_state_64 i); 198 import "DPI-C" function void i_union_4_state_65 (input union_4_state_65 i); 199 import "DPI-C" function void i_union_4_state_128(input union_4_state_128 i); 200 201 //====================================================================== 202 // Exports 203 //====================================================================== 204 205 // Basic types as per IEEE 1800-2017 35.5.6 206 export "DPI-C" function e_byte; 207 export "DPI-C" function e_byte_unsigned; 208 export "DPI-C" function e_shortint; 209 export "DPI-C" function e_shortint_unsigned; 210 export "DPI-C" function e_int; 211 export "DPI-C" function e_int_unsigned; 212 export "DPI-C" function e_longint; 213 export "DPI-C" function e_longint_unsigned; 214`ifndef NO_TIME 215 export "DPI-C" function e_time; 216`endif 217`ifndef NO_INTEGER 218 export "DPI-C" function e_integer; 219`endif 220 export "DPI-C" function e_real; 221`ifndef NO_SHORTREAL 222 export "DPI-C" function e_shortreal; 223`endif 224 export "DPI-C" function e_chandle; 225 export "DPI-C" function e_string; 226 export "DPI-C" function e_bit; 227 export "DPI-C" function e_logic; 228 229 // Basic types via typedef 230 export "DPI-C" function e_byte_t; 231 export "DPI-C" function e_byte_unsigned_t; 232 export "DPI-C" function e_shortint_t; 233 export "DPI-C" function e_shortint_unsigned_t; 234 export "DPI-C" function e_int_t; 235 export "DPI-C" function e_int_unsigned_t; 236 export "DPI-C" function e_longint_t; 237 export "DPI-C" function e_longint_unsigned_t; 238`ifndef NO_TIME 239 export "DPI-C" function e_time_t; 240`endif 241`ifndef NO_INTEGER 242 export "DPI-C" function e_integer_t; 243`endif 244 export "DPI-C" function e_real_t; 245`ifndef NO_SHORTREAL 246 export "DPI-C" function e_shortreal_t; 247`endif 248 export "DPI-C" function e_chandle_t; 249 export "DPI-C" function e_string_t; 250 export "DPI-C" function e_bit_t; 251 export "DPI-C" function e_logic_t; 252 253 // 2-state packed arrays 254 export "DPI-C" function e_array_2_state_1; 255 export "DPI-C" function e_array_2_state_32; 256 export "DPI-C" function e_array_2_state_33; 257 export "DPI-C" function e_array_2_state_64; 258 export "DPI-C" function e_array_2_state_65; 259 export "DPI-C" function e_array_2_state_128; 260 261 // 2-state packed structures 262 export "DPI-C" function e_struct_2_state_1; 263 export "DPI-C" function e_struct_2_state_32; 264 export "DPI-C" function e_struct_2_state_33; 265 export "DPI-C" function e_struct_2_state_64; 266 export "DPI-C" function e_struct_2_state_65; 267 export "DPI-C" function e_struct_2_state_128; 268 269 // 2-state packed unions 270 export "DPI-C" function e_union_2_state_1; 271 export "DPI-C" function e_union_2_state_32; 272 export "DPI-C" function e_union_2_state_33; 273 export "DPI-C" function e_union_2_state_64; 274 export "DPI-C" function e_union_2_state_65; 275 export "DPI-C" function e_union_2_state_128; 276 277 // 4-state packed arrays 278 export "DPI-C" function e_array_4_state_1; 279 export "DPI-C" function e_array_4_state_32; 280 export "DPI-C" function e_array_4_state_33; 281 export "DPI-C" function e_array_4_state_64; 282 export "DPI-C" function e_array_4_state_65; 283 export "DPI-C" function e_array_4_state_128; 284 285 // 4-state packed structures 286 export "DPI-C" function e_struct_4_state_1; 287 export "DPI-C" function e_struct_4_state_32; 288 export "DPI-C" function e_struct_4_state_33; 289 export "DPI-C" function e_struct_4_state_64; 290 export "DPI-C" function e_struct_4_state_65; 291 export "DPI-C" function e_struct_4_state_128; 292 293 // 4-state packed unions 294 export "DPI-C" function e_union_4_state_1; 295 export "DPI-C" function e_union_4_state_32; 296 export "DPI-C" function e_union_4_state_33; 297 export "DPI-C" function e_union_4_state_64; 298 export "DPI-C" function e_union_4_state_65; 299 export "DPI-C" function e_union_4_state_128; 300 301 //====================================================================== 302 // Definitions of exported functions 303 //====================================================================== 304 305 // Basic types as per IEEE 1800-2017 35.5.6 306 byte n_byte = 0; 307 function void e_byte(input byte i); 308 if (i !== 8'd10 + n_byte) $stop; 309 n_byte++; 310 endfunction 311 312 byte n_byte_unsigned = 0; 313 function void e_byte_unsigned(input byte unsigned i); 314 if (i !== 8'd20 + n_byte_unsigned) $stop; 315 n_byte_unsigned++; 316 endfunction 317 318 shortint n_shortint = 0; 319 function void e_shortint(input shortint i); 320 if (i !== 16'd30 + n_shortint) $stop; 321 n_shortint++; 322 endfunction 323 324 shortint n_shortint_unsigned = 0; 325 function void e_shortint_unsigned(input shortint unsigned i); 326 if (i !== 16'd40 + n_shortint_unsigned) $stop; 327 n_shortint_unsigned++; 328 endfunction 329 330 int n_int = 0; 331 function void e_int(input int i); 332 if (i !== 32'd50 + n_int) $stop; 333 n_int++; 334 endfunction 335 336 int n_int_unsigned = 0; 337 function void e_int_unsigned(input int unsigned i); 338 if (i !== 32'd60 + n_int_unsigned) $stop; 339 n_int_unsigned++; 340 endfunction 341 342 longint n_longint = 0; 343 function void e_longint(input longint i); 344 if (i !== 64'd70 + n_longint) $stop; 345 n_longint++; 346 endfunction 347 348 longint n_longint_unsigned = 0; 349 function void e_longint_unsigned(input longint unsigned i); 350 if (i !== 64'd80 + n_longint_unsigned) $stop; 351 n_longint_unsigned++; 352 endfunction 353 354`ifndef NO_TIME 355 longint n_time = 0; 356 function void e_time(input time i); 357 if (i !== 64'd90 + n_time) $stop; 358 n_time++; 359 endfunction 360`endif 361 362`ifndef NO_INTEGER 363 int n_integer = 0; 364 function void e_integer(input integer i); 365 if (i !== 32'd100 + n_integer) $stop; 366 n_integer++; 367 endfunction 368`endif 369 370 int n_real = 0; 371 function void e_real(input real i); 372 if (i != real'(2*n_real + 1) / 2.0) $stop; 373 n_real++; 374 endfunction 375 376`ifndef NO_SHORTREAL 377 int n_shortreal = 0; 378 function void e_shortreal(input shortreal i); 379 if (i != shortreal'(4*n_shortreal + 1)/ 4.0) $stop; 380 n_shortreal++; 381 endfunction 382`endif 383 384 int n_chandle = 0; 385 function void e_chandle(input chandle i); 386 $display("e_chandle %1d", n_chandle); 387 if (!n_chandle[0]) begin 388 if (i !== `NULL) $stop; 389 end else begin 390 if (i === `NULL) $stop; 391 end 392 n_chandle++; 393 endfunction 394 395 int n_string = 0; 396 function void e_string(input string i); 397 $display("e_string %1d", n_string); 398 if (!n_string[0]) begin 399 if (i != "Hello") $stop; 400 end else begin 401 if (i != "World") $stop; 402 end 403 n_string++; 404 endfunction 405 406 int n_bit = 0; 407 function void e_bit(input bit i); 408 $display("e_bit %1d", n_bit); 409 if (i !== n_bit[0]) $stop; 410 n_bit++; 411 endfunction 412 413 int n_logic = 0; 414 function void e_logic(input logic i); 415 $display("e_logic %1d", n_logic); 416 if (i !== ~n_logic[0]) $stop; 417 n_logic++; 418 endfunction 419 420 // Basic types via typedefs 421 byte_t n_byte_t = 0; 422 function void e_byte_t(input byte_t i); 423 if (i !== 8'd10 + n_byte_t) $stop; 424 n_byte_t += 2; 425 endfunction 426 427 byte n_byte_unsigned_t = 0; 428 function void e_byte_unsigned_t(input byte_unsigned_t i); 429 if (i !== 8'd20 + n_byte_unsigned_t) $stop; 430 n_byte_unsigned_t += 2; 431 endfunction 432 433 shortint_t n_shortint_t = 0; 434 function void e_shortint_t(input shortint_t i); 435 if (i !== 16'd30 + n_shortint_t) $stop; 436 n_shortint_t += 2; 437 endfunction 438 439 shortint n_shortint_unsigned_t = 0; 440 function void e_shortint_unsigned_t(input shortint_unsigned_t i); 441 if (i !== 16'd40 + n_shortint_unsigned_t) $stop; 442 n_shortint_unsigned_t += 2; 443 endfunction 444 445 int_t n_int_t = 0; 446 function void e_int_t(input int_t i); 447 if (i !== 32'd50 + n_int_t) $stop; 448 n_int_t += 2; 449 endfunction 450 451 int n_int_unsigned_t = 0; 452 function void e_int_unsigned_t(input int_unsigned_t i); 453 if (i !== 32'd60 + n_int_unsigned_t) $stop; 454 n_int_unsigned_t += 2; 455 endfunction 456 457 longint_t n_longint_t = 0; 458 function void e_longint_t(input longint_t i); 459 if (i !== 64'd70 + n_longint_t) $stop; 460 n_longint_t += 2; 461 endfunction 462 463 longint n_longint_unsigned_t = 0; 464 function void e_longint_unsigned_t(input longint_unsigned_t i); 465 if (i !== 64'd80 + n_longint_unsigned_t) $stop; 466 n_longint_unsigned_t += 2; 467 endfunction 468 469`ifndef NO_TIME 470 longint n_time_t = 0; 471 function void e_time_t(input time_t i); 472 if (i !== 64'd90 + n_time_t) $stop; 473 n_time_t += 2; 474 endfunction 475`endif 476 477`ifndef NO_INTEGER 478 int n_integer_t = 0; 479 function void e_integer_t(input integer_t i); 480 if (i !== 32'd100 + n_integer_t) $stop; 481 n_integer_t += 2; 482 endfunction 483`endif 484 485 int n_real_t = 0; 486 function void e_real_t(input real_t i); 487 if (i != real'(2*n_real_t + 1) / 2.0) $stop; 488 n_real_t += 2; 489 endfunction 490 491`ifndef NO_SHORTREAL 492 int n_shortreal_t = 0; 493 function void e_shortreal_t(input shortreal_t i); 494 if (i != shortreal'(4*n_shortreal_t + 1)/ 4.0) $stop; 495 n_shortreal_t += 2; 496 endfunction 497`endif 498 499 int n_chandle_t = 0; 500 function void e_chandle_t(input chandle_t i); 501 $display("e_chandle_t %1d", n_chandle_t); 502 if (!n_chandle_t[0]) begin 503 if (i === `NULL) $stop; 504 end else begin 505 if (i !== `NULL) $stop; 506 end 507 n_chandle_t++; 508 endfunction 509 510 int n_string_t = 0; 511 function void e_string_t(input string_t i); 512 $display("e_string_t %1d", n_string_t); 513 if (!n_string_t[0]) begin 514 if (i != "World") $stop; 515 end else begin 516 if (i != "Hello") $stop; 517 end 518 n_string_t++; 519 endfunction 520 521 int n_bit_t = 0; 522 function void e_bit_t(input bit_t i); 523 $display("e_bit_t %1d", n_bit_t); 524 if (i !== n_bit_t[0]) $stop; 525 n_bit_t++; 526 endfunction 527 528 int n_logic_t = 0; 529 function void e_logic_t(input logic_t i); 530 $display("e_logic_t %1d", n_logic_t); 531 if (i !== ~n_logic_t[0]) $stop; 532 n_logic_t++; 533 endfunction 534 535 // 2-state packed arrays 536 int n_array_2_state_1 = 0; 537 function void e_array_2_state_1(input bit [ 0:0] i); 538 $display("e_array_2_state_1 %1d", n_array_2_state_1); 539 if (i !== n_array_2_state_1[0]) $stop; 540 n_array_2_state_1++; 541 endfunction 542 543 int n_array_2_state_32 = 0; 544 function void e_array_2_state_32(input bit [31:0] i); 545 $display("e_array_2_state_32 %1d", n_array_2_state_32); 546 if (i !== ~32'd0 >> n_array_2_state_32) $stop; 547 n_array_2_state_32++; 548 endfunction 549 550 int n_array_2_state_33 = 0; 551 function void e_array_2_state_33(input bit [32:0] i); 552 $display("e_array_2_state_33 %1d", n_array_2_state_33); 553 if (i !== ~33'd0 >> n_array_2_state_33) $stop; 554 n_array_2_state_33++; 555 endfunction 556 557 int n_array_2_state_64 = 0; 558 function void e_array_2_state_64(input bit [63:0] i); 559 $display("e_array_2_state_64 %1d", n_array_2_state_64); 560 if (i !== ~64'd0 >> n_array_2_state_64) $stop; 561 n_array_2_state_64++; 562 endfunction 563 564 int n_array_2_state_65 = 0; 565 function void e_array_2_state_65(input bit [64:0] i); 566 $display("e_array_2_state_65 %1d", n_array_2_state_65); 567 if (i !== ~65'd0 >> n_array_2_state_65) $stop; 568 n_array_2_state_65++; 569 endfunction 570 571 int n_array_2_state_128 = 0; 572 function void e_array_2_state_128(input bit [127:0] i); 573 $display("e_array_2_state_128 %1d", n_array_2_state_128); 574 if (i !== ~128'd0 >> n_array_2_state_128) $stop; 575 n_array_2_state_128++; 576 endfunction 577 578 // 2-state packed structures 579 int n_struct_2_state_1 = 0; 580 function void e_struct_2_state_1(input struct_2_state_1 i); 581 $display("e_struct_2_state_1 %1d", n_struct_2_state_1); 582 if (i !== n_struct_2_state_1[0]) $stop; 583 n_struct_2_state_1++; 584 endfunction 585 586 int n_struct_2_state_32 = 0; 587 function void e_struct_2_state_32(input struct_2_state_32 i); 588 $display("e_struct_2_state_32 %1d", n_struct_2_state_32); 589 if (i !== ~32'd0 >> n_struct_2_state_32) $stop; 590 n_struct_2_state_32++; 591 endfunction 592 593 int n_struct_2_state_33 = 0; 594 function void e_struct_2_state_33(input struct_2_state_33 i); 595 $display("e_struct_2_state_33 %1d", n_struct_2_state_33); 596 if (i !== ~33'd0 >> n_struct_2_state_33) $stop; 597 n_struct_2_state_33++; 598 endfunction 599 600 int n_struct_2_state_64 = 0; 601 function void e_struct_2_state_64(input struct_2_state_64 i); 602 $display("e_struct_2_state_64 %1d", n_struct_2_state_64); 603 if (i !== ~64'd0 >> n_struct_2_state_64) $stop; 604 n_struct_2_state_64++; 605 endfunction 606 607 int n_struct_2_state_65 = 0; 608 function void e_struct_2_state_65(input struct_2_state_65 i); 609 $display("e_struct_2_state_65 %1d", n_struct_2_state_65); 610 if (i !== ~65'd0 >> n_struct_2_state_65) $stop; 611 n_struct_2_state_65++; 612 endfunction 613 614 int n_struct_2_state_128 = 0; 615 function void e_struct_2_state_128(input struct_2_state_128 i); 616 $display("e_struct_2_state_128 %1d", n_struct_2_state_128); 617 if (i !== ~128'd0 >> n_struct_2_state_128) $stop; 618 n_struct_2_state_128++; 619 endfunction 620 621 // 2-state packed unions 622 int n_union_2_state_1 = 0; 623 function void e_union_2_state_1(input union_2_state_1 i); 624 $display("e_union_2_state_1 %1d", n_union_2_state_1); 625 if (i !== n_union_2_state_1[0]) $stop; 626 n_union_2_state_1++; 627 endfunction 628 629 int n_union_2_state_32 = 0; 630 function void e_union_2_state_32(input union_2_state_32 i); 631 $display("e_union_2_state_32 %1d", n_union_2_state_32); 632 if (i !== ~32'd0 >> n_union_2_state_32) $stop; 633 n_union_2_state_32++; 634 endfunction 635 636 int n_union_2_state_33 = 0; 637 function void e_union_2_state_33(input union_2_state_33 i); 638 $display("e_union_2_state_33 %1d", n_union_2_state_33); 639 if (i !== ~33'd0 >> n_union_2_state_33) $stop; 640 n_union_2_state_33++; 641 endfunction 642 643 int n_union_2_state_64 = 0; 644 function void e_union_2_state_64(input union_2_state_64 i); 645 $display("e_union_2_state_64 %1d", n_union_2_state_64); 646 if (i !== ~64'd0 >> n_union_2_state_64) $stop; 647 n_union_2_state_64++; 648 endfunction 649 650 int n_union_2_state_65 = 0; 651 function void e_union_2_state_65(input union_2_state_65 i); 652 $display("e_union_2_state_65 %1d", n_union_2_state_65); 653 if (i !== ~65'd0 >> n_union_2_state_65) $stop; 654 n_union_2_state_65++; 655 endfunction 656 657 int n_union_2_state_128 = 0; 658 function void e_union_2_state_128(input union_2_state_128 i); 659 $display("e_union_2_state_128 %1d", n_union_2_state_128); 660 if (i !== ~128'd0 >> n_union_2_state_128) $stop; 661 n_union_2_state_128++; 662 endfunction 663 664 // 4-state packed arrays 665 int n_array_4_state_1 = 0; 666 function void e_array_4_state_1(input logic [ 0:0] i); 667 $display("e_array_4_state_1 %1d", n_array_4_state_1); 668 if (i !== n_array_4_state_1[0]) $stop; 669 n_array_4_state_1++; 670 endfunction 671 672 int n_array_4_state_32 = 0; 673 function void e_array_4_state_32(input logic [31:0] i); 674 $display("e_array_4_state_32 %1d", n_array_4_state_32); 675 if (i !== ~32'd0 >> n_array_4_state_32) $stop; 676 n_array_4_state_32++; 677 endfunction 678 679 int n_array_4_state_33 = 0; 680 function void e_array_4_state_33(input logic [32:0] i); 681 $display("e_array_4_state_33 %1d", n_array_4_state_33); 682 if (i !== ~33'd0 >> n_array_4_state_33) $stop; 683 n_array_4_state_33++; 684 endfunction 685 686 int n_array_4_state_64 = 0; 687 function void e_array_4_state_64(input logic [63:0] i); 688 $display("e_array_4_state_64 %1d", n_array_4_state_64); 689 if (i !== ~64'd0 >> n_array_4_state_64) $stop; 690 n_array_4_state_64++; 691 endfunction 692 693 int n_array_4_state_65 = 0; 694 function void e_array_4_state_65(input logic [64:0] i); 695 $display("e_array_4_state_65 %1d", n_array_4_state_65); 696 if (i !== ~65'd0 >> n_array_4_state_65) $stop; 697 n_array_4_state_65++; 698 endfunction 699 700 int n_array_4_state_128 = 0; 701 function void e_array_4_state_128(input logic [127:0] i); 702 $display("e_array_4_state_128 %1d", n_array_4_state_128); 703 if (i !== ~128'd0 >> n_array_4_state_128) $stop; 704 n_array_4_state_128++; 705 endfunction 706 707 // 4-state packed structures 708 int n_struct_4_state_1 = 0; 709 function void e_struct_4_state_1(input struct_4_state_1 i); 710 $display("e_struct_4_state_1 %1d", n_struct_4_state_1); 711 if (i !== n_struct_4_state_1[0]) $stop; 712 n_struct_4_state_1++; 713 endfunction 714 715 int n_struct_4_state_32 = 0; 716 function void e_struct_4_state_32(input struct_4_state_32 i); 717 $display("e_struct_4_state_32 %1d", n_struct_4_state_32); 718 if (i !== ~32'd0 >> n_struct_4_state_32) $stop; 719 n_struct_4_state_32++; 720 endfunction 721 722 int n_struct_4_state_33 = 0; 723 function void e_struct_4_state_33(input struct_4_state_33 i); 724 $display("e_struct_4_state_33 %1d", n_struct_4_state_33); 725 if (i !== ~33'd0 >> n_struct_4_state_33) $stop; 726 n_struct_4_state_33++; 727 endfunction 728 729 int n_struct_4_state_64 = 0; 730 function void e_struct_4_state_64(input struct_4_state_64 i); 731 $display("e_struct_4_state_64 %1d", n_struct_4_state_64); 732 if (i !== ~64'd0 >> n_struct_4_state_64) $stop; 733 n_struct_4_state_64++; 734 endfunction 735 736 int n_struct_4_state_65 = 0; 737 function void e_struct_4_state_65(input struct_4_state_65 i); 738 $display("e_struct_4_state_65 %1d", n_struct_4_state_65); 739 if (i !== ~65'd0 >> n_struct_4_state_65) $stop; 740 n_struct_4_state_65++; 741 endfunction 742 743 int n_struct_4_state_128 = 0; 744 function void e_struct_4_state_128(input struct_4_state_128 i); 745 $display("e_struct_4_state_128 %1d", n_struct_4_state_128); 746 if (i !== ~128'd0 >> n_struct_4_state_128) $stop; 747 n_struct_4_state_128++; 748 endfunction 749 750 // 4-state packed unions 751 int n_union_4_state_1 = 0; 752 function void e_union_4_state_1(input union_4_state_1 i); 753 $display("e_union_4_state_1 %1d", n_union_4_state_1); 754 if (i !== n_union_4_state_1[0]) $stop; 755 n_union_4_state_1++; 756 endfunction 757 758 int n_union_4_state_32 = 0; 759 function void e_union_4_state_32(input union_4_state_32 i); 760 $display("e_union_4_state_32 %1d", n_union_4_state_32); 761 if (i !== ~32'd0 >> n_union_4_state_32) $stop; 762 n_union_4_state_32++; 763 endfunction 764 765 int n_union_4_state_33 = 0; 766 function void e_union_4_state_33(input union_4_state_33 i); 767 $display("e_union_4_state_33 %1d", n_union_4_state_33); 768 if (i !== ~33'd0 >> n_union_4_state_33) $stop; 769 n_union_4_state_33++; 770 endfunction 771 772 int n_union_4_state_64 = 0; 773 function void e_union_4_state_64(input union_4_state_64 i); 774 $display("e_union_4_state_64 %1d", n_union_4_state_64); 775 if (i !== ~64'd0 >> n_union_4_state_64) $stop; 776 n_union_4_state_64++; 777 endfunction 778 779 int n_union_4_state_65 = 0; 780 function void e_union_4_state_65(input union_4_state_65 i); 781 $display("e_union_4_state_65 %1d", n_union_4_state_65); 782 if (i !== ~65'd0 >> n_union_4_state_65) $stop; 783 n_union_4_state_65++; 784 endfunction 785 786 int n_union_4_state_128 = 0; 787 function void e_union_4_state_128(input union_4_state_128 i); 788 $display("e_union_4_state_128 %1d", n_union_4_state_128); 789 if (i !== ~128'd0 >> n_union_4_state_128) $stop; 790 n_union_4_state_128++; 791 endfunction 792 793 //====================================================================== 794 // Invoke all functions 3 times (they have side effects) 795 //====================================================================== 796 797 import "DPI-C" context function void check_exports(); 798 799 initial begin 800 for (int i = 0 ; i < 3; i++) begin 801 // Check the imports 802 803 // Basic types as per IEEE 1800-2017 35.5.6 804 i_byte( 8'd10 - 8'(i)); 805 i_byte_unsigned( 8'd20 - 8'(i)); 806 i_shortint( 16'd30 - 16'(i)); 807 i_shortint_unsigned( 16'd40 - 16'(i)); 808 i_int( 32'd50 - 32'(i)); 809 i_int_unsigned( 32'd60 - 32'(i)); 810 i_longint( 64'd70 - 64'(i)); 811 i_longint_unsigned( 64'd80 - 64'(i)); 812`ifndef NO_TIME 813 i_time( 64'd90 - 64'(i)); 814`endif 815`ifndef NO_INTEGER 816 i_integer( 32'd100- 32'(i)); 817`endif 818 i_real( -1.0*i - 0.50); 819`ifndef NO_SHORTREAL 820 i_shortreal( -1.0*i - 0.25); 821`endif 822 if (~i[0]) begin 823 i_chandle(`NULL); 824 i_string("World"); 825 end else begin 826 i_chandle(`NULL); 827 i_string("Hello"); 828 end 829 i_bit(~i[0]); 830 i_logic(i[0]); 831 832 // Basic types via typedefs 833 i_byte_t( 8'd10 - 8'(2*i)); 834 i_byte_unsigned_t( 8'd20 - 8'(2*i)); 835 i_shortint_t( 16'd30 - 16'(2*i)); 836 i_shortint_unsigned_t( 16'd40 - 16'(2*i)); 837 i_int_t( 32'd50 - 32'(2*i)); 838 i_int_unsigned_t( 32'd60 - 32'(2*i)); 839 i_longint_t( 64'd70 - 64'(2*i)); 840 i_longint_unsigned_t( 64'd80 - 64'(2*i)); 841`ifndef NO_TIME 842 i_time_t( 64'd90 - 64'(2*i)); 843`endif 844`ifndef NO_INTEGER 845 i_integer_t( 32'd100- 32'(2*i)); 846`endif 847 i_real_t( -1.0*(2*i) - 0.50); 848`ifndef NO_SHORTREAL 849 i_shortreal_t( -1.0*(2*i) - 0.25); 850`endif 851 if (~i[0]) begin 852 i_chandle_t(`NULL); 853 i_string_t("World"); 854 end else begin 855 i_chandle_t(`NULL); 856 i_string_t("Hello"); 857 end 858 i_bit_t(~i[0]); 859 i_logic_t(i[0]); 860 861 // 2-state packed arrays 862 i_array_2_state_1(~i[0]); 863 i_array_2_state_32(~32'd0 << i); 864 i_array_2_state_33(~33'd0 << i); 865 i_array_2_state_64(~64'd0 << i); 866 i_array_2_state_65(~65'd0 << i); 867 i_array_2_state_128(~128'd0 << i); 868 869 // 2-state packed structures 870 i_struct_2_state_1(~i[0]); 871 i_struct_2_state_32(~32'd0 << i); 872 i_struct_2_state_33(~33'd0 << i); 873 i_struct_2_state_64(~64'd0 << i); 874 i_struct_2_state_65(~65'd0 << i); 875 i_struct_2_state_128(~128'd0 << i); 876 877 // 2-state packed unions 878 i_union_2_state_1(~i[0]); 879 i_union_2_state_32(~32'd0 << i); 880 i_union_2_state_33(~33'd0 << i); 881 i_union_2_state_64(~64'd0 << i); 882 i_union_2_state_65(~65'd0 << i); 883 i_union_2_state_128(~128'd0 << i); 884 885 // 4-state packed arrays 886 i_array_4_state_1(~i[0]); 887 i_array_4_state_32(~32'd0 << i); 888 i_array_4_state_33(~33'd0 << i); 889 i_array_4_state_64(~64'd0 << i); 890 i_array_4_state_65(~65'd0 << i); 891 i_array_4_state_128(~128'd0 << i); 892 893 // 4-state packed structures 894 i_struct_4_state_1(~i[0]); 895 i_struct_4_state_32(~32'd0 << i); 896 i_struct_4_state_33(~33'd0 << i); 897 i_struct_4_state_64(~64'd0 << i); 898 i_struct_4_state_65(~65'd0 << i); 899 i_struct_4_state_128(~128'd0 << i); 900 901 // 4-state packed unions 902 i_union_4_state_1(~i[0]); 903 i_union_4_state_32(~32'd0 << i); 904 i_union_4_state_33(~33'd0 << i); 905 i_union_4_state_64(~64'd0 << i); 906 i_union_4_state_65(~65'd0 << i); 907 i_union_4_state_128(~128'd0 << i); 908 909 // Check the exports 910 check_exports(); 911 end 912 913 $write("*-* All Finished *-*\n"); 914 $finish; 915 end 916 917endmodule 918