mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Started cleaning up shifting leading 1 in fdivsqrt
This commit is contained in:
parent
426aabbc1a
commit
4c106215f4
@ -94,15 +94,15 @@ localparam FMT2 = ((F_SUPPORTED & (LEN1 != S_LEN)) ? 2'd0 : 2'd2);
|
|||||||
localparam BIAS2 = ((F_SUPPORTED & (LEN1 != S_LEN)) ? S_BIAS : H_BIAS);
|
localparam BIAS2 = ((F_SUPPORTED & (LEN1 != S_LEN)) ? S_BIAS : H_BIAS);
|
||||||
|
|
||||||
// division constants
|
// division constants
|
||||||
localparam DIVN = (((NF+2<XLEN) & IDIV_ON_FPU) ? XLEN : NF+2); // standard length of input
|
localparam DIVN = ((NF+2<XLEN) & IDIV_ON_FPU) ? XLEN : NF+2; // standard length of input
|
||||||
localparam LOGR = ($clog2(RADIX)); // r = log(R)
|
localparam LOGR = $clog2(RADIX); // r = log(R)
|
||||||
localparam RK = (LOGR*DIVCOPIES); // r*k used for intdiv preproc
|
localparam RK = LOGR*DIVCOPIES; // r*k used for intdiv preproc
|
||||||
localparam LOGRK = ($clog2(RK)); // log2(r*k)
|
localparam LOGRK = $clog2(RK); // log2(r*k)
|
||||||
localparam FPDUR = ((DIVN+1+(LOGR*DIVCOPIES))/(LOGR*DIVCOPIES)+(RADIX/4));
|
localparam FPDUR = (DIVN+1)/RK + 1 + (RADIX/4);
|
||||||
localparam DURLEN = ($clog2(FPDUR+1));
|
localparam DURLEN = $clog2(FPDUR+1);
|
||||||
localparam DIVb = (FPDUR*LOGR*DIVCOPIES-1); // canonical fdiv size (b)
|
localparam DIVb = FPDUR*RK - 1; // canonical fdiv size (b)
|
||||||
localparam DIVBLEN = ($clog2(DIVb+1)-1);
|
localparam DIVBLEN = $clog2(DIVb+1)-1;
|
||||||
localparam DIVa = (DIVb+1-XLEN); // used for idiv on fpu: Shift residual right by b - (XLEN-1) to put remainder in lsbs of integer result
|
localparam DIVa = DIVb+1-XLEN; // used for idiv on fpu: Shift residual right by b - (XLEN-1) to put remainder in lsbs of integer result
|
||||||
|
|
||||||
// largest length in IEU/FPU
|
// largest length in IEU/FPU
|
||||||
localparam CVTLEN = ((NF<XLEN) ? (XLEN) : (NF)); // max(XLEN, NF)
|
localparam CVTLEN = ((NF<XLEN) ? (XLEN) : (NF)); // max(XLEN, NF)
|
||||||
|
@ -52,7 +52,7 @@ module fdivsqrtpreproc import cvw::*; #(parameter cvw_t P) (
|
|||||||
logic [P.DIVb:0] PreSqrtX;
|
logic [P.DIVb:0] PreSqrtX;
|
||||||
logic [P.DIVb+3:0] DivX, DivXShifted, SqrtX, PreShiftX; // Variations of dividend, to be muxed
|
logic [P.DIVb+3:0] DivX, DivXShifted, SqrtX, PreShiftX; // Variations of dividend, to be muxed
|
||||||
logic [P.NE+1:0] QeE; // Quotient Exponent (FP only)
|
logic [P.NE+1:0] QeE; // Quotient Exponent (FP only)
|
||||||
logic [P.DIVb-1:0] IFX, IFD; // Correctly-sized inputs for iterator, selected from int or fp input
|
logic [P.DIVb:0] IFX, IFD; // Correctly-sized inputs for iterator, selected from int or fp input
|
||||||
logic [P.DIVBLEN:0] mE, nE, ell; // Leading zeros of inputs
|
logic [P.DIVBLEN:0] mE, nE, ell; // Leading zeros of inputs
|
||||||
logic NumerZeroE; // Numerator is zero (X or A)
|
logic NumerZeroE; // Numerator is zero (X or A)
|
||||||
logic AZeroE, BZeroE; // A or B is Zero for integer division
|
logic AZeroE, BZeroE; // A or B is Zero for integer division
|
||||||
@ -89,12 +89,12 @@ module fdivsqrtpreproc import cvw::*; #(parameter cvw_t P) (
|
|||||||
mux2 #(P.XLEN) posbmux(BE, -BE, BsE, PosB);
|
mux2 #(P.XLEN) posbmux(BE, -BE, BsE, PosB);
|
||||||
|
|
||||||
// Select integer or floating point inputs
|
// Select integer or floating point inputs
|
||||||
mux2 #(P.DIVb) ifxmux({Xm, {(P.DIVb-P.NF-1){1'b0}}}, {PosA, {(P.DIVb-P.XLEN){1'b0}}}, IntDivE, IFX);
|
mux2 #(P.DIVb+1) ifxmux({Xm, {(P.DIVb-P.NF){1'b0}}}, {PosA, {(P.DIVb-P.XLEN+1){1'b0}}}, IntDivE, IFX);
|
||||||
mux2 #(P.DIVb) ifdmux({Ym, {(P.DIVb-P.NF-1){1'b0}}}, {PosB, {(P.DIVb-P.XLEN){1'b0}}}, IntDivE, IFD);
|
mux2 #(P.DIVb+1) ifdmux({Ym, {(P.DIVb-P.NF){1'b0}}}, {PosB, {(P.DIVb-P.XLEN+1){1'b0}}}, IntDivE, IFD);
|
||||||
mux2 #(1) numzmux(XZeroE, AZeroE, IntDivE, NumerZeroE);
|
mux2 #(1) numzmux(XZeroE, AZeroE, IntDivE, NumerZeroE);
|
||||||
end else begin // Int not supported
|
end else begin // Int not supported
|
||||||
assign IFX = {Xm, {(P.DIVb-P.NF-1){1'b0}}};
|
assign IFX = {Xm, {(P.DIVb-P.NF){1'b0}}};
|
||||||
assign IFD = {Ym, {(P.DIVb-P.NF-1){1'b0}}};
|
assign IFD = {Ym, {(P.DIVb-P.NF){1'b0}}};
|
||||||
assign NumerZeroE = XZeroE;
|
assign NumerZeroE = XZeroE;
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -103,12 +103,12 @@ module fdivsqrtpreproc import cvw::*; #(parameter cvw_t P) (
|
|||||||
//////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////
|
||||||
|
|
||||||
// count leading zeros for Subnorm FP and to normalize integer inputs
|
// count leading zeros for Subnorm FP and to normalize integer inputs
|
||||||
lzc #(P.DIVb) lzcX (IFX, ell);
|
lzc #(P.DIVb) lzcX (IFX[P.DIVb:1], ell);
|
||||||
lzc #(P.DIVb) lzcY (IFD, mE);
|
lzc #(P.DIVb) lzcY (IFD[P.DIVb:1], mE);
|
||||||
|
|
||||||
// Normalization shift: shift off leading one
|
// Normalization shift: shift off leading one
|
||||||
assign Xfract = (IFX << ell) << 1;
|
assign Xfract = (IFX[P.DIVb:1] << ell) << 1;
|
||||||
assign Dfract = (IFD << mE) << 1;
|
assign Dfract = (IFD[P.DIVb:1] << mE) << 1;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////
|
||||||
// Integer Right Shift to digit boundary
|
// Integer Right Shift to digit boundary
|
||||||
|
Loading…
Reference in New Issue
Block a user