mirror of
https://github.com/verilator/verilator.git
synced 2025-01-24 23:34:45 +00:00
213 lines
5.6 KiB
Systemverilog
213 lines
5.6 KiB
Systemverilog
// DESCRIPTION: Verilator: Verilog Test module
|
|
//
|
|
// This file ONLY is placed under the Creative Commons Public Domain, for
|
|
// any use, without warranty, 2024 by Antmicro Ltd.
|
|
// SPDX-License-Identifier: CC0-1.0
|
|
|
|
`define stop $stop
|
|
`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);
|
|
|
|
module t (/*AUTOARG*/);
|
|
|
|
// verilator lint_off ASCRANGE
|
|
// verilator lint_off WIDTH
|
|
|
|
reg [63:0] sum; // Checked not in objects
|
|
reg [63:0] add;
|
|
reg [2:1] [4:3] array [5:6] [7:8];
|
|
reg [1:2] [3:4] larray [6:5] [8:7];
|
|
bit [31:0] depth1_array [0:0];
|
|
int oned [3:1];
|
|
int twod [3:1][9:8];
|
|
|
|
typedef struct packed {
|
|
reg [1:0] [63:0] subarray;
|
|
} str_t;
|
|
typedef struct packed {
|
|
str_t mid;
|
|
} mid_t;
|
|
|
|
function [63:0] crc (input [63:0] sum, input [31:0] a, input [31:0] b, input [31:0] c, input [31:0] d);
|
|
crc = {sum[62:0],sum[63]} ^ {4'b0,a[7:0], 4'h0,b[7:0], 4'h0,c[7:0], 4'h0,d[7:0]};
|
|
endfunction
|
|
|
|
function [63:0] test1;
|
|
test1 = 0;
|
|
// We use 'index_' as the prefix for all loop vars,
|
|
// this allows t_foreach.pl to confirm that all loops
|
|
// have been unrolled and flattened away and no loop vars
|
|
// remain in the generated .cpp
|
|
foreach (depth1_array[index_a]) begin
|
|
test1 = crc(test1, index_a, 0, 0, 0);
|
|
|
|
// Ensure the index never goes out of bounds.
|
|
// We used to get this wrong for an array of depth 1.
|
|
if (index_a == -1) return 7;
|
|
if (index_a == 1) return 7;
|
|
end
|
|
endfunction
|
|
localparam par1 = test1();
|
|
|
|
function [63:0] test2;
|
|
test2 = 0;
|
|
foreach (array[index_a]) begin
|
|
test2 = crc(test2, index_a, 0, 0, 0);
|
|
end
|
|
endfunction
|
|
localparam par2 = test2();
|
|
|
|
function [63:0] test3;
|
|
test3 = 0;
|
|
foreach (array[index_a,index_b]) begin
|
|
test3 = crc(test3, index_a, index_b, 0, 0);
|
|
end
|
|
endfunction
|
|
localparam par3 = test3();
|
|
|
|
function [63:0] test4;
|
|
test4 = 0;
|
|
foreach (array[index_a,index_b,index_c]) begin
|
|
test4 = crc(test4, index_a, index_b, index_c, 0);
|
|
end
|
|
endfunction
|
|
localparam par4 = test4();
|
|
|
|
function [63:0] test5;
|
|
test5 = 0;
|
|
foreach (array[index_a,index_b,index_c,index_d]) begin
|
|
test5 = crc(test5, index_a, index_b, index_c, index_d);
|
|
end
|
|
endfunction
|
|
localparam par5 = test5();
|
|
|
|
function [63:0] test6;
|
|
// comma syntax
|
|
test6 = 0;
|
|
foreach (array[,index_b]) begin
|
|
$display(index_b);
|
|
test6 = crc(test6, 0, index_b, 0, 0);
|
|
end
|
|
endfunction
|
|
localparam par6 = test6();
|
|
|
|
function [63:0] test7;
|
|
test7 = 0;
|
|
foreach (larray[index_a]) begin
|
|
test7 = crc(test7, index_a, 0, 0, 0);
|
|
end
|
|
endfunction
|
|
localparam par7 = test7();
|
|
|
|
function [63:0] test8;
|
|
test8 = 0;
|
|
foreach (larray[index_a,index_b]) begin
|
|
test8 = crc(test8, index_a, index_b, 0, 0);
|
|
test8 = test8 + {4'b0,index_a[7:0], 4'h0,index_b[7:0]};
|
|
end
|
|
endfunction
|
|
localparam par8 = test8();
|
|
|
|
function [63:0] test9;
|
|
test9 = 0;
|
|
foreach (larray[index_a,index_b,index_c]) begin
|
|
test9 = crc(test9, index_a, index_b, index_c, 0);
|
|
end
|
|
endfunction
|
|
localparam par9 = test9();
|
|
|
|
function [63:0] test10;
|
|
test10 = 0;
|
|
foreach (larray[index_a,index_b,index_c,index_d]) begin
|
|
test10 = crc(test10, index_a, index_b, index_c, index_d);
|
|
end
|
|
endfunction
|
|
localparam par10 = test10();
|
|
|
|
function [63:0] test11;
|
|
automatic mid_t strarray[3];
|
|
strarray = '{
|
|
'{ '{ '{2, 1} } },
|
|
'{ '{ '{5, 4} } },
|
|
'{ '{ '{7, 6} } }
|
|
};
|
|
test11 = 0;
|
|
foreach (strarray[s])
|
|
foreach (strarray[s].mid.subarray[ss])
|
|
test11 += strarray[s].mid.subarray[ss];
|
|
endfunction
|
|
localparam par11 = test11();
|
|
|
|
function [63:0] test12;
|
|
test12 = 0;
|
|
foreach (oned[i]) begin
|
|
++test12;
|
|
break;
|
|
end
|
|
endfunction
|
|
localparam par12 = test12();
|
|
|
|
function [63:0] test13;
|
|
test13 = 0;
|
|
foreach (oned[i]) begin
|
|
++test13;
|
|
continue;
|
|
test13 += 100;
|
|
end
|
|
endfunction
|
|
localparam par13 = test13();
|
|
|
|
function [63:0] test14;
|
|
test14 = 0;
|
|
foreach (twod[i, j]) begin
|
|
++test14;
|
|
break;
|
|
end
|
|
endfunction
|
|
localparam par14 = test14();
|
|
|
|
function [63:0] test15;
|
|
test15 = 0;
|
|
foreach (twod[i, j]) begin
|
|
++test15;
|
|
continue;
|
|
test15 += 100;
|
|
end
|
|
|
|
foreach (twod[i, j]); // Null body check
|
|
endfunction
|
|
localparam par15 = test15();
|
|
|
|
function automatic [63:0] test16;
|
|
string str1 = "";
|
|
test16 = 0;
|
|
foreach(str1[i]) begin
|
|
test16++;
|
|
end
|
|
endfunction
|
|
localparam par16 = test16();
|
|
|
|
initial begin
|
|
`checkh(par1, 64'h0);
|
|
`checkh(par2, 64'h000000c000000000);
|
|
`checkh(par3, 64'h000003601e000000);
|
|
`checkh(par4, 64'h00003123fc101000);
|
|
`checkh(par5, 64'h0030128ab2a8e557);
|
|
`checkh(par6, 64'h0000000006000000);
|
|
`checkh(par7, 64'h0000009000000000);
|
|
`checkh(par8, 64'h000002704b057073);
|
|
`checkh(par9, 64'h00002136f9000000);
|
|
`checkh(par10, 64'h0020179aa7aa0aaa);
|
|
`checkh(par11, 'h19);
|
|
|
|
`checkh(par12, 1); // 9
|
|
`checkh(par13, 3); // 9, 8, 7
|
|
// See https://www.accellera.org/images/eda/sv-bc/10303.html
|
|
`checkh(par14, 1); // 3,9
|
|
`checkh(par15, 6);
|
|
`checkh(par16, 0);
|
|
|
|
$write("*-* All Finished *-*\n");
|
|
$finish;
|
|
end
|
|
endmodule
|