-
Notifications
You must be signed in to change notification settings - Fork 33
Open
Description
Specifically referring to this line (in insn_div.v but same idea applies to insn_rem.v):
wire [`RISCV_FORMAL_XLEN-1:0] result = rvfi_rs2_rdata == `RISCV_FORMAL_XLEN'b0 ? {`RISCV_FORMAL_XLEN{1'b1}} :
rvfi_rs1_rdata == {1'b1, {`RISCV_FORMAL_XLEN-1{1'b0}}} && rvfi_rs2_rdata == {`RISCV_FORMAL_XLEN{1'b1}} ? {1'b1, {`RISCV_FORMAL_XLEN-1{1'b0}}} :
**$signed(rvfi_rs1_rdata) / $signed(rvfi_rs2_rdata)**;
If rvfi_rs1_rdata is a negative number and rvfi_rs2_rdata is a positive number with a larger absolute value, an assertion on rd_wdata fails if the HW correctly returns 0.
Fix (confirmed by shimming locally):
wire [`RISCV_FORMAL_XLEN-1:0] result = rvfi_rs2_rdata == `RISCV_FORMAL_XLEN'b0 ? {`RISCV_FORMAL_XLEN{1'b1}} :
rvfi_rs1_rdata == {1'b1, {`RISCV_FORMAL_XLEN-1{1'b0}}} && rvfi_rs2_rdata == {`RISCV_FORMAL_XLEN{1'b1}} ? {1'b1, {`RISCV_FORMAL_XLEN-1{1'b0}}} :
**{$signed(rvfi_rs1_rdata) / $signed(rvfi_rs2_rdata)}**;
(surrounding the division expression in {...})
Note that local testing was only performed for RV32*
mkorbel1 and ESE-2019
Metadata
Metadata
Assignees
Labels
No labels