forked from Github_Repos/cvw
		
	renamed signals in ocde to match book
This commit is contained in:
		
							parent
							
								
									a4cd157f00
								
							
						
					
					
						commit
						5bb1478859
					
				@ -1,10 +1,10 @@
 | 
				
			|||||||
`include "wally-config.vh"
 | 
					`include "wally-config.vh"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module divshiftcalc(
 | 
					module divshiftcalc(
 | 
				
			||||||
    input logic  [`QLEN-1-(`RADIX/4):0] Quot,
 | 
					    input logic  [`QLEN-1-(`RADIX/4):0] DivQm,
 | 
				
			||||||
    input logic  [`FMTBITS-1:0] Fmt,
 | 
					    input logic  [`FMTBITS-1:0] Fmt,
 | 
				
			||||||
    input logic [`DURLEN-1:0] DivEarlyTermShift,
 | 
					    input logic [`DURLEN-1:0] DivEarlyTermShift,
 | 
				
			||||||
    input logic [`NE+1:0] DivCalcExp,
 | 
					    input logic [`NE+1:0] DivQe,
 | 
				
			||||||
    output logic [$clog2(`NORMSHIFTSZ)-1:0] DivShiftAmt,
 | 
					    output logic [$clog2(`NORMSHIFTSZ)-1:0] DivShiftAmt,
 | 
				
			||||||
    output logic [`NORMSHIFTSZ-1:0] DivShiftIn,
 | 
					    output logic [`NORMSHIFTSZ-1:0] DivShiftIn,
 | 
				
			||||||
    output logic DivResDenorm,
 | 
					    output logic DivResDenorm,
 | 
				
			||||||
