mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Check for non-negative W in int sign handling
This commit is contained in:
parent
d41b07aa85
commit
f5cc23cae9
@ -56,7 +56,7 @@ module fdivsqrtpostproc(
|
|||||||
logic [`DIVb:0] NormQuotM;
|
logic [`DIVb:0] NormQuotM;
|
||||||
logic [`DIVb+3:0] IntQuotM, IntRemM, NormRemM;
|
logic [`DIVb+3:0] IntQuotM, IntRemM, NormRemM;
|
||||||
logic signed [`DIVb+3:0] PreResultM, PreFPIntDivResultM;
|
logic signed [`DIVb+3:0] PreResultM, PreFPIntDivResultM;
|
||||||
logic [`XLEN-1:0] W64FPIntDivResultM;
|
logic [`XLEN-1:0] SpecialFPIntDivResultM;
|
||||||
|
|
||||||
//////////////////////////
|
//////////////////////////
|
||||||
// Execute Stage: Detect early termination for an exact result
|
// Execute Stage: Detect early termination for an exact result
|
||||||
@ -113,8 +113,7 @@ module fdivsqrtpostproc(
|
|||||||
NormRemM = W;
|
NormRemM = W;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
// if (NegStickyM | weq0) begin // *** old code, replaced by the one below in the right stage and more comprehensive
|
if (NegStickyM) begin
|
||||||
if (NegStickyM | WZeroM) begin
|
|
||||||
NormQuotM = FirstUM;
|
NormQuotM = FirstUM;
|
||||||
NormRemM = -(W + DM);
|
NormRemM = -(W + DM);
|
||||||
end else begin
|
end else begin
|
||||||
@ -166,8 +165,9 @@ module fdivsqrtpostproc(
|
|||||||
// division takes the result from the next cycle, which is shifted to the left one more time so the square root also needs to be shifted
|
// division takes the result from the next cycle, which is shifted to the left one more time so the square root also needs to be shifted
|
||||||
|
|
||||||
assign PreFPIntDivResultM = $signed(PreResultM >>> NormShiftM);
|
assign PreFPIntDivResultM = $signed(PreResultM >>> NormShiftM);
|
||||||
assign W64FPIntDivResultM = (W64M ? {{(`XLEN-32){PreFPIntDivResultM[31]}}, PreFPIntDivResultM[31:0]} : PreFPIntDivResultM[`XLEN-1:0]); // Sign extending in case of W64
|
assign SpecialFPIntDivResultM = BZeroM ? (RemOpM ? ForwardedSrcAM : {(`XLEN){1'b1}}) : PreFPIntDivResultM[`XLEN-1:0]; // special cases
|
||||||
assign FPIntDivResultM = BZeroM ? (RemOpM ? ForwardedSrcAM : {(`XLEN){1'b1}}) : W64FPIntDivResultM; // special cases
|
// *** conditional on RV64
|
||||||
|
assign FPIntDivResultM = (W64M ? {{(`XLEN-32){SpecialFPIntDivResultM[31]}}, SpecialFPIntDivResultM[31:0]} : SpecialFPIntDivResultM[`XLEN-1:0]); // Sign extending in case of W64
|
||||||
|
|
||||||
assign PreQmM = NegStickyM ? FirstUM : FirstU; // Select U or U-1 depending on negative sticky bit
|
assign PreQmM = NegStickyM ? FirstUM : FirstU; // Select U or U-1 depending on negative sticky bit
|
||||||
assign QmM = SqrtM ? (PreQmM << 1) : PreQmM;
|
assign QmM = SqrtM ? (PreQmM << 1) : PreQmM;
|
||||||
|
@ -69,6 +69,7 @@ module fdivsqrtpreproc (
|
|||||||
// ***can probably merge X LZC with conversion
|
// ***can probably merge X LZC with conversion
|
||||||
// cout the number of leading zeros
|
// cout the number of leading zeros
|
||||||
|
|
||||||
|
// *** W64 muxes conditional on RV64
|
||||||
assign AsE = ~Funct3E[0] & (W64E ? ForwardedSrcAE[31] : ForwardedSrcAE[`XLEN-1]);
|
assign AsE = ~Funct3E[0] & (W64E ? ForwardedSrcAE[31] : ForwardedSrcAE[`XLEN-1]);
|
||||||
assign BsE = ~Funct3E[0] & (W64E ? ForwardedSrcBE[31] : ForwardedSrcBE[`XLEN-1]);
|
assign BsE = ~Funct3E[0] & (W64E ? ForwardedSrcBE[31] : ForwardedSrcBE[`XLEN-1]);
|
||||||
assign A64 = W64E ? {{(`XLEN-32){AsE}}, ForwardedSrcAE[31:0]} : ForwardedSrcAE;
|
assign A64 = W64E ? {{(`XLEN-32){AsE}}, ForwardedSrcAE[31:0]} : ForwardedSrcAE;
|
||||||
|
Loading…
Reference in New Issue
Block a user