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