@ -14,21 +14,21 @@ module divshiftcalc(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // is the result denromalized
 | 
					    // is the result denromalized
 | 
				
			||||||
    // if the exponent is 1 then the result needs to be normalized then the result is denormalizes
 | 
					    // if the exponent is 1 then the result needs to be normalized then the result is denormalizes
 | 
				
			||||||
    assign DivResDenorm = DivCalcExp[`NE+1]|(~|DivCalcExp[`NE+1:0]);
 | 
					    assign DivResDenorm = DivQe[`NE+1]|(~|DivQe[`NE+1:0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // if the result is denormalized
 | 
					    // if the result is denormalized
 | 
				
			||||||
    //  00000000x.xxxxxx...                     Exp = DivCalcExp
 | 
					    //  00000000x.xxxxxx...                     Exp = DivQe
 | 
				
			||||||
    //  .00000000xxxxxxx... >> NF+1             Exp = DivCalcExp+NF+1
 | 
					    //  .00000000xxxxxxx... >> NF+1             Exp = DivQe+NF+1
 | 
				
			||||||
    //  .00xxxxxxxxxxxxx... << DivCalcExp+NF+1  Exp = +1
 | 
					    //  .00xxxxxxxxxxxxx... << DivQe+NF+1  Exp = +1
 | 
				
			||||||
    //  .0000xxxxxxxxxxx... >> 1                Exp = 1
 | 
					    //  .0000xxxxxxxxxxx... >> 1                Exp = 1
 | 
				
			||||||
    // Left shift amount  = DivCalcExp+NF+1-1
 | 
					    // Left shift amount  = DivQe+NF+1-1
 | 
				
			||||||
    assign DivDenormShift = (`NE+2)'(`NF)+DivCalcExp;
 | 
					    assign DivDenormShift = (`NE+2)'(`NF)+DivQe;
 | 
				
			||||||
    // if the result is normalized
 | 
					    // if the result is normalized
 | 
				
			||||||
    //  00000000x.xxxxxx...                     Exp = DivCalcExp
 | 
					    //  00000000x.xxxxxx...                     Exp = DivQe
 | 
				
			||||||
    //  .00000000xxxxxxx... >> NF+1             Exp = DivCalcExp+NF+1
 | 
					    //  .00000000xxxxxxx... >> NF+1             Exp = DivQe+NF+1
 | 
				
			||||||
    //  00000000.xxxxxxx... << NF               Exp = DivCalcExp+1
 | 
					    //  00000000.xxxxxxx... << NF               Exp = DivQe+1
 | 
				
			||||||
    //  00000000x.xxxxxx... << NF               Exp = DivCalcExp (extra shift done afterwards)
 | 
					    //  00000000x.xxxxxx... << NF               Exp = DivQe (extra shift done afterwards)
 | 
				
			||||||
    //  00000000xx.xxxxx... << 1?               Exp = DivCalcExp-1 (determined after)
 | 
					    //  00000000xx.xxxxx... << 1?               Exp = DivQe-1 (determined after)
 | 
				
			||||||
    // inital Left shift amount  = NF
 | 
					    // inital Left shift amount  = NF
 | 
				
			||||||
    // shift one more if the it's a minimally redundent radix 4 - one entire cycle needed for integer bit
 | 
					    // shift one more if the it's a minimally redundent radix 4 - one entire cycle needed for integer bit
 | 
				
			||||||
    assign NormShift = (`NE+2)'(`NF);
 | 
					    assign NormShift = (`NE+2)'(`NF);
 | 
				
			||||||
@ -36,6 +36,6 @@ module divshiftcalc(
 | 
				
			|||||||
    // need to multiply the early termination shift by LOGR*DIVCOPIES =  left shift of log2(LOGR*DIVCOPIES)
 | 
					    // need to multiply the early termination shift by LOGR*DIVCOPIES =  left shift of log2(LOGR*DIVCOPIES)
 | 
				
			||||||
    assign DivShiftAmt = (DivResDenorm ?  DivDenormShift[$clog2(`NORMSHIFTSZ)-1:0]&{$clog2(`NORMSHIFTSZ){~DivDenormShift[`NE+1]}} : NormShift[$clog2(`NORMSHIFTSZ)-1:0])+{{$clog2(`NORMSHIFTSZ)-`DURLEN-$clog2(`LOGR*`DIVCOPIES){1'b0}}, DivEarlyTermShift&{`DURLEN{~DivDenormShift[`NE+1]}}, {$clog2(`LOGR*`DIVCOPIES){1'b0}}};
 | 
					    assign DivShiftAmt = (DivResDenorm ?  DivDenormShift[$clog2(`NORMSHIFTSZ)-1:0]&{$clog2(`NORMSHIFTSZ){~DivDenormShift[`NE+1]}} : NormShift[$clog2(`NORMSHIFTSZ)-1:0])+{{$clog2(`NORMSHIFTSZ)-`DURLEN-$clog2(`LOGR*`DIVCOPIES){1'b0}}, DivEarlyTermShift&{`DURLEN{~DivDenormShift[`NE+1]}}, {$clog2(`LOGR*`DIVCOPIES){1'b0}}};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assign DivShiftIn = {{`NF{1'b0}}, Quot, {`NORMSHIFTSZ-`QLEN+(`RADIX/4)-`NF{1'b0}}};
 | 
					    assign DivShiftIn = {{`NF{1'b0}}, DivQm, {`NORMSHIFTSZ-`QLEN+(`RADIX/4)-`NF{1'b0}}};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
endmodule
 | 
					endmodule
 | 
				
			||||||
 | 
				
			|||||||
@ -127,7 +127,7 @@ module fcvt (
 | 
				
			|||||||
    //                  - rather have a few and-gates than an extra bit in the priority encoder??? *** is this true?
 | 
					    //                  - rather have a few and-gates than an extra bit in the priority encoder??? *** is this true?
 | 
				
			||||||
    assign ShiftAmt = ToInt ? Ce[`LOGCVTLEN-1:0]&{`LOGCVTLEN{~Ce[`NE]}} :
 | 
					    assign ShiftAmt = ToInt ? Ce[`LOGCVTLEN-1:0]&{`LOGCVTLEN{~Ce[`NE]}} :
 | 
				
			||||||
                    ResDenormUf&~IntToFp ? (`LOGCVTLEN)'(`NF-1)+Ce[`LOGCVTLEN-1:0] : 
 | 
					                    ResDenormUf&~IntToFp ? (`LOGCVTLEN)'(`NF-1)+Ce[`LOGCVTLEN-1:0] : 
 | 
				
			||||||
                              (LeadingZeros)&{`LOGCVTLEN{XDenorm|IntToFp}};
 | 
					                              (LeadingZeros);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    ///////////////////////////////////////////////////////////////////////////
 | 
					    ///////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
    // exp calculations
 | 
					    // exp calculations
 | 
				
			||||||
 | 
				
			|||||||
@ -48,10 +48,10 @@ module flags(
 | 
				
			|||||||
    input logic                 DivOp,                  // conversion opperation?
 | 
					    input logic                 DivOp,                  // conversion opperation?
 | 
				
			||||||
    input logic                 FmaOp,                  // Fma opperation?
 | 
					    input logic                 FmaOp,                  // Fma opperation?
 | 
				
			||||||
    input logic  [`NE+1:0]      FullRe,             // Re with bits to determine sign and overflow
 | 
					    input logic  [`NE+1:0]      FullRe,             // Re with bits to determine sign and overflow
 | 
				
			||||||
    input logic  [`NE+1:0]      Nexp,               // exponent of the normalized sum
 | 
					    input logic  [`NE+1:0]      Me,               // exponent of the normalized sum
 | 
				
			||||||
    input logic  [1:0]          CvtNegResMsbs,             // the negitive integer result's most significant bits
 | 
					    input logic  [1:0]          CvtNegResMsbs,             // the negitive integer result's most significant bits
 | 
				
			||||||
    input logic                 FmaAs, FmaPs,        // the product and modified Z signs
 | 
					    input logic                 FmaAs, FmaPs,        // the product and modified Z signs
 | 
				
			||||||
    input logic                 R, UfLSBRes, S, UfPlus1, // bits used to determine rounding
 | 
					    input logic                 R, UfL, S, UfPlus1, // bits used to determine rounding
 | 
				
			||||||
    output logic                DivByZero,
 | 
					    output logic                DivByZero,
 | 
				
			||||||
    output logic                IntInvalid, Invalid, Overflow, // flags used to select the res
 | 
					    output logic                IntInvalid, Invalid, Overflow, // flags used to select the res
 | 
				
			||||||
    output logic [4:0]          PostProcFlg // flags
 | 
					    output logic [4:0]          PostProcFlg // flags
 | 
				
			||||||
@ -127,7 +127,7 @@ module flags(
 | 
				
			|||||||
    //                  |                    |                    |                                      |                     and if the result is not exact
 | 
					    //                  |                    |                    |                                      |                     and if the result is not exact
 | 
				
			||||||
    //                  |                    |                    |                                      |                     |               and if the input isnt infinity or NaN
 | 
					    //                  |                    |                    |                                      |                     |               and if the input isnt infinity or NaN
 | 
				
			||||||
    //                  |                    |                    |                                      |                     |               |
 | 
					    //                  |                    |                    |                                      |                     |               |
 | 
				
			||||||
    assign Underflow = ((FullRe[`NE+1] | (FullRe == 0) | ((FullRe == 1) & (Nexp == 0) & ~(UfPlus1&UfLSBRes)))&(R|S))&~(InfIn|NaNIn|DivByZero);
 | 
					    assign Underflow = ((FullRe[`NE+1] | (FullRe == 0) | ((FullRe == 1) & (Me == 0) & ~(UfPlus1&UfL)))&(R|S))&~(InfIn|NaNIn|DivByZero);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Set Inexact flag if the res is diffrent from what would be outputed given infinite precision
 | 
					    // Set Inexact flag if the res is diffrent from what would be outputed given infinite precision
 | 
				
			||||||
    //      - Don't set the underflow flag if an underflowed res isn't outputed
 | 
					    //      - Don't set the underflow flag if an underflowed res isn't outputed
 | 
				
			||||||
 | 
				
			|||||||
@ -35,7 +35,7 @@ module fmashiftcalc(
 | 
				
			|||||||
    input logic  [$clog2(3*`NF+7)-1:0]  FmaNCnt,   // normalization shift count
 | 
					    input logic  [$clog2(3*`NF+7)-1:0]  FmaNCnt,   // normalization shift count
 | 
				
			||||||
    input logic  [`FMTBITS-1:0]         Fmt,       // precision 1 = double 0 = single
 | 
					    input logic  [`FMTBITS-1:0]         Fmt,       // precision 1 = double 0 = single
 | 
				
			||||||
    input logic                         FmaKillProd,  // is the product set to zero
 | 
					    input logic                         FmaKillProd,  // is the product set to zero
 | 
				
			||||||
    output logic [`NE+1:0]              FmaConvNormSumExp,          // exponent of the normalized sum not taking into account denormal or zero results
 | 
					    output logic [`NE+1:0]              FmaNe,          // exponent of the normalized sum not taking into account denormal or zero results
 | 
				
			||||||
    output logic                        FmaSZero,    // is the result denormalized - calculated before LZA corection
 | 
					    output logic                        FmaSZero,    // is the result denormalized - calculated before LZA corection
 | 
				
			||||||
    output logic                        FmaPreResultDenorm,    // is the result denormalized - calculated before LZA corection
 | 
					    output logic                        FmaPreResultDenorm,    // is the result denormalized - calculated before LZA corection
 | 
				
			||||||
    output logic [$clog2(3*`NF+7)-1:0]  FmaShiftAmt,   // normalization shift count
 | 
					    output logic [$clog2(3*`NF+7)-1:0]  FmaShiftAmt,   // normalization shift count
 | 
				
			||||||
@ -57,28 +57,28 @@ module fmashiftcalc(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    //convert the sum's exponent into the proper percision
 | 
					    //convert the sum's exponent into the proper percision
 | 
				
			||||||
    if (`FPSIZES == 1) begin
 | 
					    if (`FPSIZES == 1) begin
 | 
				
			||||||
        assign FmaConvNormSumExp = NormSumExp;
 | 
					        assign FmaNe = NormSumExp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    end else if (`FPSIZES == 2) begin
 | 
					    end else if (`FPSIZES == 2) begin
 | 
				
			||||||
        assign FmaConvNormSumExp = Fmt ? NormSumExp : (NormSumExp-(`NE+2)'(`BIAS)+(`NE+2)'(`BIAS1))&{`NE+2{|NormSumExp}};
 | 
					        assign FmaNe = Fmt ? NormSumExp : (NormSumExp-(`NE+2)'(`BIAS)+(`NE+2)'(`BIAS1))&{`NE+2{|NormSumExp}};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    end else if (`FPSIZES == 3) begin
 | 
					    end else if (`FPSIZES == 3) begin
 | 
				
			||||||
        always_comb begin
 | 
					        always_comb begin
 | 
				
			||||||
            case (Fmt)
 | 
					            case (Fmt)
 | 
				
			||||||
                `FMT: FmaConvNormSumExp = NormSumExp;
 | 
					                `FMT: FmaNe = NormSumExp;
 | 
				
			||||||
                `FMT1: FmaConvNormSumExp = (NormSumExp-(`NE+2)'(`BIAS)+(`NE+2)'(`BIAS1))&{`NE+2{|NormSumExp}};
 | 
					                `FMT1: FmaNe = (NormSumExp-(`NE+2)'(`BIAS)+(`NE+2)'(`BIAS1))&{`NE+2{|NormSumExp}};
 | 
				
			||||||
                `FMT2: FmaConvNormSumExp = (NormSumExp-(`NE+2)'(`BIAS)+(`NE+2)'(`BIAS2))&{`NE+2{|NormSumExp}};
 | 
					                `FMT2: FmaNe = (NormSumExp-(`NE+2)'(`BIAS)+(`NE+2)'(`BIAS2))&{`NE+2{|NormSumExp}};
 | 
				
			||||||
                default: FmaConvNormSumExp = {`NE+2{1'bx}};
 | 
					                default: FmaNe = {`NE+2{1'bx}};
 | 
				
			||||||
            endcase
 | 
					            endcase
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    end else if (`FPSIZES == 4) begin
 | 
					    end else if (`FPSIZES == 4) begin
 | 
				
			||||||
        always_comb begin
 | 
					        always_comb begin
 | 
				
			||||||
            case (Fmt)
 | 
					            case (Fmt)
 | 
				
			||||||
                2'h3: FmaConvNormSumExp = NormSumExp;
 | 
					                2'h3: FmaNe = NormSumExp;
 | 
				
			||||||
                2'h1: FmaConvNormSumExp = (NormSumExp-(`NE+2)'(`BIAS)+(`NE+2)'(`D_BIAS))&{`NE+2{|NormSumExp}};
 | 
					                2'h1: FmaNe = (NormSumExp-(`NE+2)'(`BIAS)+(`NE+2)'(`D_BIAS))&{`NE+2{|NormSumExp}};
 | 
				
			||||||
                2'h0: FmaConvNormSumExp = (NormSumExp-(`NE+2)'(`BIAS)+(`NE+2)'(`S_BIAS))&{`NE+2{|NormSumExp}};
 | 
					                2'h0: FmaNe = (NormSumExp-(`NE+2)'(`BIAS)+(`NE+2)'(`S_BIAS))&{`NE+2{|NormSumExp}};
 | 
				
			||||||
                2'h2: FmaConvNormSumExp = (NormSumExp-(`NE+2)'(`BIAS)+(`NE+2)'(`H_BIAS))&{`NE+2{|NormSumExp}};
 | 
					                2'h2: FmaNe = (NormSumExp-(`NE+2)'(`BIAS)+(`NE+2)'(`H_BIAS))&{`NE+2{|NormSumExp}};
 | 
				
			||||||
            endcase
 | 
					            endcase
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -144,11 +144,11 @@ module fmashiftcalc(
 | 
				
			|||||||
    //      - if kill prod dont add to exp
 | 
					    //      - if kill prod dont add to exp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Determine if the result is denormal
 | 
					    // Determine if the result is denormal
 | 
				
			||||||
    // assign FmaPreResultDenorm = $signed(FmaConvNormSumExp)<=0 & ($signed(FmaConvNormSumExp)>=$signed(-FracLen)) & ~FmaSZero;
 | 
					    // assign FmaPreResultDenorm = $signed(FmaNe)<=0 & ($signed(FmaNe)>=$signed(-FracLen)) & ~FmaSZero;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Determine the shift needed for denormal results
 | 
					    // Determine the shift needed for denormal results
 | 
				
			||||||
    //  - if not denorm add 1 to shift out the leading 1
 | 
					    //  - if not denorm add 1 to shift out the leading 1
 | 
				
			||||||
    assign DenormShift = FmaPreResultDenorm ? FmaConvNormSumExp[$clog2(3*`NF+7)-1:0] : 1;
 | 
					    assign DenormShift = FmaPreResultDenorm ? FmaNe[$clog2(3*`NF+7)-1:0] : 1;
 | 
				
			||||||
    // set and calculate the shift input and amount
 | 
					    // set and calculate the shift input and amount
 | 
				
			||||||
    //  - shift once if killing a product and the result is denormalized
 | 
					    //  - shift once if killing a product and the result is denormalized
 | 
				
			||||||
    assign FmaShiftIn = {3'b0, FmaSm};
 | 
					    assign FmaShiftIn = {3'b0, FmaSm};
 | 
				
			||||||
 | 
				
			|||||||
@ -381,10 +381,10 @@ module fpu (
 | 
				
			|||||||
   assign FpLoadStoreM = FResSelM[1];
 | 
					   assign FpLoadStoreM = FResSelM[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   postprocess postprocess(.Xs(XSgnM), .Ys(YSgnM), .Ze(ZExpM), .Xm(XManM), .Ym(YManM), .Zm(ZManM), .Frm(FrmM), .Fmt(FmtM), .FmaPe(ProdExpM), .DivEarlyTermShift(EarlyTermShiftM),
 | 
					   postprocess postprocess(.Xs(XSgnM), .Ys(YSgnM), .Ze(ZExpM), .Xm(XManM), .Ym(YManM), .Zm(ZManM), .Frm(FrmM), .Fmt(FmtM), .FmaPe(ProdExpM), .DivEarlyTermShift(EarlyTermShiftM),
 | 
				
			||||||
                           .FmaZmSticky(AddendStickyM), .FmaKillProd(KillProdM), .XZero(XZeroM), .YZero(YZeroM), .ZZero(ZZeroM), .XInf(XInfM), .YInf(YInfM), .Quot(QuotM),
 | 
					                           .FmaZmS(AddendStickyM), .FmaKillProd(KillProdM), .XZero(XZeroM), .YZero(YZeroM), .ZZero(ZZeroM), .XInf(XInfM), .YInf(YInfM), .DivQm(QuotM),
 | 
				
			||||||
                           .ZInf(ZInfM), .XNaN(XNaNM), .YNaN(YNaNM), .ZNaN(ZNaNM), .XSNaN(XSNaNM), .YSNaN(YSNaNM), .ZSNaN(ZSNaNM), .FmaSm(SumM), .DivCalcExp(DivCalcExpM), .DivDone(DivDoneM),
 | 
					                           .ZInf(ZInfM), .XNaN(XNaNM), .YNaN(YNaNM), .ZNaN(ZNaNM), .XSNaN(XSNaNM), .YSNaN(YSNaNM), .ZSNaN(ZSNaNM), .FmaSm(SumM), .DivQe(DivCalcExpM), .DivDone(DivDoneM),
 | 
				
			||||||
                           .FmaNegSum(NegSumM), .FmaInvA(InvAM), .ZDenorm(ZDenormM), .FmaAs(ZSgnEffM), .FmaPs(PSgnM), .FOpCtrl(FOpCtrlM), .FmaNCnt(FmaNormCntM),
 | 
					                           .FmaNegSum(NegSumM), .FmaInvA(InvAM), .ZDenorm(ZDenormM), .FmaAs(ZSgnEffM), .FmaPs(PSgnM), .FOpCtrl(FOpCtrlM), .FmaNCnt(FmaNormCntM),
 | 
				
			||||||
                           .CvtCe(CvtCalcExpM), .CvtResDenormUf(CvtResDenormUfM),.CvtShiftAmt(CvtShiftAmtM), .CvtCs(CvtResSgnM), .ToInt(FWriteIntM), .DivSticky(DivStickyM),
 | 
					                           .CvtCe(CvtCalcExpM), .CvtResDenormUf(CvtResDenormUfM),.CvtShiftAmt(CvtShiftAmtM), .CvtCs(CvtResSgnM), .ToInt(FWriteIntM), .DivS(DivStickyM),
 | 
				
			||||||
                           .CvtLzcIn(CvtLzcInM), .IntZero(IntZeroM), .PostProcSel(PostProcSelM), .PostProcRes(PostProcResM), .PostProcFlg(PostProcFlgM), .FCvtIntRes(FCvtIntResM));
 | 
					                           .CvtLzcIn(CvtLzcInM), .IntZero(IntZeroM), .PostProcSel(PostProcSelM), .PostProcRes(PostProcResM), .PostProcFlg(PostProcFlgM), .FCvtIntRes(FCvtIntResM));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   // FPU flag selection - to privileged
 | 
					   // FPU flag selection - to privileged
 | 
				
			||||||
 | 
				
			|||||||
@ -48,17 +48,17 @@ module postprocess (
 | 
				
			|||||||
    input logic                             FmaPs,      // the product's sign
 | 
					    input logic                             FmaPs,      // the product's sign
 | 
				
			||||||
    input logic  [`NE+1:0]                  FmaPe,       // Product exponent
 | 
					    input logic  [`NE+1:0]                  FmaPe,       // Product exponent
 | 
				
			||||||
    input logic  [3*`NF+5:0]                FmaSm,       // the positive sum
 | 
					    input logic  [3*`NF+5:0]                FmaSm,       // the positive sum
 | 
				
			||||||
    input logic                             FmaZmSticky,  // sticky bit that is calculated during alignment
 | 
					    input logic                             FmaZmS,  // sticky bit that is calculated during alignment
 | 
				
			||||||
    input logic                             FmaKillProd,      // set the product to zero before addition if the product is too small to matter
 | 
					    input logic                             FmaKillProd,      // set the product to zero before addition if the product is too small to matter
 | 
				
			||||||
    input logic                             FmaNegSum,    // was the sum negitive
 | 
					    input logic                             FmaNegSum,    // was the sum negitive
 | 
				
			||||||
    input logic                             FmaInvA,      // do you invert Z
 | 
					    input logic                             FmaInvA,      // do you invert Z
 | 
				
			||||||
    input logic  [$clog2(3*`NF+7)-1:0]      FmaNCnt,   // the normalization shift count
 | 
					    input logic  [$clog2(3*`NF+7)-1:0]      FmaNCnt,   // the normalization shift count
 | 
				
			||||||
    //divide signals
 | 
					    //divide signals
 | 
				
			||||||
    input logic  [`DURLEN-1:0]              DivEarlyTermShift,
 | 
					    input logic  [`DURLEN-1:0]              DivEarlyTermShift,
 | 
				
			||||||
    input logic                             DivSticky,
 | 
					    input logic                             DivS,
 | 
				
			||||||
    input logic                             DivDone,
 | 
					    input logic                             DivDone,
 | 
				
			||||||
    input logic  [`NE+1:0]                  DivCalcExp,
 | 
					    input logic  [`NE+1:0]                  DivQe,
 | 
				
			||||||
    input logic  [`QLEN-1-(`RADIX/4):0]                Quot,
 | 
					    input logic  [`QLEN-1-(`RADIX/4):0]                DivQm,
 | 
				
			||||||
    // conversion signals
 | 
					    // conversion signals
 | 
				
			||||||
    input logic                             CvtCs,     // the result's sign
 | 
					    input logic                             CvtCs,     // the result's sign
 | 
				
			||||||
    input logic  [`NE:0]                    CvtCe,    // the calculated expoent
 | 
					    input logic  [`NE:0]                    CvtCe,    // the calculated expoent
 | 
				
			||||||
@ -77,9 +77,9 @@ module postprocess (
 | 
				
			|||||||
    logic Ws;
 | 
					    logic Ws;
 | 
				
			||||||
    logic [`NF-1:0] Rf; // Result fraction
 | 
					    logic [`NF-1:0] Rf; // Result fraction
 | 
				
			||||||
    logic [`NE-1:0] Re;  // Result exponent
 | 
					    logic [`NE-1:0] Re;  // Result exponent
 | 
				
			||||||
    logic Nsgn;
 | 
					    logic Ms;
 | 
				
			||||||
    logic [`NE+1:0] Nexp;
 | 
					    logic [`NE+1:0] Me;
 | 
				
			||||||
    logic [`CORRSHIFTSZ-1:0] Nfrac; // corectly shifted fraction
 | 
					    logic [`CORRSHIFTSZ-1:0] Mf; // corectly shifted fraction
 | 
				
			||||||
    logic [`NE+1:0] FullRe;  // Re with bits to determine sign and overflow
 | 
					    logic [`NE+1:0] FullRe;  // Re with bits to determine sign and overflow
 | 
				
			||||||
    logic S;           // S bit
 | 
					    logic S;           // S bit
 | 
				
			||||||
    logic UfPlus1;                    // do you add one (for determining underflow flag)
 | 
					    logic UfPlus1;                    // do you add one (for determining underflow flag)
 | 
				
			||||||
@ -89,19 +89,19 @@ module postprocess (
 | 
				
			|||||||
    logic [`NORMSHIFTSZ-1:0] Shifted;    // the shifted result
 | 
					    logic [`NORMSHIFTSZ-1:0] Shifted;    // the shifted result
 | 
				
			||||||
    logic Plus1;      // add one to the final result?
 | 
					    logic Plus1;      // add one to the final result?
 | 
				
			||||||
    logic IntInvalid, Overflow, Invalid; // flags
 | 
					    logic IntInvalid, Overflow, Invalid; // flags
 | 
				
			||||||
    logic UfLSBRes;
 | 
					    logic UfL;
 | 
				
			||||||
    logic [`FMTBITS-1:0] OutFmt;
 | 
					    logic [`FMTBITS-1:0] OutFmt;
 | 
				
			||||||
    // fma signals
 | 
					    // fma signals
 | 
				
			||||||
    logic [`NE+1:0] FmaSe;     // exponent of the normalized sum
 | 
					    logic [`NE+1:0] FmaSe;     // exponent of the normalized sum
 | 
				
			||||||
    logic FmaSZero;        // is the sum zero
 | 
					    logic FmaSZero;        // is the sum zero
 | 
				
			||||||
    logic [3*`NF+8:0] FmaShiftIn;        // shift input
 | 
					    logic [3*`NF+8:0] FmaShiftIn;        // shift input
 | 
				
			||||||
    logic [`NE+1:0] FmaConvNormSumExp;          // exponent of the normalized sum not taking into account denormal or zero results
 | 
					    logic [`NE+1:0] FmaNe;          // exponent of the normalized sum not taking into account denormal or zero results
 | 
				
			||||||
    logic FmaPreResultDenorm;    // is the result denormalized - calculated before LZA corection
 | 
					    logic FmaPreResultDenorm;    // is the result denormalized - calculated before LZA corection
 | 
				
			||||||
    logic [$clog2(3*`NF+7)-1:0] FmaShiftAmt;   // normalization shift count
 | 
					    logic [$clog2(3*`NF+7)-1:0] FmaShiftAmt;   // normalization shift count
 | 
				
			||||||
    // division singals
 | 
					    // division singals
 | 
				
			||||||
    logic [$clog2(`NORMSHIFTSZ)-1:0] DivShiftAmt;
 | 
					    logic [$clog2(`NORMSHIFTSZ)-1:0] DivShiftAmt;
 | 
				
			||||||
    logic [`NORMSHIFTSZ-1:0] DivShiftIn;
 | 
					    logic [`NORMSHIFTSZ-1:0] DivShiftIn;
 | 
				
			||||||
    logic [`NE+1:0] DivCorrExp;
 | 
					    logic [`NE+1:0] Qe;
 | 
				
			||||||
    logic DivByZero;
 | 
					    logic DivByZero;
 | 
				
			||||||
    logic DivResDenorm;
 | 
					    logic DivResDenorm;
 | 
				
			||||||
    logic [`NE+1:0] DivDenormShift;
 | 
					    logic [`NE+1:0] DivDenormShift;
 | 
				
			||||||
@ -150,9 +150,9 @@ module postprocess (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    cvtshiftcalc cvtshiftcalc(.ToInt, .CvtCe, .CvtResDenormUf, .Xm, .CvtLzcIn,  
 | 
					    cvtshiftcalc cvtshiftcalc(.ToInt, .CvtCe, .CvtResDenormUf, .Xm, .CvtLzcIn,  
 | 
				
			||||||
                              .XZero, .IntToFp, .OutFmt, .CvtResUf, .CvtShiftIn);
 | 
					                              .XZero, .IntToFp, .OutFmt, .CvtResUf, .CvtShiftIn);
 | 
				
			||||||
    fmashiftcalc fmashiftcalc(.FmaSm, .Ze, .FmaPe, .FmaNCnt, .Fmt, .FmaKillProd, .FmaConvNormSumExp,
 | 
					    fmashiftcalc fmashiftcalc(.FmaSm, .Ze, .FmaPe, .FmaNCnt, .Fmt, .FmaKillProd, .FmaNe,
 | 
				
			||||||
                          .FmaSZero, .FmaPreResultDenorm, .FmaShiftAmt, .FmaShiftIn);
 | 
					                          .FmaSZero, .FmaPreResultDenorm, .FmaShiftAmt, .FmaShiftIn);
 | 
				
			||||||
    divshiftcalc divshiftcalc(.Fmt, .DivCalcExp, .Quot, .DivEarlyTermShift, .DivResDenorm, .DivDenormShift, .DivShiftAmt, .DivShiftIn);
 | 
					    divshiftcalc divshiftcalc(.Fmt, .DivQe, .DivQm, .DivEarlyTermShift, .DivResDenorm, .DivDenormShift, .DivShiftAmt, .DivShiftIn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    always_comb
 | 
					    always_comb
 | 
				
			||||||
        case(PostProcSel)
 | 
					        case(PostProcSel)
 | 
				
			||||||
@ -181,9 +181,9 @@ module postprocess (
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    normshift normshift (.ShiftIn, .ShiftAmt, .Shifted);
 | 
					    normshift normshift (.ShiftIn, .ShiftAmt, .Shifted);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    shiftcorrection shiftcorrection(.FmaOp, .FmaPreResultDenorm, .FmaConvNormSumExp,
 | 
					    shiftcorrection shiftcorrection(.FmaOp, .FmaPreResultDenorm, .FmaNe,
 | 
				
			||||||
                                .DivResDenorm, .DivDenormShift, .DivOp, .DivCalcExp,
 | 
					                                .DivResDenorm, .DivDenormShift, .DivOp, .DivQe,
 | 
				
			||||||
                                .DivCorrExp, .FmaSZero, .Shifted, .FmaSe, .Nfrac);
 | 
					                                .Qe, .FmaSZero, .Shifted, .FmaSe, .Mf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ///////////////////////////////////////////////////////////////////////////////
 | 
					    ///////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
    // Rounding
 | 
					    // Rounding
 | 
				
			||||||
@ -197,19 +197,19 @@ module postprocess (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                          
 | 
					                          
 | 
				
			||||||
    roundsign roundsign(.FmaPs, .FmaAs, .FmaInvA, .FmaOp, .DivOp, .CvtOp, .FmaNegSum, 
 | 
					    roundsign roundsign(.FmaPs, .FmaAs, .FmaInvA, .FmaOp, .DivOp, .CvtOp, .FmaNegSum, 
 | 
				
			||||||
                          .Xs, .Ys, .CvtCs, .Nsgn);
 | 
					                          .Xs, .Ys, .CvtCs, .Ms);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    round round(.OutFmt, .Frm, .S, .FmaZmSticky, .Plus1, .PostProcSel, .CvtCe, .DivCorrExp,
 | 
					    round round(.OutFmt, .Frm, .S, .FmaZmS, .Plus1, .PostProcSel, .CvtCe, .Qe,
 | 
				
			||||||
                .Nsgn, .FmaSe, .FmaOp, .CvtOp, .CvtResDenormUf, .Nfrac, .ToInt,  .CvtResUf,
 | 
					                .Ms, .FmaSe, .FmaOp, .CvtOp, .CvtResDenormUf, .Mf, .ToInt,  .CvtResUf,
 | 
				
			||||||
                .DivSticky, .DivDone,
 | 
					                .DivS, .DivDone,
 | 
				
			||||||
                .DivOp, .UfPlus1, .FullRe, .Rf, .Re, .R, .UfLSBRes, .Nexp);
 | 
					                .DivOp, .UfPlus1, .FullRe, .Rf, .Re, .R, .UfL, .Me);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ///////////////////////////////////////////////////////////////////////////////
 | 
					    ///////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
    // Sign calculation
 | 
					    // Sign calculation
 | 
				
			||||||
    ///////////////////////////////////////////////////////////////////////////////
 | 
					    ///////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    resultsign resultsign(.Frm, .FmaPs, .FmaAs, .FmaSe, .R, .S,
 | 
					    resultsign resultsign(.Frm, .FmaPs, .FmaAs, .FmaSe, .R, .S,
 | 
				
			||||||
                          .FmaOp, .ZInf, .InfIn, .FmaSZero, .Mult, .Nsgn, .Ws);
 | 
					                          .FmaOp, .ZInf, .InfIn, .FmaSZero, .Mult, .Ms, .Ws);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ///////////////////////////////////////////////////////////////////////////////
 | 
					    ///////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
    // Flags
 | 
					    // Flags
 | 
				
			||||||
@ -218,8 +218,8 @@ module postprocess (
 | 
				
			|||||||
    flags flags(.XSNaN, .YSNaN, .ZSNaN, .XInf, .YInf, .ZInf, .InfIn, .XZero, .YZero, 
 | 
					    flags flags(.XSNaN, .YSNaN, .ZSNaN, .XInf, .YInf, .ZInf, .InfIn, .XZero, .YZero, 
 | 
				
			||||||
                .Xs, .Sqrt, .ToInt, .IntToFp, .Int64, .Signed, .OutFmt, .CvtCe,
 | 
					                .Xs, .Sqrt, .ToInt, .IntToFp, .Int64, .Signed, .OutFmt, .CvtCe,
 | 
				
			||||||
                .XNaN, .YNaN, .NaNIn, .FmaAs, .FmaPs, .R, .IntInvalid, .DivByZero,
 | 
					                .XNaN, .YNaN, .NaNIn, .FmaAs, .FmaPs, .R, .IntInvalid, .DivByZero,
 | 
				
			||||||
                .UfLSBRes, .S, .UfPlus1, .CvtOp, .DivOp, .FmaOp, .FullRe, .Plus1,
 | 
					                .UfL, .S, .UfPlus1, .CvtOp, .DivOp, .FmaOp, .FullRe, .Plus1,
 | 
				
			||||||
                .Nexp, .CvtNegResMsbs, .Invalid, .Overflow, .PostProcFlg);
 | 
					                .Me, .CvtNegResMsbs, .Invalid, .Overflow, .PostProcFlg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ///////////////////////////////////////////////////////////////////////////////
 | 
					    ///////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
    // Select the result
 | 
					    // Select the result
 | 
				
			||||||
 | 
				
			|||||||
@ -39,28 +39,25 @@ module resultsign(
 | 
				
			|||||||
    input logic         Mult,
 | 
					    input logic         Mult,
 | 
				
			||||||
    input logic         R,
 | 
					    input logic         R,
 | 
				
			||||||
    input logic         S,
 | 
					    input logic         S,
 | 
				
			||||||
    input logic         Nsgn,
 | 
					    input logic         Ms,
 | 
				
			||||||
    output logic        Ws
 | 
					    output logic        Ws
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    logic ZeroSgn;
 | 
					    logic Zeros;
 | 
				
			||||||
    logic InfSgn;
 | 
					    logic Infs;
 | 
				
			||||||
    logic Underflow;
 | 
					 | 
				
			||||||
    // logic ResultSgnTmp;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Determine the sign if the sum is zero
 | 
					    // Determine the sign if the sum is zero
 | 
				
			||||||
    //      if cancelation then 0 unless round to -infinity
 | 
					    //      if cancelation then 0 unless round to -infinity
 | 
				
			||||||
    //      if multiply then Psgn
 | 
					    //      if multiply then Psgn
 | 
				
			||||||
    //      otherwise psign
 | 
					    //      otherwise psign
 | 
				
			||||||
    assign Underflow = FmaSe[`NE+1] | ((FmaSe == 0) & (R|S));
 | 
					    assign Zeros = (FmaPs^FmaAs)&~(FmaSe[`NE+1] | ((FmaSe == 0) & (R|S)))&~Mult ? Frm[1:0] == 2'b10 : FmaPs;
 | 
				
			||||||
    assign ZeroSgn = (FmaPs^FmaAs)&~Underflow&~Mult ? Frm[1:0] == 2'b10 : FmaPs;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // is the result negitive
 | 
					    // is the result negitive
 | 
				
			||||||
    //  if p - z is the Sum negitive
 | 
					    //  if p - z is the Sum negitive
 | 
				
			||||||
    //  if -p + z is the Sum positive
 | 
					    //  if -p + z is the Sum positive
 | 
				
			||||||
    //  if -p - z then the Sum is negitive
 | 
					    //  if -p - z then the Sum is negitive
 | 
				
			||||||
    assign InfSgn = ZInf ? FmaAs : FmaPs;
 | 
					    assign Infs = ZInf ? FmaAs : FmaPs;
 | 
				
			||||||
    assign Ws = InfIn&FmaOp ? InfSgn : FmaSZero&FmaOp ? ZeroSgn : Nsgn;
 | 
					    assign Ws = InfIn&FmaOp ? Infs : FmaSZero&FmaOp ? Zeros : Ms;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
endmodule
 | 
					endmodule
 | 
				
			||||||
@ -46,29 +46,29 @@ module round(
 | 
				
			|||||||
    input logic  [1:0]              PostProcSel,
 | 
					    input logic  [1:0]              PostProcSel,
 | 
				
			||||||
    input logic                     CvtResDenormUf,
 | 
					    input logic                     CvtResDenormUf,
 | 
				
			||||||
    input logic                     CvtResUf,
 | 
					    input logic                     CvtResUf,
 | 
				
			||||||
    input logic  [`CORRSHIFTSZ-1:0] Nfrac,
 | 
					    input logic  [`CORRSHIFTSZ-1:0] Mf,
 | 
				
			||||||
    input logic                     FmaZmSticky,  // addend's sticky bit
 | 
					    input logic                     FmaZmS,  // addend's sticky bit
 | 
				
			||||||
    input logic  [`NE+1:0]          FmaSe,         // exponent of the normalized sum
 | 
					    input logic  [`NE+1:0]          FmaSe,         // exponent of the normalized sum
 | 
				
			||||||
    input logic                     Nsgn,      // the result's sign
 | 
					    input logic                     Ms,      // the result's sign
 | 
				
			||||||
    input logic  [`NE:0]            CvtCe,    // the calculated expoent
 | 
					    input logic  [`NE:0]            CvtCe,    // the calculated expoent
 | 
				
			||||||
    input logic  [`NE+1:0]          DivCorrExp,    // the calculated expoent
 | 
					    input logic  [`NE+1:0]          Qe,    // the calculated expoent
 | 
				
			||||||
    input logic                     DivSticky,             // sticky bit
 | 
					    input logic                     DivS,             // sticky bit
 | 
				
			||||||
    output logic                    UfPlus1,  // do you add or subtract on from the result
 | 
					    output logic                    UfPlus1,  // do you add or subtract on from the result
 | 
				
			||||||
    output logic [`NE+1:0]          FullRe,      // Re with bits to determine sign and overflow
 | 
					    output logic [`NE+1:0]          FullRe,      // Re with bits to determine sign and overflow
 | 
				
			||||||
    output logic [`NF-1:0]          Rf,         // Result fraction
 | 
					    output logic [`NF-1:0]          Rf,         // Result fraction
 | 
				
			||||||
    output logic [`NE-1:0]          Re,          // Result exponent
 | 
					    output logic [`NE-1:0]          Re,          // Result exponent
 | 
				
			||||||
    output logic                    S,             // sticky bit
 | 
					    output logic                    S,             // sticky bit
 | 
				
			||||||
    output logic [`NE+1:0]          Nexp,
 | 
					    output logic [`NE+1:0]          Me,
 | 
				
			||||||
    output logic                    Plus1,
 | 
					    output logic                    Plus1,
 | 
				
			||||||
    output logic                    R, UfLSBRes // bits needed to calculate rounding
 | 
					    output logic                    R, UfL // bits needed to calculate rounding
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
    logic           LSBRes;         // bit used for rounding - least significant bit of the normalized sum
 | 
					    logic           L;         // bit used for rounding - least significant bit of the normalized sum
 | 
				
			||||||
    logic           UfCalcPlus1; 
 | 
					    logic           UfCalcPlus1; 
 | 
				
			||||||
    logic           NormSumSticky;  // normalized sum's sticky bit
 | 
					    logic           NormS;  // normalized sum's sticky bit
 | 
				
			||||||
    logic           UfSticky;   // sticky bit for underlow calculation
 | 
					    logic           UfS;   // sticky bit for underlow calculation
 | 
				
			||||||
    logic [`NF-1:0] RoundFrac;
 | 
					    logic [`NF-1:0] RoundFrac;
 | 
				
			||||||
    logic           FpRes, IntRes;
 | 
					    logic           FpRes, IntRes;
 | 
				
			||||||
    logic           UfRound;
 | 
					    logic           UfR;
 | 
				
			||||||
    logic           FpRound, FpLSBRes, FpUfRound;
 | 
					    logic           FpRound, FpLSBRes, FpUfRound;
 | 
				
			||||||
    logic           CalcPlus1, FpPlus1;
 | 
					    logic           CalcPlus1, FpPlus1;
 | 
				
			||||||
    logic [`FLEN:0] RoundAdd;           // how much to add to the result
 | 
					    logic [`FLEN:0] RoundAdd;           // how much to add to the result
 | 
				
			||||||
@ -114,61 +114,61 @@ module round(
 | 
				
			|||||||
    //      |    NF     |1|1|
 | 
					    //      |    NF     |1|1|
 | 
				
			||||||
    //                     ^    ^ if floating point result
 | 
					    //                     ^    ^ if floating point result
 | 
				
			||||||
    //                     ^ if not an FMA result
 | 
					    //                     ^ if not an FMA result
 | 
				
			||||||
        if (`XLENPOS == 1)assign NormSumSticky = (|Nfrac[`CORRSHIFTSZ-`NF-2:`CORRSHIFTSZ-`XLEN-1]&FpRes) |
 | 
					        if (`XLENPOS == 1)assign NormS = (|Mf[`CORRSHIFTSZ-`NF-2:`CORRSHIFTSZ-`XLEN-1]&FpRes) |
 | 
				
			||||||
                                                 (|Nfrac[`CORRSHIFTSZ-`XLEN-2:0]);
 | 
					                                                 (|Mf[`CORRSHIFTSZ-`XLEN-2:0]);
 | 
				
			||||||
    //     2: NF > XLEN
 | 
					    //     2: NF > XLEN
 | 
				
			||||||
        if (`XLENPOS == 2)assign NormSumSticky = (|Nfrac[`CORRSHIFTSZ-`XLEN-2:`CORRSHIFTSZ-`NF-1]&IntRes) |
 | 
					        if (`XLENPOS == 2)assign NormS = (|Mf[`CORRSHIFTSZ-`XLEN-2:`CORRSHIFTSZ-`NF-1]&IntRes) |
 | 
				
			||||||
                                                 (|Nfrac[`CORRSHIFTSZ-`NF-2:0]);
 | 
					                                                 (|Mf[`CORRSHIFTSZ-`NF-2:0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    end else if (`FPSIZES == 2) begin
 | 
					    end else if (`FPSIZES == 2) begin
 | 
				
			||||||
        // XLEN is either 64 or 32
 | 
					        // XLEN is either 64 or 32
 | 
				
			||||||
        // so half and single are always smaller then XLEN
 | 
					        // so half and single are always smaller then XLEN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 1: XLEN > NF   > NF1
 | 
					        // 1: XLEN > NF   > NF1
 | 
				
			||||||
        if (`XLENPOS == 1) assign NormSumSticky = (|Nfrac[`CORRSHIFTSZ-`NF1-2:`CORRSHIFTSZ-`NF-1]&FpRes&~OutFmt) |
 | 
					        if (`XLENPOS == 1) assign NormS = (|Mf[`CORRSHIFTSZ-`NF1-2:`CORRSHIFTSZ-`NF-1]&FpRes&~OutFmt) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`NF-2:`CORRSHIFTSZ-`XLEN-1]&FpRes) |
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`NF-2:`CORRSHIFTSZ-`XLEN-1]&FpRes) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`XLEN-2:0]);
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`XLEN-2:0]);
 | 
				
			||||||
        // 2: NF   > XLEN > NF1
 | 
					        // 2: NF   > XLEN > NF1
 | 
				
			||||||
        if (`XLENPOS == 2) assign NormSumSticky = (|Nfrac[`CORRSHIFTSZ-`NF1-2:`CORRSHIFTSZ-`XLEN-1]&FpRes&~OutFmt) | 
 | 
					        if (`XLENPOS == 2) assign NormS = (|Mf[`CORRSHIFTSZ-`NF1-2:`CORRSHIFTSZ-`XLEN-1]&FpRes&~OutFmt) | 
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`XLEN-2:`CORRSHIFTSZ-`NF-1]&(IntRes|~OutFmt)) |
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`XLEN-2:`CORRSHIFTSZ-`NF-1]&(IntRes|~OutFmt)) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`NF-2:0]);
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`NF-2:0]);
 | 
				
			||||||
        // 3: NF   > NF1  > XLEN
 | 
					        // 3: NF   > NF1  > XLEN
 | 
				
			||||||
        if (`XLENPOS == 3) assign NormSumSticky = (|Nfrac[`CORRSHIFTSZ-`XLEN-2:`CORRSHIFTSZ-`NF1-1]&IntRes) |
 | 
					        if (`XLENPOS == 3) assign NormS = (|Mf[`CORRSHIFTSZ-`XLEN-2:`CORRSHIFTSZ-`NF1-1]&IntRes) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`NF1-2:`CORRSHIFTSZ-`NF-1]&(~OutFmt|IntRes)) |
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`NF1-2:`CORRSHIFTSZ-`NF-1]&(~OutFmt|IntRes)) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`NF-2:0]);
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`NF-2:0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    end else if (`FPSIZES == 3) begin
 | 
					    end else if (`FPSIZES == 3) begin
 | 
				
			||||||
        // 1: XLEN > NF   > NF1
 | 
					        // 1: XLEN > NF   > NF1
 | 
				
			||||||
        if (`XLENPOS == 1) assign NormSumSticky = (|Nfrac[`CORRSHIFTSZ-`NF2-2:`CORRSHIFTSZ-`NF1-1]&FpRes&(OutFmt==`FMT1)) |
 | 
					        if (`XLENPOS == 1) assign NormS = (|Mf[`CORRSHIFTSZ-`NF2-2:`CORRSHIFTSZ-`NF1-1]&FpRes&(OutFmt==`FMT1)) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`NF1-2:`CORRSHIFTSZ-`NF-1]&FpRes&~(OutFmt==`FMT)) |
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`NF1-2:`CORRSHIFTSZ-`NF-1]&FpRes&~(OutFmt==`FMT)) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`NF-2:`CORRSHIFTSZ-`XLEN-1]&FpRes) |
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`NF-2:`CORRSHIFTSZ-`XLEN-1]&FpRes) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`XLEN-2:0]);
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`XLEN-2:0]);
 | 
				
			||||||
        // 2: NF   > XLEN > NF1
 | 
					        // 2: NF   > XLEN > NF1
 | 
				
			||||||
        if (`XLENPOS == 2) assign NormSumSticky = (|Nfrac[`CORRSHIFTSZ-`NF2-2:`CORRSHIFTSZ-`NF1-1]&FpRes&(OutFmt==`FMT1)) |
 | 
					        if (`XLENPOS == 2) assign NormS = (|Mf[`CORRSHIFTSZ-`NF2-2:`CORRSHIFTSZ-`NF1-1]&FpRes&(OutFmt==`FMT1)) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`NF1-2:`CORRSHIFTSZ-`XLEN-1]&FpRes&~(OutFmt==`FMT)) | 
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`NF1-2:`CORRSHIFTSZ-`XLEN-1]&FpRes&~(OutFmt==`FMT)) | 
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`XLEN-2:`CORRSHIFTSZ-`NF-1]&(IntRes|~(OutFmt==`FMT))) |
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`XLEN-2:`CORRSHIFTSZ-`NF-1]&(IntRes|~(OutFmt==`FMT))) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`NF-2:0]);
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`NF-2:0]);
 | 
				
			||||||
        // 3: NF   > NF1  > XLEN
 | 
					        // 3: NF   > NF1  > XLEN
 | 
				
			||||||
        if (`XLENPOS == 3) assign NormSumSticky = (|Nfrac[`CORRSHIFTSZ-`NF2-2:`CORRSHIFTSZ-`XLEN-1]&FpRes&(OutFmt==`FMT1)) |
 | 
					        if (`XLENPOS == 3) assign NormS = (|Mf[`CORRSHIFTSZ-`NF2-2:`CORRSHIFTSZ-`XLEN-1]&FpRes&(OutFmt==`FMT1)) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`XLEN-2:`CORRSHIFTSZ-`NF1-1]&((OutFmt==`FMT1)|IntRes)) |
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`XLEN-2:`CORRSHIFTSZ-`NF1-1]&((OutFmt==`FMT1)|IntRes)) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`NF1-2:`CORRSHIFTSZ-`NF-1]&(~(OutFmt==`FMT)|IntRes)) |
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`NF1-2:`CORRSHIFTSZ-`NF-1]&(~(OutFmt==`FMT)|IntRes)) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`NF-2:0]);
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`NF-2:0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    end else if (`FPSIZES == 4) begin
 | 
					    end else if (`FPSIZES == 4) begin
 | 
				
			||||||
        // Quad precision will always be greater than XLEN
 | 
					        // Quad precision will always be greater than XLEN
 | 
				
			||||||
        // 2: NF   > XLEN > NF1
 | 
					        // 2: NF   > XLEN > NF1
 | 
				
			||||||
        if (`XLENPOS == 2) assign NormSumSticky = (|Nfrac[`CORRSHIFTSZ-`H_NF-2:`CORRSHIFTSZ-`S_NF-1]&FpRes&(OutFmt==`H_FMT)) |
 | 
					        if (`XLENPOS == 2) assign NormS = (|Mf[`CORRSHIFTSZ-`H_NF-2:`CORRSHIFTSZ-`S_NF-1]&FpRes&(OutFmt==`H_FMT)) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`S_NF-2:`CORRSHIFTSZ-`D_NF-1]&FpRes&((OutFmt==`S_FMT)|(OutFmt==`H_FMT))) | 
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`S_NF-2:`CORRSHIFTSZ-`D_NF-1]&FpRes&((OutFmt==`S_FMT)|(OutFmt==`H_FMT))) | 
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`D_NF-2:`CORRSHIFTSZ-`XLEN-1]&FpRes&~(OutFmt==`Q_FMT)) | 
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`D_NF-2:`CORRSHIFTSZ-`XLEN-1]&FpRes&~(OutFmt==`Q_FMT)) | 
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`XLEN-2:`CORRSHIFTSZ-`Q_NF-1]&(~(OutFmt==`Q_FMT)|IntRes)) |
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`XLEN-2:`CORRSHIFTSZ-`Q_NF-1]&(~(OutFmt==`Q_FMT)|IntRes)) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`Q_NF-2:0]);
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`Q_NF-2:0]);
 | 
				
			||||||
        // 3: NF   > NF1  > XLEN
 | 
					        // 3: NF   > NF1  > XLEN
 | 
				
			||||||
        // The extra XLEN bit will be ored later when caculating the final sticky bit - the ufplus1 not needed for integer
 | 
					        // The extra XLEN bit will be ored later when caculating the final sticky bit - the ufplus1 not needed for integer
 | 
				
			||||||
        if (`XLENPOS == 3) assign NormSumSticky = (|Nfrac[`CORRSHIFTSZ-`H_NF-2:`CORRSHIFTSZ-`S_NF-1]&FpRes&(OutFmt==`H_FMT)) |
 | 
					        if (`XLENPOS == 3) assign NormS = (|Mf[`CORRSHIFTSZ-`H_NF-2:`CORRSHIFTSZ-`S_NF-1]&FpRes&(OutFmt==`H_FMT)) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`S_NF-2:`CORRSHIFTSZ-`XLEN-1]&FpRes&((OutFmt==`S_FMT)|(OutFmt==`H_FMT))) |
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`S_NF-2:`CORRSHIFTSZ-`XLEN-1]&FpRes&((OutFmt==`S_FMT)|(OutFmt==`H_FMT))) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`XLEN-2:`CORRSHIFTSZ-`D_NF-1]&((OutFmt==`S_FMT)|(OutFmt==`H_FMT)|IntRes)) |
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`XLEN-2:`CORRSHIFTSZ-`D_NF-1]&((OutFmt==`S_FMT)|(OutFmt==`H_FMT)|IntRes)) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`D_NF-2:`CORRSHIFTSZ-`Q_NF-1]&(~(OutFmt==`Q_FMT)|IntRes)) |
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`D_NF-2:`CORRSHIFTSZ-`Q_NF-1]&(~(OutFmt==`Q_FMT)|IntRes)) |
 | 
				
			||||||
                                                  (|Nfrac[`CORRSHIFTSZ-`Q_NF-2:0]);
 | 
					                                                  (|Mf[`CORRSHIFTSZ-`Q_NF-2:0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@ -176,37 +176,37 @@ module round(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // only add the Addend sticky if doing an FMA opperation
 | 
					    // only add the Addend sticky if doing an FMA opperation
 | 
				
			||||||
    //      - the shifter shifts too far left when there's an underflow (shifting out all possible sticky bits)
 | 
					    //      - the shifter shifts too far left when there's an underflow (shifting out all possible sticky bits)
 | 
				
			||||||
    assign UfSticky = FmaZmSticky&FmaOp | NormSumSticky | CvtResUf&CvtOp | FmaSe[`NE+1]&FmaOp | DivSticky&DivOp;
 | 
					    assign UfS = FmaZmS&FmaOp | NormS | CvtResUf&CvtOp | FmaSe[`NE+1]&FmaOp | DivS&DivOp;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // determine round and LSB of the rounded value
 | 
					    // determine round and LSB of the rounded value
 | 
				
			||||||
    //      - underflow round bit is used to determint the underflow flag
 | 
					    //      - underflow round bit is used to determint the underflow flag
 | 
				
			||||||
    if (`FPSIZES == 1) begin
 | 
					    if (`FPSIZES == 1) begin
 | 
				
			||||||
        assign FpRound = Nfrac[`CORRSHIFTSZ-`NF-1];
 | 
					        assign FpRound = Mf[`CORRSHIFTSZ-`NF-1];
 | 
				
			||||||
        assign FpLSBRes = Nfrac[`CORRSHIFTSZ-`NF];
 | 
					        assign FpLSBRes = Mf[`CORRSHIFTSZ-`NF];
 | 
				
			||||||
        assign FpUfRound = Nfrac[`CORRSHIFTSZ-`NF-2];
 | 
					        assign FpUfRound = Mf[`CORRSHIFTSZ-`NF-2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    end else if (`FPSIZES == 2) begin
 | 
					    end else if (`FPSIZES == 2) begin
 | 
				
			||||||
        assign FpRound = OutFmt ? Nfrac[`CORRSHIFTSZ-`NF-1] : Nfrac[`CORRSHIFTSZ-`NF1-1];
 | 
					        assign FpRound = OutFmt ? Mf[`CORRSHIFTSZ-`NF-1] : Mf[`CORRSHIFTSZ-`NF1-1];
 | 
				
			||||||
        assign FpLSBRes = OutFmt ? Nfrac[`CORRSHIFTSZ-`NF] : Nfrac[`CORRSHIFTSZ-`NF1];
 | 
					        assign FpLSBRes = OutFmt ? Mf[`CORRSHIFTSZ-`NF] : Mf[`CORRSHIFTSZ-`NF1];
 | 
				
			||||||
        assign FpUfRound = OutFmt ? Nfrac[`CORRSHIFTSZ-`NF-2] : Nfrac[`CORRSHIFTSZ-`NF1-2];
 | 
					        assign FpUfRound = OutFmt ? Mf[`CORRSHIFTSZ-`NF-2] : Mf[`CORRSHIFTSZ-`NF1-2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    end else if (`FPSIZES == 3) begin
 | 
					    end else if (`FPSIZES == 3) begin
 | 
				
			||||||
        always_comb
 | 
					        always_comb
 | 
				
			||||||
            case (OutFmt)
 | 
					            case (OutFmt)
 | 
				
			||||||
                `FMT: begin
 | 
					                `FMT: begin
 | 
				
			||||||
                    FpRound = Nfrac[`CORRSHIFTSZ-`NF-1];
 | 
					                    FpRound = Mf[`CORRSHIFTSZ-`NF-1];
 | 
				
			||||||
                    FpLSBRes = Nfrac[`CORRSHIFTSZ-`NF];
 | 
					                    FpLSBRes = Mf[`CORRSHIFTSZ-`NF];
 | 
				
			||||||
                    FpUfRound = Nfrac[`CORRSHIFTSZ-`NF-2];
 | 
					                    FpUfRound = Mf[`CORRSHIFTSZ-`NF-2];
 | 
				
			||||||
                end
 | 
					                end
 | 
				
			||||||
                `FMT1: begin
 | 
					                `FMT1: begin
 | 
				
			||||||
                    FpRound = Nfrac[`CORRSHIFTSZ-`NF1-1];
 | 
					                    FpRound = Mf[`CORRSHIFTSZ-`NF1-1];
 | 
				
			||||||
                    FpLSBRes = Nfrac[`CORRSHIFTSZ-`NF1];
 | 
					                    FpLSBRes = Mf[`CORRSHIFTSZ-`NF1];
 | 
				
			||||||
                    FpUfRound = Nfrac[`CORRSHIFTSZ-`NF1-2];
 | 
					                    FpUfRound = Mf[`CORRSHIFTSZ-`NF1-2];
 | 
				
			||||||
                end
 | 
					                end
 | 
				
			||||||
                `FMT2: begin
 | 
					                `FMT2: begin
 | 
				
			||||||
                    FpRound = Nfrac[`CORRSHIFTSZ-`NF2-1];
 | 
					                    FpRound = Mf[`CORRSHIFTSZ-`NF2-1];
 | 
				
			||||||
                    FpLSBRes = Nfrac[`CORRSHIFTSZ-`NF2];
 | 
					                    FpLSBRes = Mf[`CORRSHIFTSZ-`NF2];
 | 
				
			||||||
                    FpUfRound = Nfrac[`CORRSHIFTSZ-`NF2-2];
 | 
					                    FpUfRound = Mf[`CORRSHIFTSZ-`NF2-2];
 | 
				
			||||||
                end
 | 
					                end
 | 
				
			||||||
                default: begin
 | 
					                default: begin
 | 
				
			||||||
                    FpRound = 1'bx;
 | 
					                    FpRound = 1'bx;
 | 
				
			||||||
@ -218,55 +218,55 @@ module round(
 | 
				
			|||||||
        always_comb
 | 
					        always_comb
 | 
				
			||||||
            case (OutFmt)
 | 
					            case (OutFmt)
 | 
				
			||||||
                2'h3: begin
 | 
					                2'h3: begin
 | 
				
			||||||
                    FpRound = Nfrac[`CORRSHIFTSZ-`Q_NF-1];
 | 
					                    FpRound = Mf[`CORRSHIFTSZ-`Q_NF-1];
 | 
				
			||||||
                    FpLSBRes = Nfrac[`CORRSHIFTSZ-`Q_NF];
 | 
					                    FpLSBRes = Mf[`CORRSHIFTSZ-`Q_NF];
 | 
				
			||||||
                    FpUfRound = Nfrac[`CORRSHIFTSZ-`Q_NF-2];
 | 
					                    FpUfRound = Mf[`CORRSHIFTSZ-`Q_NF-2];
 | 
				
			||||||
                end
 | 
					                end
 | 
				
			||||||
                2'h1: begin
 | 
					                2'h1: begin
 | 
				
			||||||
                    FpRound = Nfrac[`CORRSHIFTSZ-`D_NF-1];
 | 
					                    FpRound = Mf[`CORRSHIFTSZ-`D_NF-1];
 | 
				
			||||||
                    FpLSBRes = Nfrac[`CORRSHIFTSZ-`D_NF];
 | 
					                    FpLSBRes = Mf[`CORRSHIFTSZ-`D_NF];
 | 
				
			||||||
                    FpUfRound = Nfrac[`CORRSHIFTSZ-`D_NF-2];
 | 
					                    FpUfRound = Mf[`CORRSHIFTSZ-`D_NF-2];
 | 
				
			||||||
                end
 | 
					                end
 | 
				
			||||||
                2'h0: begin
 | 
					                2'h0: begin
 | 
				
			||||||
                    FpRound = Nfrac[`CORRSHIFTSZ-`S_NF-1];
 | 
					                    FpRound = Mf[`CORRSHIFTSZ-`S_NF-1];
 | 
				
			||||||
                    FpLSBRes = Nfrac[`CORRSHIFTSZ-`S_NF];
 | 
					                    FpLSBRes = Mf[`CORRSHIFTSZ-`S_NF];
 | 
				
			||||||
                    FpUfRound = Nfrac[`CORRSHIFTSZ-`S_NF-2];
 | 
					                    FpUfRound = Mf[`CORRSHIFTSZ-`S_NF-2];
 | 
				
			||||||
                end
 | 
					                end
 | 
				
			||||||
                2'h2: begin
 | 
					                2'h2: begin
 | 
				
			||||||
                    FpRound = Nfrac[`CORRSHIFTSZ-`H_NF-1];
 | 
					                    FpRound = Mf[`CORRSHIFTSZ-`H_NF-1];
 | 
				
			||||||
                    FpLSBRes = Nfrac[`CORRSHIFTSZ-`H_NF];
 | 
					                    FpLSBRes = Mf[`CORRSHIFTSZ-`H_NF];
 | 
				
			||||||
                    FpUfRound = Nfrac[`CORRSHIFTSZ-`H_NF-2];
 | 
					                    FpUfRound = Mf[`CORRSHIFTSZ-`H_NF-2];
 | 
				
			||||||
                end
 | 
					                end
 | 
				
			||||||
            endcase
 | 
					            endcase
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assign R = ToInt&CvtOp ? Nfrac[`CORRSHIFTSZ-`XLEN-1] : FpRound;
 | 
					    assign R = ToInt&CvtOp ? Mf[`CORRSHIFTSZ-`XLEN-1] : FpRound;
 | 
				
			||||||
    assign LSBRes = ToInt&CvtOp ? Nfrac[`CORRSHIFTSZ-`XLEN] : FpLSBRes;
 | 
					    assign L = ToInt&CvtOp ? Mf[`CORRSHIFTSZ-`XLEN] : FpLSBRes;
 | 
				
			||||||
    assign UfRound = ToInt&CvtOp ? Nfrac[`CORRSHIFTSZ-`XLEN-2] : FpUfRound;
 | 
					    assign UfR = ToInt&CvtOp ? Mf[`CORRSHIFTSZ-`XLEN-2] : FpUfRound;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // used to determine underflow flag
 | 
					    // used to determine underflow flag
 | 
				
			||||||
    assign UfLSBRes = FpRound;
 | 
					    assign UfL = FpRound;
 | 
				
			||||||
    // determine sticky
 | 
					    // determine sticky
 | 
				
			||||||
    assign S = UfSticky | UfRound;
 | 
					    assign S = UfS | UfR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    always_comb begin
 | 
					    always_comb begin
 | 
				
			||||||
        // Determine if you add 1
 | 
					        // Determine if you add 1
 | 
				
			||||||
        case (Frm)
 | 
					        case (Frm)
 | 
				
			||||||
            3'b000: CalcPlus1 = R & (S| LSBRes);//round to nearest even
 | 
					            3'b000: CalcPlus1 = R & (S| L);//round to nearest even
 | 
				
			||||||
            3'b001: CalcPlus1 = 0;//round to zero
 | 
					            3'b001: CalcPlus1 = 0;//round to zero
 | 
				
			||||||
            3'b010: CalcPlus1 = Nsgn;//round down
 | 
					            3'b010: CalcPlus1 = Ms;//round down
 | 
				
			||||||
            3'b011: CalcPlus1 = ~Nsgn;//round up
 | 
					            3'b011: CalcPlus1 = ~Ms;//round up
 | 
				
			||||||
            3'b100: CalcPlus1 = R;//round to nearest max magnitude
 | 
					            3'b100: CalcPlus1 = R;//round to nearest max magnitude
 | 
				
			||||||
            default: CalcPlus1 = 1'bx;
 | 
					            default: CalcPlus1 = 1'bx;
 | 
				
			||||||
        endcase
 | 
					        endcase
 | 
				
			||||||
        // Determine if you add 1 (for underflow flag)
 | 
					        // Determine if you add 1 (for underflow flag)
 | 
				
			||||||
        case (Frm)
 | 
					        case (Frm)
 | 
				
			||||||
            3'b000: UfCalcPlus1 = UfRound & (UfSticky| UfLSBRes);//round to nearest even
 | 
					            3'b000: UfCalcPlus1 = UfR & (UfS| UfL);//round to nearest even
 | 
				
			||||||
            3'b001: UfCalcPlus1 = 0;//round to zero
 | 
					            3'b001: UfCalcPlus1 = 0;//round to zero
 | 
				
			||||||
            3'b010: UfCalcPlus1 = Nsgn;//round down
 | 
					            3'b010: UfCalcPlus1 = Ms;//round down
 | 
				
			||||||
            3'b011: UfCalcPlus1 = ~Nsgn;//round up
 | 
					            3'b011: UfCalcPlus1 = ~Ms;//round up
 | 
				
			||||||
            3'b100: UfCalcPlus1 = UfRound;//round to nearest max magnitude
 | 
					            3'b100: UfCalcPlus1 = UfR;//round to nearest max magnitude
 | 
				
			||||||
            default: UfCalcPlus1 = 1'bx;
 | 
					            default: UfCalcPlus1 = 1'bx;
 | 
				
			||||||
        endcase
 | 
					        endcase
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
@ -275,7 +275,7 @@ module round(
 | 
				
			|||||||
    // If an answer is exact don't round
 | 
					    // If an answer is exact don't round
 | 
				
			||||||
    assign Plus1 = CalcPlus1 & (S | R);
 | 
					    assign Plus1 = CalcPlus1 & (S | R);
 | 
				
			||||||
    assign FpPlus1 = Plus1&~(ToInt&CvtOp);
 | 
					    assign FpPlus1 = Plus1&~(ToInt&CvtOp);
 | 
				
			||||||
    assign UfPlus1 = UfCalcPlus1 & S; // UfRound is part of sticky
 | 
					    assign UfPlus1 = UfCalcPlus1 & S; // UfR is part of sticky
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Compute rounded result
 | 
					    // Compute rounded result
 | 
				
			||||||
    if (`FPSIZES == 1) begin
 | 
					    if (`FPSIZES == 1) begin
 | 
				
			||||||
@ -295,19 +295,19 @@ module round(
 | 
				
			|||||||
        assign RoundAdd = {(`Q_NE+1+`H_NF)'(0), FpPlus1&(OutFmt==`H_FMT), (`S_NF-`H_NF-1)'(0), FpPlus1&(OutFmt==`S_FMT), (`D_NF-`S_NF-1)'(0), FpPlus1&(OutFmt==`D_FMT), (`Q_NF-`D_NF-1)'(0), FpPlus1&(OutFmt==`Q_FMT)};
 | 
					        assign RoundAdd = {(`Q_NE+1+`H_NF)'(0), FpPlus1&(OutFmt==`H_FMT), (`S_NF-`H_NF-1)'(0), FpPlus1&(OutFmt==`S_FMT), (`D_NF-`S_NF-1)'(0), FpPlus1&(OutFmt==`D_FMT), (`Q_NF-`D_NF-1)'(0), FpPlus1&(OutFmt==`Q_FMT)};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // determine the result to be roundned
 | 
					    // determine the result to be roundned
 | 
				
			||||||
    assign RoundFrac = Nfrac[`CORRSHIFTSZ-1:`CORRSHIFTSZ-`NF];
 | 
					    assign RoundFrac = Mf[`CORRSHIFTSZ-1:`CORRSHIFTSZ-`NF];
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    always_comb
 | 
					    always_comb
 | 
				
			||||||
        case(PostProcSel)
 | 
					        case(PostProcSel)
 | 
				
			||||||
            2'b10: Nexp = FmaSe; // fma
 | 
					            2'b10: Me = FmaSe; // fma
 | 
				
			||||||
            2'b00: Nexp = {CvtCe[`NE], CvtCe}&{`NE+2{~CvtResDenormUf|CvtResUf}}; // cvt
 | 
					            2'b00: Me = {CvtCe[`NE], CvtCe}&{`NE+2{~CvtResDenormUf|CvtResUf}}; // cvt
 | 
				
			||||||
            2'b01: Nexp = DivDone ? DivCorrExp : '0; // divide
 | 
					            2'b01: Me = DivDone ? Qe : '0; // divide
 | 
				
			||||||
            default: Nexp = '0; 
 | 
					            default: Me = '0; 
 | 
				
			||||||
        endcase
 | 
					        endcase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // round the result
 | 
					    // round the result
 | 
				
			||||||
    //      - if the fraction overflows one should be added to the exponent
 | 
					    //      - if the fraction overflows one should be added to the exponent
 | 
				
			||||||
    assign {FullRe, Rf} = {Nexp, RoundFrac} + RoundAdd;
 | 
					    assign {FullRe, Rf} = {Me, RoundFrac} + RoundAdd;
 | 
				
			||||||
    assign Re = FullRe[`NE-1:0];
 | 
					    assign Re = FullRe[`NE-1:0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -38,11 +38,11 @@ module roundsign(
 | 
				
			|||||||
    input logic         DivOp,
 | 
					    input logic         DivOp,
 | 
				
			||||||
    input logic         CvtOp,
 | 
					    input logic         CvtOp,
 | 
				
			||||||
    input logic         CvtCs,
 | 
					    input logic         CvtCs,
 | 
				
			||||||
    output logic        Nsgn
 | 
					    output logic        Ms
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    logic FmaResSgnTmp;
 | 
					    logic FmaResSgnTmp;
 | 
				
			||||||
    logic DivSgn;
 | 
					    logic Qs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // is the result negitive
 | 
					    // is the result negitive
 | 
				
			||||||
    //  if p - z is the Sum negitive
 | 
					    //  if p - z is the Sum negitive
 | 
				
			||||||
@ -52,9 +52,9 @@ module roundsign(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // assign FmaResSgnTmp = FmaInvA&(FmaAs)&FmaNegSum | FmaInvA&FmaPs&~FmaNegSum | (FmaAs&FmaPs);
 | 
					    // assign FmaResSgnTmp = FmaInvA&(FmaAs)&FmaNegSum | FmaInvA&FmaPs&~FmaNegSum | (FmaAs&FmaPs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assign DivSgn = Xs^Ys;
 | 
					    assign Qs = Xs^Ys;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Sign for rounding calulation
 | 
					    // Sign for rounding calulation
 | 
				
			||||||
    assign Nsgn = (FmaResSgnTmp&FmaOp) | (CvtCs&CvtOp) | (DivSgn&DivOp);
 | 
					    assign Ms = (FmaResSgnTmp&FmaOp) | (CvtCs&CvtOp) | (Qs&DivOp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
endmodule
 | 
					endmodule
 | 
				
			||||||
@ -33,13 +33,13 @@ module shiftcorrection(
 | 
				
			|||||||
    input logic                     FmaOp,
 | 
					    input logic                     FmaOp,
 | 
				
			||||||
    input logic                     DivOp,
 | 
					    input logic                     DivOp,
 | 
				
			||||||
    input logic                     DivResDenorm,
 | 
					    input logic                     DivResDenorm,
 | 
				
			||||||
    input logic  [`NE+1:0]          DivCalcExp,
 | 
					    input logic  [`NE+1:0]          DivQe,
 | 
				
			||||||
    input logic  [`NE+1:0]          DivDenormShift,
 | 
					    input logic  [`NE+1:0]          DivDenormShift,
 | 
				
			||||||
    input logic  [`NE+1:0]          FmaConvNormSumExp,          // exponent of the normalized sum not taking into account denormal or zero results
 | 
					    input logic  [`NE+1:0]          FmaNe,          // exponent of the normalized sum not taking into account denormal or zero results
 | 
				
			||||||
    input logic                     FmaPreResultDenorm,    // is the result denormalized - calculated before LZA corection
 | 
					    input logic                     FmaPreResultDenorm,    // is the result denormalized - calculated before LZA corection
 | 
				
			||||||
    input logic                     FmaSZero,
 | 
					    input logic                     FmaSZero,
 | 
				
			||||||
    output logic [`CORRSHIFTSZ-1:0] Nfrac,         // the shifted sum before LZA correction
 | 
					    output logic [`CORRSHIFTSZ-1:0] Mf,         // the shifted sum before LZA correction
 | 
				
			||||||
    output logic [`NE+1:0]          DivCorrExp,
 | 
					    output logic [`NE+1:0]          Qe,
 | 
				
			||||||
    output logic [`NE+1:0]          FmaSe         // exponent of the normalized sum
 | 
					    output logic [`NE+1:0]          FmaSe         // exponent of the normalized sum
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
    logic [3*`NF+5:0]      CorrSumShifted;     // the shifted sum after LZA correction
 | 
					    logic [3*`NF+5:0]      CorrSumShifted;     // the shifted sum after LZA correction
 | 
				
			||||||
@ -53,16 +53,16 @@ module shiftcorrection(
 | 
				
			|||||||
	// the only possible mantissa for a plus two is all zeroes - a one has to propigate all the way through a sum. so we can leave the bottom statement alone
 | 
						// the only possible mantissa for a plus two is all zeroes - a one has to propigate all the way through a sum. so we can leave the bottom statement alone
 | 
				
			||||||
    assign CorrSumShifted =  LZAPlus1 ? Shifted[`NORMSHIFTSZ-3:1] : Shifted[`NORMSHIFTSZ-4:0];
 | 
					    assign CorrSumShifted =  LZAPlus1 ? Shifted[`NORMSHIFTSZ-3:1] : Shifted[`NORMSHIFTSZ-4:0];
 | 
				
			||||||
    //                        if the msb is 1 or the exponent was one, but the shifted quotent was < 1 (Denorm)
 | 
					    //                        if the msb is 1 or the exponent was one, but the shifted quotent was < 1 (Denorm)
 | 
				
			||||||
    assign CorrQuotShifted = (LZAPlus2|(DivCalcExp==1&~LZAPlus2)) ? Shifted[`NORMSHIFTSZ-2:`NORMSHIFTSZ-`CORRSHIFTSZ-1] : Shifted[`NORMSHIFTSZ-3:`NORMSHIFTSZ-`CORRSHIFTSZ-2];
 | 
					    assign CorrQuotShifted = (LZAPlus2|(DivQe==1&~LZAPlus2)) ? Shifted[`NORMSHIFTSZ-2:`NORMSHIFTSZ-`CORRSHIFTSZ-1] : Shifted[`NORMSHIFTSZ-3:`NORMSHIFTSZ-`CORRSHIFTSZ-2];
 | 
				
			||||||
    // if the result of the divider was calculated to be denormalized, then the result was correctly normalized, so select the top shifted bits
 | 
					    // if the result of the divider was calculated to be denormalized, then the result was correctly normalized, so select the top shifted bits
 | 
				
			||||||
    assign Nfrac = FmaOp ? {CorrSumShifted, {`CORRSHIFTSZ-(3*`NF+6){1'b0}}} : DivOp&~DivResDenorm ? CorrQuotShifted : Shifted[`NORMSHIFTSZ-1:`NORMSHIFTSZ-`CORRSHIFTSZ];
 | 
					    assign Mf = FmaOp ? {CorrSumShifted, {`CORRSHIFTSZ-(3*`NF+6){1'b0}}} : DivOp&~DivResDenorm ? CorrQuotShifted : Shifted[`NORMSHIFTSZ-1:`NORMSHIFTSZ-`CORRSHIFTSZ];
 | 
				
			||||||
    // Determine sum's exponent
 | 
					    // Determine sum's exponent
 | 
				
			||||||
    //                          if plus1                     If plus2                                      if said denorm but norm plus 1           if said denorm but norm plus 2
 | 
					    //                          if plus1                     If plus2                                      if said denorm but norm plus 1           if said denorm but norm plus 2
 | 
				
			||||||
    assign FmaSe = (FmaConvNormSumExp+{{`NE+1{1'b0}}, LZAPlus1}+{{`NE{1'b0}}, LZAPlus2, 1'b0}+{{`NE+1{1'b0}}, ~ResDenorm&FmaPreResultDenorm}+{{`NE+1{1'b0}}, &FmaConvNormSumExp&Shifted[3*`NF+6]}) & {`NE+2{~(FmaSZero|ResDenorm)}};
 | 
					    assign FmaSe = (FmaNe+{{`NE+1{1'b0}}, LZAPlus1}+{{`NE{1'b0}}, LZAPlus2, 1'b0}+{{`NE+1{1'b0}}, ~ResDenorm&FmaPreResultDenorm}+{{`NE+1{1'b0}}, &FmaNe&Shifted[3*`NF+6]}) & {`NE+2{~(FmaSZero|ResDenorm)}};
 | 
				
			||||||
    // recalculate if the result is denormalized
 | 
					    // recalculate if the result is denormalized
 | 
				
			||||||
    assign ResDenorm = FmaPreResultDenorm&~Shifted[`NORMSHIFTSZ-3]&~Shifted[`NORMSHIFTSZ-2];
 | 
					    assign ResDenorm = FmaPreResultDenorm&~Shifted[`NORMSHIFTSZ-3]&~Shifted[`NORMSHIFTSZ-2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // the quotent is in the range [.5,2) if there is no early termination
 | 
					    // the quotent is in the range [.5,2) if there is no early termination
 | 
				
			||||||
    // if the quotent < 1 and not denormal then subtract 1 to account for the normalization shift
 | 
					    // if the quotent < 1 and not denormal then subtract 1 to account for the normalization shift
 | 
				
			||||||
    assign DivCorrExp = ((DivResDenorm)&~DivDenormShift[`NE+1]) ? (`NE+2)'(0) : DivCalcExp - {(`NE+1)'(0), ~LZAPlus2};
 | 
					    assign Qe = ((DivResDenorm)&~DivDenormShift[`NE+1]) ? (`NE+2)'(0) : DivQe - {(`NE+1)'(0), ~LZAPlus2};
 | 
				
			||||||
endmodule
 | 
					endmodule
 | 
				
			||||||
@ -679,13 +679,13 @@ module testbenchfp;
 | 
				
			|||||||
          .Pe, .ZmSticky, .KillProd); 
 | 
					          .Pe, .ZmSticky, .KillProd); 
 | 
				
			||||||
              
 | 
					              
 | 
				
			||||||
  postprocess postprocess(.Xs(XSgn), .Ys(YSgn), .PostProcSel(UnitVal[1:0]),
 | 
					  postprocess postprocess(.Xs(XSgn), .Ys(YSgn), .PostProcSel(UnitVal[1:0]),
 | 
				
			||||||
              .Ze(ZExp),  .ZDenorm(ZDenorm), .FOpCtrl(OpCtrlVal), .Quot, .DivCalcExp(DivCalcExp),
 | 
					              .Ze(ZExp),  .ZDenorm(ZDenorm), .FOpCtrl(OpCtrlVal), .DivQm(Quot), .DivQe(DivCalcExp),
 | 
				
			||||||
              .Xm(XMan), .Ym(YMan), .Zm(ZMan), .CvtCe(CvtCalcExpE), .DivSticky(DivSticky),
 | 
					              .Xm(XMan), .Ym(YMan), .Zm(ZMan), .CvtCe(CvtCalcExpE), .DivS(DivSticky),
 | 
				
			||||||
              .XNaN(XNaN), .YNaN(YNaN), .ZNaN(ZNaN), .CvtResDenormUf(CvtResDenormUfE),
 | 
					              .XNaN(XNaN), .YNaN(YNaN), .ZNaN(ZNaN), .CvtResDenormUf(CvtResDenormUfE),
 | 
				
			||||||
              .XZero(XZero), .YZero(YZero), .ZZero(ZZero), .CvtShiftAmt(CvtShiftAmtE),
 | 
					              .XZero(XZero), .YZero(YZero), .ZZero(ZZero), .CvtShiftAmt(CvtShiftAmtE),
 | 
				
			||||||
              .XInf(XInf), .YInf(YInf), .ZInf(ZInf), .CvtCs(CvtResSgnE), .ToInt(WriteIntVal),
 | 
					              .XInf(XInf), .YInf(YInf), .ZInf(ZInf), .CvtCs(CvtResSgnE), .ToInt(WriteIntVal),
 | 
				
			||||||
              .XSNaN(XSNaN), .YSNaN(YSNaN), .ZSNaN(ZSNaN), .CvtLzcIn(CvtLzcInE), .IntZero,
 | 
					              .XSNaN(XSNaN), .YSNaN(YSNaN), .ZSNaN(ZSNaN), .CvtLzcIn(CvtLzcInE), .IntZero,
 | 
				
			||||||
              .FmaKillProd(KillProd), .FmaZmSticky(ZmSticky), .FmaPe(Pe), .DivDone,
 | 
					              .FmaKillProd(KillProd), .FmaZmS(ZmSticky), .FmaPe(Pe), .DivDone,
 | 
				
			||||||
              .FmaSm(Sm), .FmaNegSum(NegSum), .FmaInvA(InvA), .FmaNCnt(NCnt), .DivEarlyTermShift(EarlyTermShift), .FmaAs(As), .FmaPs(Ps), .Fmt(ModFmt), .Frm(FrmVal), 
 | 
					              .FmaSm(Sm), .FmaNegSum(NegSum), .FmaInvA(InvA), .FmaNCnt(NCnt), .DivEarlyTermShift(EarlyTermShift), .FmaAs(As), .FmaPs(Ps), .Fmt(ModFmt), .Frm(FrmVal), 
 | 
				
			||||||
              .PostProcFlg(Flg), .PostProcRes(FpRes), .FCvtIntRes(IntRes));
 | 
					              .PostProcFlg(Flg), .PostProcRes(FpRes), .FCvtIntRes(IntRes));
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user