forked from Github_Repos/cvw
		
	Fixed floating Sqrt signal when floating point is disabled, causing REMU tohang during buildroot around 3.2M
This commit is contained in:
		
							parent
							
								
									c08811357c
								
							
						
					
					
						commit
						6cf73cdaee
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -9,6 +9,7 @@ __pycache__/
 | 
			
		||||
#External repos
 | 
			
		||||
addins/riscv-arch-test/Makefile.include
 | 
			
		||||
addins/riscv-tests/target
 | 
			
		||||
addins/TestFloat-3e/build/Linux-x86_64-GCC/*
 | 
			
		||||
benchmarks/embench/wally*.json
 | 
			
		||||
 | 
			
		||||
#vsim work files to ignore
 | 
			
		||||
 | 
			
		||||
@ -81,9 +81,9 @@ module fctrl (
 | 
			
		||||
                         (Fmt == 2'b10 & `ZFH_SUPPORTED) | (Fmt == 2'b11 & `Q_SUPPORTED));
 | 
			
		||||
  always_comb
 | 
			
		||||
    if (STATUS_FS == 2'b00) // FPU instructions are illegal when FPU is disabled
 | 
			
		||||
      ControlsD = `FCTRLW'b0_0_00_xx_0xx_0_1_0;
 | 
			
		||||
      ControlsD = `FCTRLW'b0_0_00_xx_000_0_1_0;
 | 
			
		||||
    else if (OpD != 7'b0000111 & OpD != 7'b0100111 & ~SupportedFmt) 
 | 
			
		||||
      ControlsD = `FCTRLW'b0_0_00_xx_0xx_0_1_0; // for anything other than loads and stores, check for supported format
 | 
			
		||||
      ControlsD = `FCTRLW'b0_0_00_xx_000_0_1_0; // for anything other than loads and stores, check for supported format
 | 
			
		||||
    else case(OpD)
 | 
			
		||||
    // FRegWrite_FWriteInt_FResSel_PostProcSel_FOpCtrl_FDivStart_IllegalFPUInstr_FCvtInt
 | 
			
		||||
      7'b0000111: case(Funct3D)
 | 
			
		||||
@ -94,7 +94,7 @@ module fctrl (
 | 
			
		||||
                             else                ControlsD = `FCTRLW'b0_0_00_xx_0xx_0_1_0; // flq not supported
 | 
			
		||||
                    3'b001:  if (`ZFH_SUPPORTED) ControlsD = `FCTRLW'b1_0_10_xx_0xx_0_0_0; // flh
 | 
			
		||||
                             else                ControlsD = `FCTRLW'b0_0_00_xx_0xx_0_1_0; // flh not supported
 | 
			
		||||
                    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
 | 
			
		||||
      7'b0100111: case(Funct3D)
 | 
			
		||||
                    3'b010:                      ControlsD = `FCTRLW'b0_0_10_xx_0xx_0_0_0; // fsw
 | 
			
		||||
@ -104,7 +104,7 @@ module fctrl (
 | 
			
		||||
                             else                ControlsD = `FCTRLW'b0_0_00_xx_0xx_0_1_0; // fsq not supported
 | 
			
		||||
                    3'b001:  if (`ZFH_SUPPORTED) ControlsD = `FCTRLW'b0_0_10_xx_0xx_0_0_0; // fsh
 | 
			
		||||
                             else                ControlsD = `FCTRLW'b0_0_00_xx_0xx_0_1_0; // fsh not supported
 | 
			
		||||
                    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
 | 
			
		||||
      7'b1000011:   ControlsD = `FCTRLW'b1_0_01_10_000_0_0_0; // fmadd
 | 
			
		||||
      7'b1000111:   ControlsD = `FCTRLW'b1_0_01_10_001_0_0_0; // fmsub
 | 
			
		||||
@ -120,23 +120,23 @@ module fctrl (
 | 
			
		||||
                                  3'b000:  ControlsD = `FCTRLW'b1_0_00_xx_000_0_0_0; // fsgnj
 | 
			
		||||
                                  3'b001:  ControlsD = `FCTRLW'b1_0_00_xx_001_0_0_0; // fsgnjn
 | 
			
		||||
                                  3'b010:  ControlsD = `FCTRLW'b1_0_00_xx_010_0_0_0; // fsgnjx
 | 
			
		||||
                                  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
 | 
			
		||||
                    7'b00101??: case(Funct3D)
 | 
			
		||||
                                  3'b000:  ControlsD = `FCTRLW'b1_0_00_xx_110_0_0_0; // fmin
 | 
			
		||||
                                  3'b001:  ControlsD = `FCTRLW'b1_0_00_xx_101_0_0_0; // fmax
 | 
			
		||||
                                  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
 | 
			
		||||
                    7'b10100??: case(Funct3D)
 | 
			
		||||
                                  3'b010:  ControlsD = `FCTRLW'b0_1_00_xx_010_0_0_0; // feq
 | 
			
		||||
                                  3'b001:  ControlsD = `FCTRLW'b0_1_00_xx_001_0_0_0; // flt
 | 
			
		||||
                                  3'b000:  ControlsD = `FCTRLW'b0_1_00_xx_011_0_0_0; // fle
 | 
			
		||||
                                  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
 | 
			
		||||
                    7'b11100??: if (Funct3D == 3'b001)          ControlsD = `FCTRLW'b0_1_10_xx_000_0_0_0; // fclass
 | 
			
		||||
                                else if (Funct3D[1:0] == 2'b00) ControlsD = `FCTRLW'b0_1_11_xx_000_0_0_0; // fmv.x.w   to int reg
 | 
			
		||||
                                else if (Funct3D[1:0] == 2'b01) ControlsD = `FCTRLW'b0_1_11_xx_000_0_0_0; // fmv.x.d   to int reg
 | 
			
		||||
                                else                            ControlsD = `FCTRLW'b0_0_00_xx_0xx_0_1_0; // non-implemented instruction
 | 
			
		||||
                                else                            ControlsD = `FCTRLW'b0_0_00_xx_000_0_1_0; // non-implemented instruction
 | 
			
		||||
                    7'b1101000: case(Rs2D[1:0])
 | 
			
		||||
                                  2'b00:    ControlsD = `FCTRLW'b1_0_01_00_101_0_0_0; // fcvt.s.w   w->s
 | 
			
		||||
                                  2'b01:    ControlsD = `FCTRLW'b1_0_01_00_100_0_0_0; // fcvt.s.wu wu->s
 | 
			
		||||
@ -165,7 +165,7 @@ module fctrl (
 | 
			
		||||
                                endcase
 | 
			
		||||
                    7'b1111001: ControlsD = `FCTRLW'b1_0_00_xx_011_0_0_0; // fmv.d.x   to fp reg
 | 
			
		||||
                    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_000_0_1_0; // non-implemented instruction
 | 
			
		||||
                  endcase
 | 
			
		||||
      default:      ControlsD = `FCTRLW'b0_0_00_xx_000_0_1_0; // non-implemented instruction
 | 
			
		||||
    endcase
 | 
			
		||||
 | 
			
		||||
@ -82,7 +82,7 @@ module testbenchfp;
 | 
			
		||||
	logic [`LOGCVTLEN-1:0] CvtShiftAmtE;  // how much to shift by
 | 
			
		||||
	logic [`DIVb:0] Quot;
 | 
			
		||||
  logic CvtResDenormUfE;
 | 
			
		||||
  logic DivStart, FDivBusyE;
 | 
			
		||||
  logic DivStart, FDivBusyE, OldFDivBusyE;
 | 
			
		||||
  logic reset = 1'b0;
 | 
			
		||||
  logic [$clog2(`NF+2)-1:0] XZeroCnt, YZeroCnt;
 | 
			
		||||
  logic [`DURLEN-1:0] Dur;
 | 
			
		||||
@ -689,12 +689,12 @@ module testbenchfp;
 | 
			
		||||
            .Xe(Xe), .Ye(Ye), .Ze(Ze), 
 | 
			
		||||
            .Xm(Xm), .Ym(Ym), .Zm(Zm),
 | 
			
		||||
            .XZero, .YZero, .ZZero, .Ss, .Se,
 | 
			
		||||
            .OpCtrl(OpCtrlVal), .Fmt(ModFmt), .Sm, .InvA, .SCnt, .As, .Ps,
 | 
			
		||||
            .OpCtrl(OpCtrlVal), .Sm, .InvA, .SCnt, .As, .Ps,
 | 
			
		||||
            .ZmSticky); 
 | 
			
		||||
  end
 | 
			
		||||
              
 | 
			
		||||
  postprocess postprocess(.Xs(Xs), .Ys(Ys), .PostProcSel(UnitVal[1:0]),
 | 
			
		||||
              .Ze(Ze),  .ZDenorm(ZDenorm), .OpCtrl(OpCtrlVal), .DivQm(Quot), .DivQe(DivCalcExp),
 | 
			
		||||
              .ZDenorm(ZDenorm), .OpCtrl(OpCtrlVal), .DivQm(Quot), .DivQe(DivCalcExp),
 | 
			
		||||
              .Xm(Xm), .Ym(Ym), .Zm(Zm), .CvtCe(CvtCalcExpE), .DivS(DivSticky), .FmaSs(Ss),
 | 
			
		||||
              .XNaN(XNaN), .YNaN(YNaN), .ZNaN(ZNaN), .CvtResDenormUf(CvtResDenormUfE),
 | 
			
		||||
              .XZero(XZero), .YZero(YZero), .ZZero(ZZero), .CvtShiftAmt(CvtShiftAmtE),
 | 
			
		||||
@ -719,8 +719,8 @@ module testbenchfp;
 | 
			
		||||
    fdivsqrt fdivsqrt(.clk, .reset, .XsE(Xs), .FmtE(ModFmt), .XmE(Xm), .YmE(Ym), .XeE(Xe), .YeE(Ye), .SqrtE(OpCtrlVal[0]), .SqrtM(OpCtrlVal[0]),
 | 
			
		||||
                    .XInfE(XInf), .YInfE(YInf), .XZeroE(XZero), .YZeroE(YZero), .XNaNE(XNaN), .YNaNE(YNaN), 
 | 
			
		||||
                    .FDivStartE(DivStart), .IDivStartE(1'b0), .MDUE(1'b0), .W64E(1'b0),
 | 
			
		||||
                    .StallE(1'b0), .StallM(1'b0), .DivSM(DivSticky), .FDivBusyE, .QeM(DivCalcExp),
 | 
			
		||||
                    .QmM(Quot), .DivDone);
 | 
			
		||||
                    .StallM(1'b0), .DivSM(DivSticky), .FDivBusyE, .QeM(DivCalcExp),
 | 
			
		||||
                    .QmM(Quot));
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  assign CmpFlg[3:0] = 0;
 | 
			
		||||
@ -811,6 +811,9 @@ end
 | 
			
		||||
 | 
			
		||||
  logic ResMatch, FlagMatch, CheckNow;
 | 
			
		||||
 | 
			
		||||
always @(posedge clk) 
 | 
			
		||||
  OldFDivBusyE = FDivBusyE;
 | 
			
		||||
 | 
			
		||||
// check results on falling edge of clk
 | 
			
		||||
always @(negedge clk) begin
 | 
			
		||||
 | 
			
		||||
@ -883,6 +886,7 @@ always @(negedge clk) begin
 | 
			
		||||
    ResMatch = (Res === Ans | NaNGood | NaNGood === 1'bx);
 | 
			
		||||
    FlagMatch = (ResFlg === AnsFlg | AnsFlg === 5'bx);
 | 
			
		||||
    divsqrtop = OpCtrlVal == `SQRT_OPCTRL | OpCtrlVal == `DIV_OPCTRL;
 | 
			
		||||
    assign DivDone = OldFDivBusyE & ~FDivBusyE;
 | 
			
		||||
 | 
			
		||||
    //assign divsqrtop = OpCtrl[TestNum] == `SQRT_OPCTRL | OpCtrl[TestNum] == `DIV_OPCTRL;
 | 
			
		||||
    CheckNow = (DivDone | ~divsqrtop) & (UnitVal !== `CVTINTUNIT)&(UnitVal !== `CMPUNIT);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user