From 50d9a32d56b425940c40eea7c9ea4ac4528e32f0 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Mon, 2 Sep 2024 18:25:41 +0200 Subject: [PATCH] tgt-vvp: Use signedness of expression instead of signal for index load When loading a signal into into an index register currently the signedness of the signal is used when deciding whether sign-extension should be performed or not. But this can lead to incorrect results, instead the signedness of the expression must be used as that might be different from the signal. E.g. ``` reg signed [1:0] = 2'b10; $display(1 << x[1:0]); ``` gives the wrong result without this. Signed-off-by: Lars-Peter Clausen --- tgt-vvp/eval_expr.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tgt-vvp/eval_expr.c b/tgt-vvp/eval_expr.c index 443a821eb..4103bc735 100644 --- a/tgt-vvp/eval_expr.c +++ b/tgt-vvp/eval_expr.c @@ -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 @@ -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;