Skip to content

Commit 4618c68

Browse files
committed
Add regression test for real formatting of signed expressions
Check that real formatting preserves the sign of integral expressions, including one-bit values, minimum signed values and wide sign-extended negative values. Cover unsigned operands and explicit signedness casts. Use `$sformat()` to exercise `vpiRealVal` without a VPI module. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
1 parent 546d1f5 commit 4618c68

3 files changed

Lines changed: 83 additions & 0 deletions

File tree

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// Check that real formatting preserves the signedness of integral expressions.
2+
3+
module test;
4+
reg signed scalar;
5+
reg signed [7:0] byte_value;
6+
integer value;
7+
reg signed [32:0] value33;
8+
reg signed [63:0] word;
9+
reg signed [64:0] wide;
10+
reg signed [2047:0] extended;
11+
reg [7:0] unsigned_value;
12+
reg [8*32-1:0] text;
13+
reg failed;
14+
15+
`define check(val, exp) \
16+
$sformat(text, "%.0f", val); \
17+
if (text != exp) begin \
18+
$display("FAILED(%0d). '%s' expected %s, got %0s", `__LINE__, \
19+
`"val`", exp, text); \
20+
failed = 1'b1; \
21+
end
22+
23+
initial begin
24+
failed = 1'b0;
25+
scalar = 1'b1;
26+
byte_value = -3;
27+
value = -1;
28+
value33 = -1;
29+
word = -1;
30+
wide = -1;
31+
extended = -1;
32+
unsigned_value = 8'hfd;
33+
34+
`check(value + 0, "-1");
35+
`check(scalar ^ 1'sb0, "-1");
36+
`check(byte_value ^ 8'sb0, "-3");
37+
`check(value33 ^ 33'sb0, "-1");
38+
`check(word ^ 64'sb0, "-1");
39+
`check(wide ^ 65'sb0, "-1");
40+
`check(extended ^ 2048'sb0, "-1");
41+
`check(unsigned_value ^ 8'b0, "253");
42+
`check($signed(unsigned_value), "-3");
43+
`check($unsigned(byte_value), "253");
44+
`check(byte_value ^ 8'b0, "253");
45+
46+
scalar = 1'b0;
47+
byte_value = -128;
48+
value = 32'sh80000000;
49+
value33 = 33'sh100000000;
50+
word = 64'sh8000000000000000;
51+
wide = 65'sh10000000000000000;
52+
extended = -3;
53+
54+
`check(scalar ^ 1'sb0, "0");
55+
`check(byte_value ^ 8'sb0, "-128");
56+
`check(value + 0, "-2147483648");
57+
`check(value33 ^ 33'sb0, "-4294967296");
58+
`check(word ^ 64'sb0, "-9223372036854775808");
59+
`check(wide ^ 65'sb0, "-18446744073709551616");
60+
`check(extended ^ 2048'sb0, "-3");
61+
`check(word ^ 64'b0, "9223372036854775808");
62+
`check(wide ^ 65'b0, "18446744073709551616");
63+
64+
byte_value = 127;
65+
value = 0;
66+
wide = 1;
67+
`check(byte_value ^ 8'sb0, "127");
68+
`check(value + 0, "0");
69+
`check(wide ^ 65'sb0, "1");
70+
71+
if (!failed) begin
72+
$display("PASSED");
73+
end
74+
end
75+
endmodule

‎ivtest/regress-vvp.list‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,7 @@ vpi_array_word_select_signedness vvp_tests/vpi_array_word_select_signedness.json
859859
vpi_array_word_vector vvp_tests/vpi_array_word_vector.json
860860
vpi_enum_constant_signedness vvp_tests/vpi_enum_constant_signedness.json
861861
vpi_escaped_scope_names vvp_tests/vpi_escaped_scope_names.json
862+
vpi_expression_real_signedness vvp_tests/vpi_expression_real_signedness.json
862863
vpi_net_array_word_select_signedness vvp_tests/vpi_net_array_word_select_signedness.json
863864
vpi_part_select_range vvp_tests/vpi_part_select_range.json
864865
vpi_short_package_fullname vvp_tests/vpi_short_package_fullname.json
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type" : "normal",
3+
"source" : "vpi_expression_real_signedness.v",
4+
"vlog95" : {
5+
"iverilog-args" : [ "-pallowsigned=1" ]
6+
}
7+
}

0 commit comments

Comments
 (0)