Skip to content

Commit

Permalink
Merge pull request #1166 from larsclausen/fix-ix-load-sign
Browse files Browse the repository at this point in the history
tgt-vvp: Use signedness of expression instead of signal for index load
  • Loading branch information
martinwhitaker authored Sep 7, 2024
2 parents 07d5c6f + 841e5a9 commit 74ba42e
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 2 deletions.
51 changes: 51 additions & 0 deletions ivtest/ivltests/shift6.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
module test;

// Check that the right hand side for a shift instruction is always treated as
// unsigned. Even if its a signed register, or a transformation thereof.

reg failed = 1'b0;

`define check(val, exp) \
if ((val) !== (exp)) begin \
$display("FAILED(%0d): `%s`, expected `%0d`, got `%0d`.", `__LINE__, \
`"val`", (exp), (val), 4); \
failed = 1'b1; \
end

reg signed [1:0] shift = 2'b10;

initial begin
`check(1 << shift, 4)
`check(1 << shift[1:0], 4)
`check(2 << shift[1], 4)
`check(1 << $unsigned(shift), 4)
`check(1 << $signed(shift), 4)
`check(1 << {shift}, 4)

`check(1 <<< shift, 4)
`check(1 <<< shift[1:0], 4)
`check(2 <<< shift[1], 4)
`check(1 <<< $unsigned(shift), 4)
`check(1 <<< $signed(shift), 4)
`check(1 <<< {shift}, 4)

`check(16 >> shift, 4)
`check(16 >> shift[1:0], 4)
`check(8 >> shift[1], 4)
`check(16 >> $unsigned(shift), 4)
`check(16 >> $signed(shift), 4)
`check(16 >> {shift}, 4)

`check(16 >>> shift, 4)
`check(16 >>> shift[1:0], 4)
`check(8 >>> shift[1], 4)
`check(16 >>> $unsigned(shift), 4)
`check(16 >>> $signed(shift), 4)
`check(16 >>> {shift}, 4)

if (!failed) begin
$display("PASSED");
end
end

endmodule
1 change: 1 addition & 0 deletions ivtest/regress-vvp.list
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ sf_countones_fail vvp_tests/sf_countones_fail.json
sf_isunknown_fail vvp_tests/sf_isunknown_fail.json
sf_onehot_fail vvp_tests/sf_onehot_fail.json
sf_onehot0_fail vvp_tests/sf_onehot0_fail.json
shift6 vvp_tests/shift6.json
single_element_array vvp_tests/single_element_array.json
struct_enum_partsel vvp_tests/struct_enum_partsel.json
struct_field_left_right vvp_tests/struct_field_left_right.json
Expand Down
5 changes: 5 additions & 0 deletions ivtest/vvp_tests/shift6.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@

{
"type" : "normal",
"source" : "shift6.v"
}
3 changes: 1 addition & 2 deletions tgt-vvp/eval_expr.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,12 +226,12 @@ void eval_logic_into_integer(ivl_expr_t expr, unsigned ix)
reading index values directly from variables. In
this case, try to use that special instruction. */
case IVL_EX_SIGNAL: {
const char*type = ivl_expr_signed(expr) ? "/s" : "";
ivl_signal_t sig = ivl_expr_signal(expr);

unsigned word = 0;
if (ivl_signal_dimensions(sig) > 0) {
ivl_expr_t ixe;
const char*type = ivl_expr_signed(expr) ? "/s" : "";

/* Detect the special case that this is a
variable array. In this case, the ix/getv
Expand All @@ -252,7 +252,6 @@ void eval_logic_into_integer(ivl_expr_t expr, unsigned ix)
break;
}
}
const char*type = ivl_signal_signed(sig) ? "/s" : "";
fprintf(vvp_out, " %%ix/getv%s %u, v%p_%u;\n", type, ix,
sig, word);
break;
Expand Down

0 comments on commit 74ba42e

Please sign in to comment.