mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Made SqrtE only true on square root so gating with ~MDUE can be removed)
This commit is contained in:
		
							parent
							
								
									f5cc23cae9
								
							
						
					
					
						commit
						ed26850439
					
				@ -167,7 +167,7 @@ module fctrl (
 | 
				
			|||||||
                    7'b0100001: ControlsD = `FCTRLW'b1_0_01_00_001_0_0_0; // fcvt.d.s
 | 
					                    7'b0100001: ControlsD = `FCTRLW'b1_0_01_00_001_0_0_0; // fcvt.d.s
 | 
				
			||||||
                    default:    ControlsD = `FCTRLW'b0_0_00_xx_0xx_0_1_0; // non-implemented instruction
 | 
					                    default:    ControlsD = `FCTRLW'b0_0_00_xx_0xx_0_1_0; // non-implemented instruction
 | 
				
			||||||
                  endcase
 | 
					                  endcase
 | 
				
			||||||
      default:      ControlsD = `FCTRLW'b0_0_00_xx_0xx_0_1_0; // non-implemented instruction
 | 
					      default:      ControlsD = `FCTRLW'b0_0_00_xx_000_0_1_0; // non-implemented instruction
 | 
				
			||||||
    endcase
 | 
					    endcase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // unswizzle control bits
 | 
					  // unswizzle control bits
 | 
				
			||||||
 | 
				
			|||||||
@ -65,7 +65,7 @@ module fdivsqrtfsm(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // terminate immediately on special cases
 | 
					  // terminate immediately on special cases
 | 
				
			||||||
  assign FSpecialCaseE = XZeroE | (YZeroE&~SqrtE) | XInfE | YInfE | XNaNE | YNaNE | (XsE&SqrtE);
 | 
					  assign FSpecialCaseE = XZeroE | (YZeroE&~SqrtE) | XInfE | YInfE | XNaNE | YNaNE | (XsE&SqrtE);
 | 
				
			||||||
  assign ISpecialCaseE = AZeroE | BZeroE;
 | 
					  assign ISpecialCaseE = AZeroE | BZeroE; // *** why is AZeroE part of this.  Should other special cases be considered?
 | 
				
			||||||
  assign SpecialCaseE  = MDUE ? ISpecialCaseE : FSpecialCaseE;
 | 
					  assign SpecialCaseE  = MDUE ? ISpecialCaseE : FSpecialCaseE;
 | 
				
			||||||
  flopenr #(1) SpecialCaseReg(clk, reset, ~StallM, SpecialCaseE, SpecialCaseM); // save SpecialCase for checking in fdivsqrtpostproc
 | 
					  flopenr #(1) SpecialCaseReg(clk, reset, ~StallM, SpecialCaseE, SpecialCaseM); // save SpecialCase for checking in fdivsqrtpostproc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -66,13 +66,16 @@ module fdivsqrtpostproc(
 | 
				
			|||||||
  aplusbeq0 #(`DIVb+4) wspluswceq0(WS, WC, weq0E);
 | 
					  aplusbeq0 #(`DIVb+4) wspluswceq0(WS, WC, weq0E);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (`RADIX == 2) begin: R2EarlyTerm
 | 
					  if (`RADIX == 2) begin: R2EarlyTerm
 | 
				
			||||||
    logic [`DIVb+3:0] FZeroE;
 | 
					    logic [`DIVb+3:0] FZeroE, FZeroSqrtE, FZeroDivE;
 | 
				
			||||||
    logic [`DIVb+2:0] FirstK;
 | 
					    logic [`DIVb+2:0] FirstK;
 | 
				
			||||||
    logic wfeq0E;
 | 
					    logic wfeq0E;
 | 
				
			||||||
    logic [`DIVb+3:0] WCF, WSF;
 | 
					    logic [`DIVb+3:0] WCF, WSF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assign FirstK = ({1'b1, FirstC} & ~({1'b1, FirstC} << 1));
 | 
					    assign FirstK = ({1'b1, FirstC} & ~({1'b1, FirstC} << 1));
 | 
				
			||||||
    assign FZeroE = (SqrtE & ~MDUE) ? {FirstUM[`DIVb], FirstUM, 2'b0} | {FirstK,1'b0} : {3'b001,D,1'b0};
 | 
					    assign FZeroSqrtE = {FirstUM[`DIVb], FirstUM, 2'b0} | {FirstK,1'b0};    // F for square root
 | 
				
			||||||
 | 
					    assign FZeroDivE =  {3'b001,D,1'b0};                                    // F for divide
 | 
				
			||||||
 | 
					    assign FZeroE = SqrtE ? FZeroSqrtE : FZeroDivE;
 | 
				
			||||||
 | 
					    // assign FZeroE = (SqrtE & ~MDUE) ? FZeroSqrtE : FZeroDivE;
 | 
				
			||||||
    csa #(`DIVb+4) fadd(WS, WC, FZeroE, 1'b0, WSF, WCF); // compute {WCF, WSF} = {WS + WC + FZero};
 | 
					    csa #(`DIVb+4) fadd(WS, WC, FZeroE, 1'b0, WSF, WCF); // compute {WCF, WSF} = {WS + WC + FZero};
 | 
				
			||||||
    aplusbeq0 #(`DIVb+4) wcfpluswsfeq0(WCF, WSF, wfeq0E);
 | 
					    aplusbeq0 #(`DIVb+4) wcfpluswsfeq0(WCF, WSF, wfeq0E);
 | 
				
			||||||
    assign WZeroE = weq0E|(wfeq0E & Firstun);
 | 
					    assign WZeroE = weq0E|(wfeq0E & Firstun);
 | 
				
			||||||
@ -94,7 +97,7 @@ module fdivsqrtpostproc(
 | 
				
			|||||||
  //  If the result is not exact, the sticky should be set
 | 
					  //  If the result is not exact, the sticky should be set
 | 
				
			||||||
  assign DivSM = ~WZeroM & ~(SpecialCaseM & SqrtM); // ***unsure why SpecialCaseM has to be gated by SqrtM, but otherwise fails regression on divide
 | 
					  assign DivSM = ~WZeroM & ~(SpecialCaseM & SqrtM); // ***unsure why SpecialCaseM has to be gated by SqrtM, but otherwise fails regression on divide
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Determine if sticky bit is negative  // *** look for ways to optimize this
 | 
					  // Determine if sticky bit is negative  // *** look for ways to optimize this.  Shift shouldn't be needed.
 | 
				
			||||||
  assign Sum = WC + WS;
 | 
					  assign Sum = WC + WS;
 | 
				
			||||||
  assign W = $signed(Sum) >>> `LOGR;
 | 
					  assign W = $signed(Sum) >>> `LOGR;
 | 
				
			||||||
  assign NegStickyM = W[`DIVb+3];
 | 
					  assign NegStickyM = W[`DIVb+3];
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user