From a85a868b5627b48ac95dffb33bbdbafdcb6652cd Mon Sep 17 00:00:00 2001 From: Katherine Parry Date: Fri, 24 Jun 2022 21:02:50 +0000 Subject: [PATCH] radix 4 division denormal result handeling --- pipelined/src/fpu/divshiftcalc.sv | 14 +++++++++++--- pipelined/src/fpu/postprocess.sv | 5 +++-- pipelined/srt/srt-radix4.sv | 2 +- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/pipelined/src/fpu/divshiftcalc.sv b/pipelined/src/fpu/divshiftcalc.sv index 398e8f467..d1a364b3c 100644 --- a/pipelined/src/fpu/divshiftcalc.sv +++ b/pipelined/src/fpu/divshiftcalc.sv @@ -4,12 +4,20 @@ module divshiftcalc( input logic [`DIVLEN+2:0] Quot, input logic [`NE+1:0] DivCalcExpM, output logic [$clog2(`NORMSHIFTSZ)-1:0] DivShiftAmt, + output logic [`NORMSHIFTSZ-1:0] DivShiftIn, output logic [`NE+1:0] CorrDivExp ); - - assign DivShiftAmt = {{$clog2(`NORMSHIFTSZ)-1{1'b0}}, ~Quot[`DIVLEN+2]}; + logic ResDenorm; + logic [`NE+1:0] DenormShift; + logic [`NE+1:0] NormShift; + assign ResDenorm = DivCalcExpM[`NE+1]; + assign DenormShift = (`NE+2)'(`NF-1)+DivCalcExpM; + assign NormShift = {(`NE+1)'(0), ~Quot[`DIVLEN+2]} + (`NE+2)'(`NF); + assign DivShiftAmt = ResDenorm ? DenormShift[$clog2(`NORMSHIFTSZ)-1:0] : NormShift[$clog2(`NORMSHIFTSZ)-1:0]; + + assign DivShiftIn = {(`NF)'(0), Quot[`DIVLEN+1:0], {`NORMSHIFTSZ-`DIVLEN-2-`NF{1'b0}}}; // the quotent is in the range [.5,2) // if the quotent < 1 and not denormal then subtract 1 to account for the normalization shift - assign CorrDivExp = DivCalcExpM - {(`NE)'(0), ~Quot[`DIVLEN+2]}; + assign CorrDivExp = (ResDenorm&~DenormShift[`NE+1]) ? (`NE+2)'(0) : DivCalcExpM - {(`NE+1)'(0), ~Quot[`DIVLEN+2]}; endmodule diff --git a/pipelined/src/fpu/postprocess.sv b/pipelined/src/fpu/postprocess.sv index 9516e223f..b4c8496a3 100644 --- a/pipelined/src/fpu/postprocess.sv +++ b/pipelined/src/fpu/postprocess.sv @@ -88,6 +88,7 @@ module postprocess( logic [$clog2(`NORMSHIFTSZ)-1:0] ShiftAmt; // normalization shift count logic [$clog2(`NORMSHIFTSZ)-1:0] DivShiftAmt; logic [`NORMSHIFTSZ-1:0] ShiftIn; // is the sum zero + logic [`NORMSHIFTSZ-1:0] DivShiftIn; logic [`NORMSHIFTSZ-1:0] Shifted; // the shifted result logic Plus1; // add one to the final result? logic IntInvalid, Overflow, Underflow, Invalid; // flags @@ -142,7 +143,7 @@ module postprocess( .XZeroM, .IntToFp, .OutFmt, .CvtResUf, .CvtShiftIn); fmashiftcalc fmashiftcalc(.SumM, .ZExpM, .ProdExpM, .FmaNormCntM, .FmtM, .KillProdM, .ConvNormSumExp, .ZDenormM, .SumZero, .PreResultDenorm, .FmaShiftAmt, .FmaShiftIn); - divshiftcalc divshiftcalc(.Quot, .DivCalcExpM, .CorrDivExp, .DivShiftAmt); + divshiftcalc divshiftcalc(.Quot, .DivCalcExpM, .CorrDivExp, .DivShiftAmt, .DivShiftIn); always_comb case(PostProcSelM) @@ -156,7 +157,7 @@ module postprocess( end 2'b01: begin //div ***prob can take out ShiftAmt = DivShiftAmt; - ShiftIn = {Quot[`DIVLEN+1:0], {`NORMSHIFTSZ-`DIVLEN-2{1'b0}}}; + ShiftIn = DivShiftIn; end default: begin ShiftAmt = {$clog2(`NORMSHIFTSZ){1'bx}}; diff --git a/pipelined/srt/srt-radix4.sv b/pipelined/srt/srt-radix4.sv index eface008d..a49838ace 100644 --- a/pipelined/srt/srt-radix4.sv +++ b/pipelined/srt/srt-radix4.sv @@ -372,6 +372,6 @@ module expcalc( ); // correct exponent for denormal shifts - assign DivCalcExp = (XExpE - XZeroCnt - YExpE + YZeroCnt + (`NE)'(`BIAS))&{`NE+1{~XZeroE}}; + assign DivCalcExp = (XExpE - XZeroCnt - YExpE + YZeroCnt + (`NE)'(`BIAS))&{`NE+2{~XZeroE}}; endmodule