tgt-vvp: Handle dynamic part select on array element non-blocking event control
VVP array assignment operations expect the array element index to be in index register 3. For array element assignments with a dynamic part select the array index gets moved into a temporary index register and has to be moved into register 3 after evaluating the dynamic part select. This is currently not done non-blocking event control assignments. This causes the write to go to the wrong array element. It will go to whatever value is in the register 3 from previous operations. ``` reg [3:0] a[1:0]; integer i = 0; event e; a[1][i+:2] <= @e 2'b10; // Will write to the wrong array element ->e; ``` Make sure to move the temporary register to register 3. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
parent
5fb2d9158d
commit
ab95d1d903
|
|
@ -179,6 +179,8 @@ static void assign_to_array_word(ivl_signal_t lsig, ivl_expr_t word_ix,
|
||||||
/* If needed use the global error state. */
|
/* If needed use the global error state. */
|
||||||
if (part_off_ex) {
|
if (part_off_ex) {
|
||||||
fprintf(vvp_out, " %%flag_mov 4, %d;\n", error_flag);
|
fprintf(vvp_out, " %%flag_mov 4, %d;\n", error_flag);
|
||||||
|
fprintf(vvp_out, " %%ix/mov 3, %d;\n", word_ix_reg);
|
||||||
|
clr_word(word_ix_reg);
|
||||||
}
|
}
|
||||||
fprintf(vvp_out, " %%assign/vec4/a/e v%p, %d;\n", lsig, part_off_reg);
|
fprintf(vvp_out, " %%assign/vec4/a/e v%p, %d;\n", lsig, part_off_reg);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue