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