1// DESCRIPTION: Verilator: Verilog Test module
2//
3// Copyright 2017 by Wilson Snyder. 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 VERILATOR
10 `define checkh(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d:  got='h%x exp='h%x\n", `__FILE__,`__LINE__, (gotv), (expv)); $stop; end while(0)
11//`else
12// `define checkh(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d:  got='h%x exp='h%x\n", `__FILE__,`__LINE__, (gotv), (expv)); end while(0)
13//`endif
14
15module t (/*AUTOARG*/);
16
17   // verilator lint_off UNUSED
18   reg        i_rl_p0_u1 [-2:2];
19   reg        o_rl_p0_u1 [-2:2];
20   reg [1:-1] i_rl_p1_u1 [-2:2];
21   reg [1:-1] o_rl_p1_u1 [-2:2];
22   reg [1:-1] i_rl_p1_u2 [-2:2] [-3:3];
23   reg [1:-1] o_rl_p1_u2 [-2:2] [-3:3];
24   reg [1:-1] i_rl_p1_u3 [-2:2] [-3:3] [-4:4];
25   reg [1:-1] o_rl_p1_u3 [-2:2] [-3:3] [-4:4];
26
27   reg        i_rb_p0_u1 [2:-2];
28   reg        o_rb_p0_u1 [2:-2];
29   reg [1:-1] i_rb_p1_u1 [2:-2];
30   reg [1:-1] o_rb_p1_u1 [2:-2];
31   reg [1:-1] i_rb_p1_u2 [2:-2] [3:-3];
32   reg [1:-1] o_rb_p1_u2 [2:-2] [3:-3];
33   reg [1:-1] i_rb_p1_u3 [2:-2] [3:-3] [4:-4];
34   reg [1:-1] o_rb_p1_u3 [2:-2] [3:-3] [4:-4];
35
36   reg        i_rw_p0_u1 [2:-2];
37   reg        o_rw_p0_u1 [2:-2];
38   reg [95:1] i_rw_p1_u1 [2:-2];
39   reg [95:1] o_rw_p1_u1 [2:-2];
40   reg [95:1] i_rw_p1_u2 [2:-2] [3:-3];
41   reg [95:1] o_rw_p1_u2 [2:-2] [3:-3];
42   reg [95:1] i_rw_p1_u3 [2:-2] [3:-3] [4:-4];
43   reg [95:1] o_rw_p1_u3 [2:-2] [3:-3] [4:-4];
44
45   bit        i_bit [1:0];
46   bit        o_bit [1:0];
47   logic      i_logic [1:0];
48   logic      o_logic [1:0];
49   byte       i_byte [1:0];
50   byte       o_byte [1:0];
51   integer    i_integer [1:0];
52   integer    o_integer [1:0];
53
54   import "DPI-C" function int dpii_failure();
55
56   import "DPI-C" function void dpii_unused(input reg u []);
57
58   // [] on packed arrays is unsupported in VCS & NC, so not supporting this
59
60   // p is number of packed dimensions, u is number of unpacked dimensions
61   import "DPI-C" function void dpii_open_p0_u1(input int c,p,u, input reg i [], output reg o []);
62   import "DPI-C" function void dpii_open_p1_u1(input int c,p,u, input reg [1:-1] i [], output reg [1:-1] o []);
63   import "DPI-C" function void dpii_open_p1_u2(input int c,p,u, input reg [1:-1] i [] [], output reg [1:-1] o [] []);
64   import "DPI-C" function void dpii_open_p1_u3(input int c,p,u, input reg [1:-1] i [] [] [], output reg [1:-1] o [] [] []);
65
66   import "DPI-C" function void dpii_open_pw_u1(input int c,p,u, input reg [95:1] i [], output reg [95:1] o []);
67   import "DPI-C" function void dpii_open_pw_u2(input int c,p,u, input reg [95:1] i [] [], output reg [95:1] o [] []);
68   import "DPI-C" function void dpii_open_pw_u3(input int c,p,u, input reg [95:1] i [] [] [], output reg [95:1] o [] [] []);
69
70   import "DPI-C" function void dpii_open_bit(input bit i [], output bit o []);
71   import "DPI-C" function void dpii_open_logic(input logic i [], output logic o []);
72   import "DPI-C" function void dpii_open_byte(input byte i [], output byte o []);
73   import "DPI-C" function void dpii_open_integer(input integer i [], output integer o []);
74
75   int        i_int_u1 [2:-2];
76   int        o_int_u1 [2:-2];
77   int        i_int_u2 [2:-2] [-3:3];
78   int        o_int_u2 [2:-2] [-3:3];
79   int        i_int_u3 [2:-2] [-3:3] [4:-4];
80   int        o_int_u3 [2:-2] [-3:3] [4:-4];
81   import "DPI-C" function void dpii_open_int_u1(int u, input int i [], output int o []);
82   import "DPI-C" function void dpii_open_int_u2(int u, input int i [] [], output int o [] []);
83   import "DPI-C" function void dpii_open_int_u3(int u, input int i [] [] [], output int o [] [] []);
84
85   // verilator lint_on UNUSED
86
87   reg [95:0] crc;
88
89   initial begin
90      crc = 96'h8a10a572_5aef0c8d_d70a4497;
91
92      for (int a=0; a<2; a=a+1) begin
93         i_bit[a] = crc[0];
94         i_logic[a] = crc[0];
95         i_byte[a] = crc[7:0];
96         i_integer[a] = crc[31:0];
97         crc = {crc[94:0], crc[95]^crc[2]^crc[0]};
98      end
99
100      dpii_open_bit(i_bit, o_bit);
101      dpii_open_logic(i_logic, o_logic);
102      dpii_open_byte(i_byte, o_byte);
103      dpii_open_integer(i_integer, o_integer);
104
105      for (int a=-2; a<=2; a=a+1) begin
106         i_rl_p0_u1[a] = crc[0];
107         i_rb_p0_u1[a] = crc[0];
108         i_rw_p0_u1[a] = crc[0];
109         i_rl_p1_u1[a] = crc[2:0];
110         i_rb_p1_u1[a] = crc[2:0];
111         i_rw_p1_u1[a] = crc[94:0];
112         i_int_u1[a] = crc[31:0];
113         for (int b=-3; b<=3; b=b+1) begin
114            i_rl_p1_u2[a][b] = crc[2:0];
115            i_rb_p1_u2[a][b] = crc[2:0];
116            i_rw_p1_u2[a][b] = crc[94:0];
117            i_int_u2[a][b] = crc[31:0];
118            for (int c=-4; c<=4; c=c+1) begin
119               i_rl_p1_u3[a][b][c] = crc[2:0];
120               i_rb_p1_u3[a][b][c] = crc[2:0];
121               i_rw_p1_u3[a][b][c] = crc[94:0];
122               i_int_u3[a][b][c] = crc[31:0];
123               crc = {crc[94:0], crc[95]^crc[2]^crc[0]};
124            end
125         end
126      end
127
128      dpii_open_p0_u1(0,0,1, i_rl_p0_u1, o_rl_p0_u1);
129      dpii_open_p0_u1(1,0,1, i_rb_p0_u1, o_rb_p0_u1);
130      dpii_open_p0_u1(2,0,1, i_rw_p0_u1, o_rw_p0_u1);
131      dpii_open_p1_u1(0,1,1, i_rl_p1_u1, o_rl_p1_u1);
132      dpii_open_p1_u2(0,1,2, i_rl_p1_u2, o_rl_p1_u2);
133      dpii_open_p1_u3(0,1,3, i_rl_p1_u3, o_rl_p1_u3);
134      dpii_open_p1_u1(1,1,1, i_rb_p1_u1, o_rb_p1_u1);
135      dpii_open_p1_u2(1,1,2, i_rb_p1_u2, o_rb_p1_u2);
136      dpii_open_p1_u3(1,1,3, i_rb_p1_u3, o_rb_p1_u3);
137      dpii_open_pw_u1(2,1,1, i_rw_p1_u1, o_rw_p1_u1);
138      dpii_open_pw_u2(2,1,2, i_rw_p1_u2, o_rw_p1_u2);
139      dpii_open_pw_u3(2,1,3, i_rw_p1_u3, o_rw_p1_u3);
140
141      for (int a=-2; a<=2; a=a+1) begin
142         for (int b=-3; b<=3; b=b+1) begin
143            for (int c=-4; c<=4; c=c+1) begin
144               `checkh(o_rw_p1_u3[a][b][c], ~i_rw_p1_u3[a][b][c]);
145            end
146         end
147      end
148
149      dpii_open_int_u1(1, i_int_u1, o_int_u1);
150      dpii_open_int_u2(2, i_int_u2, o_int_u2);
151      dpii_open_int_u3(3, i_int_u3, o_int_u3);
152      for (int a=-2; a<=2; a=a+1) begin
153         `checkh(o_int_u1[a], ~i_int_u1[a]);
154         for (int b=-3; b<=3; b=b+1) begin
155            `checkh(o_int_u2[a][b], ~i_int_u2[a][b]);
156            for (int c=-4; c<=4; c=c+1) begin
157               `checkh(o_int_u3[a][b][c], ~i_int_u3[a][b][c]);
158            end
159         end
160      end
161
162      if (dpii_failure()!=0) begin
163         $write("%%Error: Failure in DPI tests\n");
164         $stop;
165      end
166      else begin
167         $write("*-* All Finished *-*\n");
168         $finish;
169      end
170   end
171
172endmodule
173