mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Added SpecialCaseReg to hold SpecialCase for fdivsqrtpostproc
This commit is contained in:
parent
437fd52bf6
commit
b21e36a788
@ -61,7 +61,7 @@ module fdivsqrt(
|
|||||||
logic [`DIVb+1:0] FirstC;
|
logic [`DIVb+1:0] FirstC;
|
||||||
logic Firstun;
|
logic Firstun;
|
||||||
logic WZero;
|
logic WZero;
|
||||||
logic SpecialCase;
|
logic SpecialCaseM;
|
||||||
|
|
||||||
fdivsqrtpreproc fdivsqrtpreproc(
|
fdivsqrtpreproc fdivsqrtpreproc(
|
||||||
.clk, .DivStart(DivStartE), .Xm(XmE), .QeM, .Xe(XeE), .Fmt(FmtE), .Ye(YeE),
|
.clk, .DivStart(DivStartE), .Xm(XmE), .QeM, .Xe(XeE), .Fmt(FmtE), .Ye(YeE),
|
||||||
@ -70,11 +70,11 @@ module fdivsqrt(
|
|||||||
.clk, .reset, .FmtE, .XsE, .SqrtE,
|
.clk, .reset, .FmtE, .XsE, .SqrtE,
|
||||||
.DivBusy, .DivStart(DivStartE),.StallE, .StallM, .DivDone, .XZeroE, .YZeroE,
|
.DivBusy, .DivStart(DivStartE),.StallE, .StallM, .DivDone, .XZeroE, .YZeroE,
|
||||||
.XNaNE, .YNaNE,
|
.XNaNE, .YNaNE,
|
||||||
.XInfE, .YInfE, .WZero, .SpecialCase);
|
.XInfE, .YInfE, .WZero, .SpecialCaseM);
|
||||||
fdivsqrtiter fdivsqrtiter(
|
fdivsqrtiter fdivsqrtiter(
|
||||||
.clk, .Firstun, .D, .FirstU, .FirstUM, .FirstC, .SqrtE, .SqrtM,
|
.clk, .Firstun, .D, .FirstU, .FirstUM, .FirstC, .SqrtE, .SqrtM,
|
||||||
.X,.Dpreproc, .FirstWS(WS), .FirstWC(WC), .NextWSN, .NextWCN,
|
.X,.Dpreproc, .FirstWS(WS), .FirstWC(WC), .NextWSN, .NextWCN,
|
||||||
.DivStart(DivStartE), .Xe(XeE), .Ye(YeE), .XZeroE, .YZeroE,
|
.DivStart(DivStartE), .Xe(XeE), .Ye(YeE), .XZeroE, .YZeroE,
|
||||||
.DivBusy);
|
.DivBusy);
|
||||||
fdivsqrtpostproc fdivsqrtpostproc(.WS, .WC, .D, .FirstU, .FirstUM, .FirstC, .Firstun, .SqrtM, .SpecialCase, .QmM, .WZero, .DivSM);
|
fdivsqrtpostproc fdivsqrtpostproc(.WS, .WC, .D, .FirstU, .FirstUM, .FirstC, .Firstun, .SqrtM, .SpecialCaseM, .QmM, .WZero, .DivSM);
|
||||||
endmodule
|
endmodule
|
@ -45,7 +45,7 @@ module fdivsqrtfsm(
|
|||||||
input logic WZero,
|
input logic WZero,
|
||||||
output logic DivDone,
|
output logic DivDone,
|
||||||
output logic DivBusy,
|
output logic DivBusy,
|
||||||
output logic SpecialCase
|
output logic SpecialCaseM
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef enum logic [1:0] {IDLE, BUSY, DONE} statetype;
|
typedef enum logic [1:0] {IDLE, BUSY, DONE} statetype;
|
||||||
@ -53,9 +53,12 @@ module fdivsqrtfsm(
|
|||||||
|
|
||||||
logic [`DURLEN-1:0] step;
|
logic [`DURLEN-1:0] step;
|
||||||
logic [`DURLEN-1:0] cycles;
|
logic [`DURLEN-1:0] cycles;
|
||||||
|
logic SpecialCaseE;
|
||||||
|
|
||||||
// terminate immediately on special cases
|
// terminate immediately on special cases
|
||||||
assign SpecialCase = XZeroE | (YZeroE&~SqrtE) | XInfE | YInfE | XNaNE | YNaNE | (XsE&SqrtE);
|
assign SpecialCaseE = XZeroE | (YZeroE&~SqrtE) | XInfE | YInfE | XNaNE | YNaNE | (XsE&SqrtE);
|
||||||
|
|
||||||
|
flopenr #(1) SpecialCaseReg(clk, reset, ~StallM, SpecialCaseE, SpecialCaseM);
|
||||||
|
|
||||||
// DIVN = `NF+3
|
// DIVN = `NF+3
|
||||||
// NS = NF + 1
|
// NS = NF + 1
|
||||||
@ -103,7 +106,7 @@ module fdivsqrtfsm(
|
|||||||
step <= cycles; // *** this should be adjusted to depend on the precision; sqrt should use one fewer step becasue firststep=1
|
step <= cycles; // *** this should be adjusted to depend on the precision; sqrt should use one fewer step becasue firststep=1
|
||||||
// $display("Setting Nf = %d fbits %d cycles = %d FmtE %d FPSIZES = %d Q_NF = %d num = %d denom = %d\n", Nf, fbits, cycles, FmtE, `FPSIZES, `Q_NF,
|
// $display("Setting Nf = %d fbits %d cycles = %d FmtE %d FPSIZES = %d Q_NF = %d num = %d denom = %d\n", Nf, fbits, cycles, FmtE, `FPSIZES, `Q_NF,
|
||||||
// (fbits +(`LOGR*`DIVCOPIES)-1), (`LOGR*`DIVCOPIES));
|
// (fbits +(`LOGR*`DIVCOPIES)-1), (`LOGR*`DIVCOPIES));
|
||||||
if (SpecialCase) state <= #1 DONE;
|
if (SpecialCaseE) state <= #1 DONE;
|
||||||
else state <= #1 BUSY;
|
else state <= #1 BUSY;
|
||||||
end else if (DivDone) begin
|
end else if (DivDone) begin
|
||||||
if (StallM) state <= #1 DONE;
|
if (StallM) state <= #1 DONE;
|
||||||
|
@ -37,7 +37,7 @@ module fdivsqrtpostproc(
|
|||||||
input logic [`DIVb+1:0] FirstC,
|
input logic [`DIVb+1:0] FirstC,
|
||||||
input logic Firstun,
|
input logic Firstun,
|
||||||
input logic SqrtM,
|
input logic SqrtM,
|
||||||
input logic SpecialCase,
|
input logic SpecialCaseM,
|
||||||
output logic [`DIVb:0] QmM,
|
output logic [`DIVb:0] QmM,
|
||||||
output logic WZero,
|
output logic WZero,
|
||||||
output logic DivSM
|
output logic DivSM
|
||||||
@ -65,7 +65,7 @@ module fdivsqrtpostproc(
|
|||||||
end else begin
|
end else begin
|
||||||
assign WZero = weq0;
|
assign WZero = weq0;
|
||||||
end
|
end
|
||||||
assign DivSM = ~WZero & ~(SpecialCase & SqrtM); // ***unsure why SpecialCaseM has to be gated by SqrtM, but otherwise fails regression on divide
|
assign DivSM = ~WZero & ~(SpecialCaseM & SqrtM); // ***unsure why SpecialCaseM has to be gated by SqrtM, but otherwise fails regression on divide
|
||||||
|
|
||||||
// Determine if sticky bit is negative
|
// Determine if sticky bit is negative
|
||||||
assign W = WC+WS;
|
assign W = WC+WS;
|
||||||
|
@ -61,6 +61,8 @@ module fdivsqrtpreproc (
|
|||||||
|
|
||||||
assign SqrtX = Xe[0]^XZeroCnt[0] ? {1'b0, ~XZero, PreprocX} : {~XZero, PreprocX, 1'b0};
|
assign SqrtX = Xe[0]^XZeroCnt[0] ? {1'b0, ~XZero, PreprocX} : {~XZero, PreprocX, 1'b0};
|
||||||
assign DivX = {3'b000, ~XZero, PreprocX, {`DIVb-`NF{1'b0}}};
|
assign DivX = {3'b000, ~XZero, PreprocX, {`DIVb-`NF{1'b0}}};
|
||||||
|
|
||||||
|
// *** explain why X is shifted between radices
|
||||||
if (`RADIX == 2) assign X = Sqrt ? {3'b111, SqrtX, {`DIVb-1-`NF{1'b0}}} : DivX;
|
if (`RADIX == 2) assign X = Sqrt ? {3'b111, SqrtX, {`DIVb-1-`NF{1'b0}}} : DivX;
|
||||||
else assign X = Sqrt ? {2'b11, SqrtX, {`DIVb-1-`NF{1'b0}}, 1'b0} : DivX;
|
else assign X = Sqrt ? {2'b11, SqrtX, {`DIVb-1-`NF{1'b0}}, 1'b0} : DivX;
|
||||||
assign Dpreproc = {PreprocY, {`DIVN-1-`NF{1'b0}}};
|
assign Dpreproc = {PreprocY, {`DIVN-1-`NF{1'b0}}};
|
||||||
|
@ -73,6 +73,8 @@ module divshiftcalc(
|
|||||||
assign DivDenormShiftAmt = DivDenormShiftPos ? DivDenormShift[`LOGNORMSHIFTSZ-1:0] : '0;
|
assign DivDenormShiftAmt = DivDenormShiftPos ? DivDenormShift[`LOGNORMSHIFTSZ-1:0] : '0;
|
||||||
assign DivShiftAmt = DivResDenorm ? DivDenormShiftAmt : NormShift;
|
assign DivShiftAmt = DivResDenorm ? DivDenormShiftAmt : NormShift;
|
||||||
|
|
||||||
|
// *** explain why radix 4 division needs a left shift by 1
|
||||||
|
// *** can this shift be moved into the shiftcorrection logic?
|
||||||
if (`RADIX == 4)
|
if (`RADIX == 4)
|
||||||
assign DivShiftIn = Sqrt ? {{`NF{1'b0}}, DivQm, {`NORMSHIFTSZ-`DIVb+1-`NF{1'b0}}} : {{`NF{1'b0}}, DivQm[`DIVb-1:0], {`NORMSHIFTSZ-`DIVb+2-`NF{1'b0}}};
|
assign DivShiftIn = Sqrt ? {{`NF{1'b0}}, DivQm, {`NORMSHIFTSZ-`DIVb+1-`NF{1'b0}}} : {{`NF{1'b0}}, DivQm[`DIVb-1:0], {`NORMSHIFTSZ-`DIVb+2-`NF{1'b0}}};
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user