Tests: Make struct test pass.
This commit is contained in:
parent
f29f30dce0
commit
91e2d1d2a0
|
|
@ -10,22 +10,40 @@ module t (/*AUTOARG*/
|
||||||
|
|
||||||
input clk;
|
input clk;
|
||||||
|
|
||||||
|
`define check(gotv,expv) do if ((gotv) != (expv)) begin $write("%%Error: Line%0d: cnt=0x%0x got=0x%0x exp=0x%0x\n", `__LINE__, cnt, (gotv), (expv)); $stop; end while(0);
|
||||||
|
|
||||||
// parameters for array sizes
|
// parameters for array sizes
|
||||||
localparam WA = 4;
|
localparam WA = 4;
|
||||||
localparam WB = 6;
|
localparam WB = 6;
|
||||||
localparam WC = 8;
|
localparam WC = 8;
|
||||||
|
|
||||||
// 2D packed arrays
|
// 2D packed arrays
|
||||||
logic [WA-1:0] [WB-1:0] [WC-1:0] array_bg; // big endian array
|
logic [WA+1:2] [WB+1:2] [WC+1:2] array_bg; // big endian array
|
||||||
/* verilator lint_off LITENDIAN */
|
/* verilator lint_off LITENDIAN */
|
||||||
logic [0:WA-1] [0:WB-1] [0:WC-1] array_lt; // little endian array
|
logic [2:WA+1] [2:WB+1] [2:WC+1] array_lt; // little endian array
|
||||||
/* verilator lint_on LITENDIAN */
|
/* verilator lint_on LITENDIAN */
|
||||||
|
|
||||||
|
logic [1:0] array_unpk [3:2][1:0];
|
||||||
|
|
||||||
integer cnt = 0;
|
integer cnt = 0;
|
||||||
integer slc = 0; // slice type
|
integer slc = 0; // slice type
|
||||||
integer dim = 0; // dimension
|
integer dim = 0; // dimension
|
||||||
integer wdt = 0; // width
|
integer wdt = 0; // width
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
`check($dimensions (array_unpk), 3);
|
||||||
|
`ifndef VCS
|
||||||
|
`check($unpacked_dimensions (array_unpk), 2); // IEEE 2009
|
||||||
|
`endif
|
||||||
|
`check($bits (array_unpk), 2*2*2);
|
||||||
|
`check($low (array_unpk), 2);
|
||||||
|
`check($high (array_unpk), 3);
|
||||||
|
`check($left (array_unpk), 3);
|
||||||
|
`check($right(array_unpk), 2);
|
||||||
|
`check($increment(array_unpk), 1);
|
||||||
|
`check($size (array_unpk), 2);
|
||||||
|
end
|
||||||
|
|
||||||
// event counter
|
// event counter
|
||||||
always @ (posedge clk) begin
|
always @ (posedge clk) begin
|
||||||
cnt <= cnt + 1;
|
cnt <= cnt + 1;
|
||||||
|
|
@ -38,104 +56,110 @@ module t (/*AUTOARG*/
|
||||||
$finish;
|
$finish;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
integer slc_next;
|
||||||
|
|
||||||
// calculation of dimention sizes
|
// calculation of dimention sizes
|
||||||
always @ (posedge clk)
|
always @ (posedge clk) begin
|
||||||
begin
|
// slicing type counter
|
||||||
// slicing tipe counter
|
|
||||||
case (cnt[3:2])
|
case (cnt[3:2])
|
||||||
2'd0 : begin slc <= 0; end // full array
|
2'd0 : begin slc_next = 0; end // full array
|
||||||
2'd1 : begin slc <= 1; end // half array
|
2'd1 : begin slc_next = 1; end // single array element
|
||||||
2'd2 : begin slc <= 2; end // single array element
|
2'd2 : begin slc_next = 2; end // half array
|
||||||
default: begin slc <= 0; end
|
default: begin slc_next = 0; end
|
||||||
endcase
|
endcase
|
||||||
// dimmension counter
|
slc <= slc_next;
|
||||||
|
// dimension counter
|
||||||
case (cnt[1:0])
|
case (cnt[1:0])
|
||||||
2'd0 : begin dim <= 1; wdt = (slc==1) ? WA/2 : (slc==2) ? 1 : WA; end
|
2'd0 : begin dim <= 1; wdt <= (slc_next==1) ? WA/2 : (slc_next==2) ? WA/2 : WA; end
|
||||||
2'd1 : begin dim <= 2; wdt = WB; end
|
2'd1 : begin dim <= 2; wdt <= WB; end
|
||||||
2'd2 : begin dim <= 3; wdt = WC; end
|
2'd2 : begin dim <= 3; wdt <= WC; end
|
||||||
default: begin dim <= 0; wdt = 0; end
|
default: begin dim <= 0; wdt <= 0; end
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
|
|
||||||
always @ (posedge clk)
|
always @ (posedge clk) begin
|
||||||
if (cnt[30:4]==1) begin
|
`ifdef TEST_VERBOSE
|
||||||
// big endian
|
$write("cnt[30:4]=%0d slc=%0d dim=%0d wdt=%0d\n", cnt[30:4], slc, dim, wdt);
|
||||||
if (cnt[3:2]==0) begin
|
`endif
|
||||||
// full array
|
if (cnt[30:4]==1) begin
|
||||||
if ($dimensions (array_bg) != 3) $stop;
|
// big endian
|
||||||
if ($bits (array_bg) != WA*WB*WC) $stop;
|
if (slc==0) begin
|
||||||
if ((dim>=1)&&(dim<=3)) begin
|
// full array
|
||||||
if ($left (array_bg, dim) != wdt-1) $stop;
|
`check($dimensions (array_bg), 3);
|
||||||
if ($right (array_bg, dim) != 0 ) $stop;
|
`check($bits (array_bg), WA*WB*WC);
|
||||||
if ($low (array_bg, dim) != 0 ) $stop;
|
if ((dim>=1)&&(dim<=3)) begin
|
||||||
if ($high (array_bg, dim) != wdt-1) $stop;
|
`check($left (array_bg, dim), wdt+1);
|
||||||
if ($increment (array_bg, dim) != 1 ) $stop;
|
`check($right (array_bg, dim), 2 );
|
||||||
if ($size (array_bg, dim) != wdt ) $stop;
|
`check($low (array_bg, dim), 2 );
|
||||||
end
|
`check($high (array_bg, dim), wdt+1);
|
||||||
end else if (cnt[3:2]==1) begin
|
`check($increment (array_bg, dim), 1 );
|
||||||
// half array
|
`check($size (array_bg, dim), wdt );
|
||||||
if ($dimensions (array_bg[WA/2-1:0]) != 3) $stop;
|
end
|
||||||
if ($bits (array_bg[WA/2-1:0]) != WA/2*WB*WC) $stop;
|
end else if (slc==1) begin
|
||||||
if ((dim>=1)&&(dim<=3)) begin
|
// single array element
|
||||||
if ($left (array_bg[WA/2-1:0], dim) != wdt-1) $stop;
|
`check($dimensions (array_bg[2]), 2);
|
||||||
if ($right (array_bg[WA/2-1:0], dim) != 0 ) $stop;
|
`check($bits (array_bg[2]), WB*WC);
|
||||||
if ($low (array_bg[WA/2-1:0], dim) != 0 ) $stop;
|
if ((dim>=2)&&(dim<=3)) begin
|
||||||
if ($high (array_bg[WA/2-1:0], dim) != wdt-1) $stop;
|
`check($left (array_bg[2], dim-1), wdt+1);
|
||||||
if ($increment (array_bg[WA/2-1:0], dim) != 1 ) $stop;
|
`check($right (array_bg[2], dim-1), 2 );
|
||||||
if ($size (array_bg[WA/2-1:0], dim) != wdt ) $stop;
|
`check($low (array_bg[2], dim-1), 2 );
|
||||||
end
|
`check($high (array_bg[2], dim-1), wdt+1);
|
||||||
end else if (cnt[3:2]==2) begin
|
`check($increment (array_bg[2], dim-1), 1 );
|
||||||
// single array element
|
`check($size (array_bg[2], dim-1), wdt );
|
||||||
if ($dimensions (array_bg[0]) != 2) $stop;
|
end
|
||||||
if ($bits (array_bg[0]) != WB*WC) $stop;
|
end else if (slc==2) begin
|
||||||
if ((dim>=2)&&(dim<=3)) begin
|
// half array
|
||||||
if ($left (array_bg[0], dim-1) != wdt-1) $stop;
|
`check($dimensions (array_bg[WA/2+1:2]), 3);
|
||||||
if ($right (array_bg[0], dim-1) != 0 ) $stop;
|
`check($bits (array_bg[WA/2+1:2]), WA/2*WB*WC);
|
||||||
if ($low (array_bg[0], dim-1) != 0 ) $stop;
|
if ((dim>=1)&&(dim<=3)) begin
|
||||||
if ($high (array_bg[0], dim-1) != wdt-1) $stop;
|
`check($left (array_bg[WA/2+1:2], dim), wdt+1);
|
||||||
if ($increment (array_bg[0], dim-1) != 1 ) $stop;
|
`check($right (array_bg[WA/2+1:2], dim), 2 );
|
||||||
if ($size (array_bg[0], dim-1) != wdt ) $stop;
|
`check($low (array_bg[WA/2+1:2], dim), 2 );
|
||||||
end
|
`check($high (array_bg[WA/2+1:2], dim), wdt+1);
|
||||||
end
|
`check($increment (array_bg[WA/2+1:2], dim), 1 );
|
||||||
end else if (cnt[30:4]==2) begin
|
`check($size (array_bg[WA/2+1:2], dim), wdt);
|
||||||
// little endian
|
end
|
||||||
if (cnt[3:2]==0) begin
|
end
|
||||||
// full array
|
end else if (cnt[30:4]==2) begin
|
||||||
if ($dimensions (array_lt) != 3) $stop;
|
// little endian
|
||||||
if ($bits (array_lt) != WA*WB*WC) $stop;
|
if (slc==0) begin
|
||||||
if ((dim>=1)&&(dim<=3)) begin
|
// full array
|
||||||
if ($left (array_lt, dim) != 0 ) $stop;
|
`check($dimensions (array_lt), 3);
|
||||||
if ($right (array_lt, dim) != wdt-1) $stop;
|
`check($bits (array_lt), WA*WB*WC);
|
||||||
if ($low (array_lt, dim) != 0 ) $stop;
|
if ((dim>=1)&&(dim<=3)) begin
|
||||||
if ($high (array_lt, dim) != wdt-1) $stop;
|
`check($left (array_lt, dim), 2 );
|
||||||
if ($increment (array_lt, dim) != -1 ) $stop;
|
`check($right (array_lt, dim), wdt+1);
|
||||||
if ($size (array_lt, dim) != wdt ) $stop;
|
`check($low (array_lt, dim), 2 );
|
||||||
end
|
`check($high (array_lt, dim), wdt+1);
|
||||||
end else if (cnt[3:2]==1) begin
|
`check($increment (array_lt, dim), -1 );
|
||||||
// half array
|
`check($size (array_lt, dim), wdt );
|
||||||
if ($dimensions (array_lt[0:WA/2-1]) != 3) $stop;
|
end
|
||||||
if ($bits (array_lt[0:WA/2-1]) != WA/2*WB*WC) $stop;
|
end else if (slc==1) begin
|
||||||
if ((dim>=1)&&(dim<=3)) begin
|
// single array element
|
||||||
if ($left (array_lt[0:WA/2-1], dim) != 0 ) $stop;
|
`check($dimensions (array_lt[2]), 2);
|
||||||
if ($right (array_lt[0:WA/2-1], dim) != wdt-1) $stop;
|
`check($bits (array_lt[2]), WB*WC);
|
||||||
if ($low (array_lt[0:WA/2-1], dim) != 0 ) $stop;
|
if ((dim>=2)&&(dim<=3)) begin
|
||||||
if ($high (array_lt[0:WA/2-1], dim) != wdt-1) $stop;
|
`check($left (array_lt[2], dim-1), 2 );
|
||||||
if ($increment (array_lt[0:WA/2-1], dim) != -1 ) $stop;
|
`check($right (array_lt[2], dim-1), wdt+1);
|
||||||
if ($size (array_lt[0:WA/2-1], dim) != wdt ) $stop;
|
`check($low (array_lt[2], dim-1), 2 );
|
||||||
end
|
`check($high (array_lt[2], dim-1), wdt+1);
|
||||||
end else if (cnt[3:2]==2) begin
|
`check($increment (array_lt[2], dim-1), -1 );
|
||||||
// single array element
|
`check($size (array_lt[2], dim-1), wdt );
|
||||||
if ($dimensions (array_lt[0]) != 2) $stop;
|
end
|
||||||
if ($bits (array_lt[0]) != WB*WC) $stop;
|
end else if (slc==2) begin
|
||||||
if ((dim>=2)&&(dim<=3)) begin
|
// half array
|
||||||
if ($left (array_lt[0], dim-1) != 0 ) $stop;
|
`check($dimensions (array_lt[2:WA/2+1]), 3);
|
||||||
if ($right (array_lt[0], dim-1) != wdt-1) $stop;
|
`check($bits (array_lt[2:WA/2+1]), WA/2*WB*WC);
|
||||||
if ($low (array_lt[0], dim-1) != 0 ) $stop;
|
if ((dim>=1)&&(dim<=3)) begin
|
||||||
if ($high (array_lt[0], dim-1) != wdt-1) $stop;
|
`check($left (array_lt[2:WA/2+1], dim), 2 );
|
||||||
if ($increment (array_lt[0], dim-1) != -1 ) $stop;
|
`check($right (array_lt[2:WA/2+1], dim), wdt+1);
|
||||||
if ($size (array_lt[0], dim-1) != wdt ) $stop;
|
`check($low (array_lt[2:WA/2+1], dim), 2 );
|
||||||
end
|
`check($high (array_lt[2:WA/2+1], dim), wdt+1);
|
||||||
|
`check($increment (array_lt[2:WA/2+1], dim), -1 );
|
||||||
|
`check($size (array_lt[2:WA/2+1], dim), wdt );
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,9 @@ module array_test
|
||||||
|
|
||||||
input clk;
|
input clk;
|
||||||
|
|
||||||
|
// verilator lint_off LITENDIAN
|
||||||
reg [7:0] a [LEFT:RIGHT];
|
reg [7:0] a [LEFT:RIGHT];
|
||||||
|
// verilator lint_on LITENDIAN
|
||||||
|
|
||||||
integer l;
|
integer l;
|
||||||
integer r;
|
integer r;
|
||||||
|
|
@ -54,10 +56,8 @@ module array_test
|
||||||
$write ("$left (a) = %d, $right (a) = %d, $size (a) = %d\n", l, r, s);
|
$write ("$left (a) = %d, $right (a) = %d, $size (a) = %d\n", l, r, s);
|
||||||
`endif
|
`endif
|
||||||
|
|
||||||
if ((l == LEFT) && (r == RIGHT) && (s == (RIGHT - LEFT + 1))) begin
|
if ((l != LEFT) || (r != RIGHT) || (s != (RIGHT - LEFT + 1))) $stop;
|
||||||
$write("*-* All Finished *-*\n");
|
$write("*-* All Finished *-*\n");
|
||||||
end
|
|
||||||
|
|
||||||
$finish;
|
$finish;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
// verilator lint_off WIDTH
|
// verilator lint_off WIDTH
|
||||||
|
|
||||||
`define check(got,expec) do if ((got) != (expec)) begin $display("Line%0d: Got 0x%0x Exp 0x%0x\n", `__LINE__, (got), (expec)); $stop; end while(0);
|
`define check(gotv,expv) do if ((gotv) != (expv)) begin $write("%%Error: Line%0d: got=0x%0x exp=0x%0x\n", `__LINE__, (gotv), (expv)); $stop; end while(0);
|
||||||
|
|
||||||
module t (/*AUTOARG*/
|
module t (/*AUTOARG*/
|
||||||
// Inputs
|
// Inputs
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ module t (/*AUTOARG*/);
|
||||||
c_t [17:16] d;
|
c_t [17:16] d;
|
||||||
} e_t;
|
} e_t;
|
||||||
|
|
||||||
`define check(got,expec) do if ((got) != (expec)) begin $display("Line%0d: Got %b Exp %b\n", `__LINE__, (got), (expec)); $stop; end while(0);
|
`define check(gotv,expv) do if ((gotv) != (expv)) begin $write("%%Error: Line%0d: got=0b%b exp=0b%b\n", `__LINE__, (gotv), (expv)); $stop; end while(0);
|
||||||
|
|
||||||
initial begin
|
initial begin
|
||||||
e_t e;
|
e_t e;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue