mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Fixed multiplier nan boxing bug
This commit is contained in:
parent
3bfe23bc75
commit
ae64b859c3
@ -125,6 +125,7 @@ module fpu (
|
|||||||
logic [63:0] DivInput1E, DivInput2E; // inputs to divide/squareroot unit
|
logic [63:0] DivInput1E, DivInput2E; // inputs to divide/squareroot unit
|
||||||
logic load_preload; // enable for FF on fpdivsqrt
|
logic load_preload; // enable for FF on fpdivsqrt
|
||||||
logic [63:0] AlignedSrcAE; // align SrcA to the floating point format
|
logic [63:0] AlignedSrcAE; // align SrcA to the floating point format
|
||||||
|
logic [63:0] BoxedZeroE; // Zero value for Z for multiplication, with NaN boxing if needed
|
||||||
|
|
||||||
// DECODE STAGE
|
// DECODE STAGE
|
||||||
|
|
||||||
@ -164,7 +165,8 @@ module fpu (
|
|||||||
{FmtE&FOpCtrlE[2]&FOpCtrlE[1]&(FResultSelE==2'b01), ~FmtE&FOpCtrlE[2]&FOpCtrlE[1]&(FResultSelE==2'b01)},
|
{FmtE&FOpCtrlE[2]&FOpCtrlE[1]&(FResultSelE==2'b01), ~FmtE&FOpCtrlE[2]&FOpCtrlE[1]&(FResultSelE==2'b01)},
|
||||||
FSrcYE); // Force Z to be 0 for multiply instructions
|
FSrcYE); // Force Z to be 0 for multiply instructions
|
||||||
// Force Z to be 0 for multiply instructions
|
// Force Z to be 0 for multiply instructions
|
||||||
mux3 #(64) fzmulmux (FPreSrcZE, 64'b0, FPreSrcYE, {FOpCtrlE[2]&FOpCtrlE[1], FOpCtrlE[2]&~FOpCtrlE[1]}, FSrcZE);
|
mux2 #(64) fmulzeromux (64'hFFFFFFFF00000000, 64'b0, FmtE, BoxedZeroE); // NaN boxing for 32-bit zero
|
||||||
|
mux3 #(64) fzmulmux (FPreSrcZE, BoxedZeroE, FPreSrcYE, {FOpCtrlE[2]&FOpCtrlE[1], FOpCtrlE[2]&~FOpCtrlE[1]}, FSrcZE);
|
||||||
|
|
||||||
// unpacking unit
|
// unpacking unit
|
||||||
// - splits FP inputs into their various parts
|
// - splits FP inputs into their various parts
|
||||||
|
@ -22,11 +22,10 @@ module unpacking (
|
|||||||
logic XFracZero, YFracZero, ZFracZero; // input fraction zero
|
logic XFracZero, YFracZero, ZFracZero; // input fraction zero
|
||||||
logic XExpZero, YExpZero, ZExpZero; // input exponent zero
|
logic XExpZero, YExpZero, ZExpZero; // input exponent zero
|
||||||
logic YExpMaxE, ZExpMaxE; // input exponent all 1s
|
logic YExpMaxE, ZExpMaxE; // input exponent all 1s
|
||||||
logic XDoubleNaN, YDoubleNaN, ZDoubleNaN;
|
|
||||||
logic [31:0] XFloat, YFloat, ZFloat; // Bottom half or NaN, if RV64 and not properly NaN boxed
|
logic [31:0] XFloat, YFloat, ZFloat; // Bottom half or NaN, if RV64 and not properly NaN boxed
|
||||||
|
|
||||||
// Determine if number is NaN as double precision to check single precision NaN boxing
|
// Determine if number is NaN as double precision to check single precision NaN boxing
|
||||||
if (`XLEN==32) begin // eventually this should change to FLEN when RV32f has FLEN=32
|
if (`F_SUPPORTED & ~`D_SUPPORTED) begin // eventually this should change to FLEN when FLEN isn't hardwared to 64
|
||||||
assign XFloat = X[31:0];
|
assign XFloat = X[31:0];
|
||||||
assign YFloat = Y[31:0];
|
assign YFloat = Y[31:0];
|
||||||
assign ZFloat = Z[31:0];
|
assign ZFloat = Z[31:0];
|
||||||
|
Loading…
Reference in New Issue
Block a user