iverilog/ivtest/ivltests/sv_queue_method_signed3.v

100 lines
2.2 KiB
Verilog

// Check that the signedness of the element type of a queue is correctly handled
// whenn calling one of the pop methods with parenthesis.
module test;
bit failed = 1'b0;
`define check(x) \
if (!(x)) begin \
$display("FAILED(%0d): ", `__LINE__, `"x`"); \
failed = 1'b1; \
end
int unsigned x = 10;
int y = 10;
int z;
longint w;
shortint qs[$];
bit [15:0] qu[$];
initial begin
for (int i = 0; i < 16; i++) begin
qu.push_back(-1);
qs.push_back(-1);
end
// These all evaluate as signed
`check($signed(qu.pop_back) < 0)
`check(qs.pop_back < 0)
`check($signed(qu.pop_front) < 0)
`check(qs.pop_front < 0)
// These all evaluate as unsigned
`check(qu.pop_back > 0)
`check({qs.pop_back} > 0)
`check($unsigned(qs.pop_back) > 0)
`check(qs.pop_back > 16'h0)
`check(qu.pop_front > 0)
`check({qs.pop_front} > 0)
`check($unsigned(qs.pop_front) > 0)
`check(qs.pop_front > 16'h0)
// In arithmetic expressions if one operand is unsigned all operands are
// considered unsigned
z = qu.pop_back + x;
`check(z === 65545)
z = qu.pop_back + y;
`check(z === 65545)
z = qu.pop_front + x;
`check(z === 65545)
z = qu.pop_front + y;
`check(z === 65545)
z = qs.pop_back + x;
`check(z === 65545)
z = qs.pop_back + y;
`check(z === 9)
z = qs.pop_front + x;
`check(z === 65545)
z = qs.pop_front + y;
`check(z === 9)
// For ternary operators if one operand is unsigned the result is unsigend
z = x ? qu.pop_back : x;
`check(z === 65535)
z = x ? qu.pop_back : y;
`check(z === 65535)
z = x ? qu.pop_front : x;
`check(z === 65535)
z = x ? qu.pop_front : y;
`check(z === 65535)
z = x ? qs.pop_back : x;
`check(z === 65535)
z = x ? qs.pop_back : y;
`check(z === -1)
z = x ? qs.pop_front : x;
`check(z === 65535)
z = x ? qs.pop_front : y;
`check(z === -1)
// Size return value is always positive, but check that it gets padded
// properly
w = x ? qu.size : 64'h123;
`check(w === 64'h4)
if (!failed) begin
$display("PASSED");
end
end
endmodule