mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
some code cleanup
This commit is contained in:
parent
b874c5c05d
commit
3dcddf8453
@ -51,7 +51,6 @@ module fma(
|
|||||||
logic [3*`NF+5:0] Am; // addend aligned's mantissa for addition in U(NF+5.2NF+1)
|
logic [3*`NF+5:0] Am; // addend aligned's mantissa for addition in U(NF+5.2NF+1)
|
||||||
logic [3*`NF+6:0] AmInv; // aligned addend's mantissa possibly inverted
|
logic [3*`NF+6:0] AmInv; // aligned addend's mantissa possibly inverted
|
||||||
logic [2*`NF+1:0] PmKilled; // the product's mantissa possibly killed
|
logic [2*`NF+1:0] PmKilled; // the product's mantissa possibly killed
|
||||||
logic [3*`NF+6:0] PreSum, NegPreSum; // positive and negitve versions of the sum
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// Calculate the product
|
// Calculate the product
|
||||||
// - When multipliying two fp numbers, add the exponents
|
// - When multipliying two fp numbers, add the exponents
|
||||||
@ -74,7 +73,7 @@ module fma(
|
|||||||
sign sign(.FOpCtrl, .Xs, .Ys, .Zs, .Ps, .As);
|
sign sign(.FOpCtrl, .Xs, .Ys, .Zs, .Ps, .As);
|
||||||
|
|
||||||
align align(.Ze, .Zm, .XZero, .YZero, .ZZero, .Xe, .Ye,
|
align align(.Ze, .Zm, .XZero, .YZero, .ZZero, .Xe, .Ye,
|
||||||
.Ps, .As, .Am, .ZmSticky, .KillProd);
|
.Am, .ZmSticky, .KillProd);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -82,7 +81,7 @@ module fma(
|
|||||||
// // Addition/LZA
|
// // Addition/LZA
|
||||||
// ///////////////////////////////////////////////////////////////////////////////
|
// ///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
add add(.Am, .Pm, .Ps, .As, .KillProd, .ZmSticky, .AmInv, .PmKilled, .NegSum, .PreSum, .NegPreSum, .InvA, .XZero, .YZero, .Sm);
|
add add(.Am, .Pm, .Ps, .As, .KillProd, .ZmSticky, .AmInv, .PmKilled, .NegSum, .InvA, .Sm);
|
||||||
|
|
||||||
loa loa(.A(AmInv+{(3*`NF+6)'(0),InvA&~((ZmSticky&~KillProd))}), .P({PmKilled, 1'b0, InvA&Ps&ZmSticky&KillProd}), .NCnt);
|
loa loa(.A(AmInv+{(3*`NF+6)'(0),InvA&~((ZmSticky&~KillProd))}), .P({PmKilled, 1'b0, InvA&Ps&ZmSticky&KillProd}), .NCnt);
|
||||||
endmodule
|
endmodule
|
||||||
@ -143,7 +142,6 @@ endmodule
|
|||||||
|
|
||||||
|
|
||||||
module align(
|
module align(
|
||||||
input logic As, Ps,
|
|
||||||
input logic [`NE-1:0] Xe, Ye, Ze, // biased exponents in B(NE.0) format
|
input logic [`NE-1:0] Xe, Ye, Ze, // biased exponents in B(NE.0) format
|
||||||
input logic [`NF:0] Zm, // significand in U(0.NF) format]
|
input logic [`NF:0] Zm, // significand in U(0.NF) format]
|
||||||
input logic XZero, YZero, ZZero, // is the input zero
|
input logic XZero, YZero, ZZero, // is the input zero
|
||||||
@ -224,14 +222,13 @@ module add(
|
|||||||
input logic Ps, As,// the product sign and the alligend addeded's sign (Modified Z sign for other opperations)
|
input logic Ps, As,// the product sign and the alligend addeded's sign (Modified Z sign for other opperations)
|
||||||
input logic KillProd, // should the product be set to 0
|
input logic KillProd, // should the product be set to 0
|
||||||
input logic ZmSticky,
|
input logic ZmSticky,
|
||||||
input logic XZero, YZero, // is the input zero
|
|
||||||
output logic [3*`NF+6:0] AmInv, // aligned addend possibly inverted
|
output logic [3*`NF+6:0] AmInv, // aligned addend possibly inverted
|
||||||
output logic [2*`NF+1:0] PmKilled, // the product's mantissa possibly killed
|
output logic [2*`NF+1:0] PmKilled, // the product's mantissa possibly killed
|
||||||
output logic NegSum, // was the sum negitive
|
output logic NegSum, // was the sum negitive
|
||||||
output logic InvA, // do you invert the aligned addend
|
output logic InvA, // do you invert the aligned addend
|
||||||
output logic [3*`NF+5:0] Sm, // the positive sum
|
output logic [3*`NF+5:0] Sm // the positive sum
|
||||||
output logic [3*`NF+6:0] PreSum, NegPreSum// possibly negitive sum
|
|
||||||
);
|
);
|
||||||
|
logic [3*`NF+6:0] PreSum, NegPreSum; // possibly negitive sum
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// Addition
|
// Addition
|
||||||
|
@ -84,7 +84,6 @@ module postprocess (
|
|||||||
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)
|
||||||
logic R; // bits needed to determine rounding
|
logic R; // bits needed to determine rounding
|
||||||
logic [`FLEN:0] RoundAdd; // how much to add to the result
|
|
||||||
logic [$clog2(`NORMSHIFTSZ)-1:0] ShiftAmt; // normalization shift count
|
logic [$clog2(`NORMSHIFTSZ)-1:0] ShiftAmt; // normalization shift count
|
||||||
logic [`NORMSHIFTSZ-1:0] ShiftIn; // is the sum zero
|
logic [`NORMSHIFTSZ-1:0] ShiftIn; // is the sum zero
|
||||||
logic [`NORMSHIFTSZ-1:0] Shifted; // the shifted result
|
logic [`NORMSHIFTSZ-1:0] Shifted; // the shifted result
|
||||||
@ -200,10 +199,10 @@ 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, .Nsgn);
|
||||||
|
|
||||||
round round(.OutFmt, .Frm, .S, .FmaZmSticky, .ZZero, .Plus1, .PostProcSel, .CvtCe, .DivCorrExp,
|
round round(.OutFmt, .Frm, .S, .FmaZmSticky, .Plus1, .PostProcSel, .CvtCe, .DivCorrExp,
|
||||||
.FmaInvA, .Nsgn, .FmaSe, .FmaOp, .CvtOp, .CvtResDenormUf, .Nfrac, .ToInt, .CvtResUf,
|
.Nsgn, .FmaSe, .FmaOp, .CvtOp, .CvtResDenormUf, .Nfrac, .ToInt, .CvtResUf,
|
||||||
.DivSticky, .DivDone,
|
.DivSticky, .DivDone,
|
||||||
.DivOp, .UfPlus1, .FullRe, .Rf, .Re, .R, .RoundAdd, .UfLSBRes, .Nexp);
|
.DivOp, .UfPlus1, .FullRe, .Rf, .Re, .R, .UfLSBRes, .Nexp);
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// Sign calculation
|
// Sign calculation
|
||||||
|
@ -48,8 +48,6 @@ module round(
|
|||||||
input logic CvtResUf,
|
input logic CvtResUf,
|
||||||
input logic [`CORRSHIFTSZ-1:0] Nfrac,
|
input logic [`CORRSHIFTSZ-1:0] Nfrac,
|
||||||
input logic FmaZmSticky, // addend's sticky bit
|
input logic FmaZmSticky, // addend's sticky bit
|
||||||
input logic ZZero, // is Z zero
|
|
||||||
input logic FmaInvA, // invert Z
|
|
||||||
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 Nsgn, // the result's sign
|
||||||
input logic [`NE:0] CvtCe, // the calculated expoent
|
input logic [`NE:0] CvtCe, // the calculated expoent
|
||||||
@ -62,11 +60,10 @@ module round(
|
|||||||
output logic S, // sticky bit
|
output logic S, // sticky bit
|
||||||
output logic [`NE+1:0] Nexp,
|
output logic [`NE+1:0] Nexp,
|
||||||
output logic Plus1,
|
output logic Plus1,
|
||||||
output logic [`FLEN:0] RoundAdd, // how much to add to the result
|
|
||||||
output logic R, UfLSBRes // bits needed to calculate rounding
|
output logic R, UfLSBRes // bits needed to calculate rounding
|
||||||
);
|
);
|
||||||
logic LSBRes; // bit used for rounding - least significant bit of the normalized sum
|
logic LSBRes; // bit used for rounding - least significant bit of the normalized sum
|
||||||
logic UfCalcPlus1, CalcMinus1, Minus1; // do you add or subtract on from the result
|
logic UfCalcPlus1;
|
||||||
logic NormSumSticky; // normalized sum's sticky bit
|
logic NormSumSticky; // normalized sum's sticky bit
|
||||||
logic UfSticky; // sticky bit for underlow calculation
|
logic UfSticky; // sticky bit for underlow calculation
|
||||||
logic [`NF-1:0] RoundFrac;
|
logic [`NF-1:0] RoundFrac;
|
||||||
@ -74,6 +71,7 @@ module round(
|
|||||||
logic UfRound;
|
logic UfRound;
|
||||||
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
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// Rounding
|
// Rounding
|
||||||
@ -288,30 +286,13 @@ module round(
|
|||||||
// | NE+2 | NF |
|
// | NE+2 | NF |
|
||||||
// '-NE+2-^----NF1----^
|
// '-NE+2-^----NF1----^
|
||||||
// `FLEN+1-`NE-2-`NF1 = FLEN-1-NE-NF1
|
// `FLEN+1-`NE-2-`NF1 = FLEN-1-NE-NF1
|
||||||
assign RoundAdd = OutFmt ? {{{`FLEN{1'b0}}}, FpPlus1} :
|
assign RoundAdd = {(`NE+1+`NF1)'(0), FpPlus1&~OutFmt, (`NF-`NF1-1)'(0), FpPlus1&OutFmt};
|
||||||
{(`NE+1+`NF1)'(0), FpPlus1, (`FLEN-1-`NE-`NF1)'(0)};
|
|
||||||
|
|
||||||
end else if (`FPSIZES == 3) begin
|
end else if (`FPSIZES == 3) begin
|
||||||
always_comb begin
|
assign RoundAdd = {(`NE+1+`NF2)'(0), FpPlus1&(OutFmt==`FMT2), (`NF1-`NF2-1)'(0), FpPlus1&(OutFmt==`FMT1), (`NF-`NF1-1)'(0), FpPlus1&(OutFmt==`FMT)};
|
||||||
case (OutFmt)
|
|
||||||
`FMT: RoundAdd = {{{`FLEN{1'b0}}}, FpPlus1};
|
|
||||||
`FMT1: RoundAdd = {(`NE+1+`NF1)'(0), FpPlus1, (`FLEN-1-`NE-`NF1)'(0)};
|
|
||||||
`FMT2: RoundAdd = {(`NE+1+`NF2)'(0), FpPlus1, (`FLEN-1-`NE-`NF2)'(0)};
|
|
||||||
default: RoundAdd = (`FLEN+1)'(0);
|
|
||||||
endcase
|
|
||||||
end
|
|
||||||
|
|
||||||
end else if (`FPSIZES == 4) begin
|
end else if (`FPSIZES == 4)
|
||||||
always_comb begin
|
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)};
|
||||||
case (OutFmt)
|
|
||||||
2'h3: RoundAdd = {{`FLEN{1'b0}}, FpPlus1};
|
|
||||||
2'h1: RoundAdd = {(`NE+1+`D_NF)'(0), FpPlus1, (`FLEN-1-`NE-`D_NF)'(0)};
|
|
||||||
2'h0: RoundAdd = {(`NE+1+`S_NF)'(0), FpPlus1, (`FLEN-1-`NE-`S_NF)'(0)};
|
|
||||||
2'h2: RoundAdd = {(`NE+1+`H_NF)'(0), FpPlus1, (`FLEN-1-`NE-`H_NF)'(0)};
|
|
||||||
endcase
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
// determine the result to be roundned
|
// determine the result to be roundned
|
||||||
assign RoundFrac = Nfrac[`CORRSHIFTSZ-1:`CORRSHIFTSZ-`NF];
|
assign RoundFrac = Nfrac[`CORRSHIFTSZ-1:`CORRSHIFTSZ-`NF];
|
||||||
|
Loading…
Reference in New Issue
Block a user