157 lines
3.1 KiB
Verilog
157 lines
3.1 KiB
Verilog
// Check that the signedness of methods on the built-in enum type is handled
|
|
// correctly when calling the method 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;
|
|
|
|
enum shortint {
|
|
A = -1,
|
|
B = -2,
|
|
C = -3
|
|
} es;
|
|
|
|
enum bit [15:0] {
|
|
X = 65535,
|
|
Y = 65534,
|
|
Z = 65533
|
|
} eu;
|
|
|
|
initial begin
|
|
es = B;
|
|
eu = Y;
|
|
|
|
// These all evaluate as signed
|
|
`check($signed(eu.first()) < 0)
|
|
`check(es.first() < 0)
|
|
|
|
`check($signed(eu.last()) < 0)
|
|
`check(es.last() < 0)
|
|
|
|
`check($signed(eu.prev()) < 0)
|
|
`check(es.prev() < 0)
|
|
|
|
`check($signed(eu.next()) < 0)
|
|
`check(es.next() < 0)
|
|
|
|
// These all evaluate as unsigned
|
|
`check(eu.first() > 0)
|
|
`check({es.first()} > 0)
|
|
`check($unsigned(es.first()) > 0)
|
|
`check(es.first() > 16'h0)
|
|
|
|
`check(eu.last() > 0)
|
|
`check({es.last()} > 0)
|
|
`check($unsigned(es.last()) > 0)
|
|
`check(es.last() > 16'h0)
|
|
|
|
`check(eu.prev() > 0)
|
|
`check({es.prev()} > 0)
|
|
`check($unsigned(es.prev()) > 0)
|
|
`check(es.prev() > 16'h0)
|
|
|
|
`check(eu.next() > 0)
|
|
`check({es.next()} > 0)
|
|
`check($unsigned(es.next()) > 0)
|
|
`check(es.next() > 16'h0)
|
|
|
|
// In arithmetic expressions if one operand is unsigned all operands are
|
|
// considered unsigned
|
|
z = eu.first() + x;
|
|
`check(z === 65545)
|
|
z = eu.first() + y;
|
|
`check(z === 65545)
|
|
|
|
z = eu.last() + x;
|
|
`check(z === 65543)
|
|
z = eu.last() + y;
|
|
`check(z === 65543)
|
|
|
|
z = eu.prev() + x;
|
|
`check(z === 65545)
|
|
z = eu.prev() + y;
|
|
`check(z === 65545)
|
|
|
|
z = eu.next() + x;
|
|
`check(z === 65543)
|
|
z = eu.next() + y;
|
|
`check(z === 65543)
|
|
|
|
z = es.first() + x;
|
|
`check(z === 65545)
|
|
z = es.first() + y;
|
|
`check(z === 9)
|
|
|
|
z = es.last() + x;
|
|
`check(z === 65543)
|
|
z = es.last() + y;
|
|
`check(z === 7)
|
|
|
|
z = es.prev() + x;
|
|
`check(z === 65545)
|
|
z = es.prev() + y;
|
|
`check(z === 9)
|
|
|
|
z = es.next() + x;
|
|
`check(z === 65543)
|
|
z = es.next() + y;
|
|
`check(z === 7)
|
|
|
|
// For ternary operators if one operand is unsigned the result is unsigend
|
|
z = x ? eu.first() : x;
|
|
`check(z === 65535)
|
|
z = x ? eu.first() : y;
|
|
`check(z === 65535)
|
|
|
|
z = x ? eu.last() : x;
|
|
`check(z === 65533)
|
|
z = x ? eu.last() : y;
|
|
`check(z === 65533)
|
|
|
|
z = x ? eu.prev() : x;
|
|
`check(z === 65535)
|
|
z = x ? eu.prev() : y;
|
|
`check(z === 65535)
|
|
|
|
z = x ? eu.next() : x;
|
|
`check(z === 65533)
|
|
z = x ? eu.next() : y;
|
|
`check(z === 65533)
|
|
|
|
z = x ? es.first() : x;
|
|
`check(z === 65535)
|
|
z = x ? es.first() : y;
|
|
`check(z === -1)
|
|
|
|
z = x ? es.last() : x;
|
|
`check(z === 65533)
|
|
z = x ? es.last() : y;
|
|
`check(z === -3)
|
|
|
|
z = x ? es.prev() : x;
|
|
`check(z === 65535)
|
|
z = x ? es.prev() : y;
|
|
`check(z === -1)
|
|
|
|
z = x ? es.next() : x;
|
|
`check(z === 65533)
|
|
z = x ? es.next() : y;
|
|
`check(z === -3)
|
|
|
|
if (!failed) begin
|
|
$display("PASSED");
|
|
end
|
|
end
|
|
|
|
endmodule
|