64 lines
1.2 KiB
Coq
64 lines
1.2 KiB
Coq
|
|
// Check that element and bit select on multi-dimensional signed packed arrays
|
||
|
|
// are unsigned.
|
||
|
|
|
||
|
|
module test;
|
||
|
|
|
||
|
|
bit failed = 1'b0;
|
||
|
|
|
||
|
|
`define check(val, exp) do begin \
|
||
|
|
if (val !== exp) begin \
|
||
|
|
$display("FAILED(%0d): Expected `%b`, got `%b`.", `__LINE__, exp, val); \
|
||
|
|
failed = 1'b1; \
|
||
|
|
end \
|
||
|
|
end while (0)
|
||
|
|
|
||
|
|
reg signed [3:0][3:0] arr;
|
||
|
|
integer idx;
|
||
|
|
reg [7:0] x;
|
||
|
|
reg [3:0] y;
|
||
|
|
reg [31:0] z;
|
||
|
|
|
||
|
|
initial begin
|
||
|
|
// Set lowest element to all 1
|
||
|
|
arr = 16'hffff;
|
||
|
|
|
||
|
|
// Elements of a signed packed array are unsigned, no sign extensions
|
||
|
|
idx = 0;
|
||
|
|
x = arr[idx];
|
||
|
|
`check(x, 8'h0f);
|
||
|
|
|
||
|
|
// Out-of-bounds
|
||
|
|
idx = -1;
|
||
|
|
x = arr[idx];
|
||
|
|
`check(x, 8'h0x);
|
||
|
|
|
||
|
|
// Undefined
|
||
|
|
idx = 'bx;
|
||
|
|
x = arr[idx];
|
||
|
|
`check(x, 8'h0x);
|
||
|
|
|
||
|
|
// Bit selects on a signed packed array are unsigned, no sign extensions
|
||
|
|
idx = 0;
|
||
|
|
y = arr[0][idx];
|
||
|
|
`check(y, 4'b0001);
|
||
|
|
|
||
|
|
// Out-of-bounds
|
||
|
|
idx = -1;
|
||
|
|
y = arr[0][idx];
|
||
|
|
`check(y, 4'b000x);
|
||
|
|
|
||
|
|
// Undefined
|
||
|
|
idx = 'bx;
|
||
|
|
y = arr[0][idx];
|
||
|
|
`check(y, 4'b000x);
|
||
|
|
|
||
|
|
// The array as a primary is signed, sign extension
|
||
|
|
z = arr;
|
||
|
|
`check(z, 32'hffffffff);
|
||
|
|
|
||
|
|
if (!failed) begin
|
||
|
|
$display("PASSED");
|
||
|
|
end
|
||
|
|
end
|
||
|
|
endmodule
|