mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Merge pull request #455 from davidharrishmc/dev
Bit manipulation imperas config, fsqrt code changes to match chapter
This commit is contained in:
		
						commit
						44c60a3e76
					
				| @ -11,7 +11,8 @@ | ||||
| --override refRoot/cpu/tvec_align=64 | ||||
| 
 | ||||
| # bit manipulation | ||||
| --override cpu/add_implicit_Extensions=B  | ||||
| --override cpu/add_Extensions=B  | ||||
| #--override cpu/add_implicit_Extensions=B  | ||||
| --override cpu/bitmanip_version=1.0.0 | ||||
| 
 | ||||
| # More extensions | ||||
|  | ||||
| @ -68,7 +68,7 @@ module fdivsqrt import cvw::*;  #(parameter cvw_t P) ( | ||||
|   logic                        BZeroM;                       // Denominator is zero
 | ||||
|   logic                        IntDivM;                      // Integer operation
 | ||||
|   logic [P.DIVBLEN:0]          nM, mM;                       // Shift amounts
 | ||||
|   logic                        NegQuotM, ALTBM, AsM, W64M;   // Special handling for postprocessor
 | ||||
|   logic                        ALTBM, AsM, BsM, W64M;        // Special handling for postprocessor
 | ||||
|   logic [P.XLEN-1:0]           AM;                           // Original Numerator for postprocessor
 | ||||
|   logic                        ISpecialCaseE;                // Integer div/remainder special cases
 | ||||
| 
 | ||||
| @ -78,7 +78,7 @@ module fdivsqrt import cvw::*;  #(parameter cvw_t P) ( | ||||
|     // Int-specific 
 | ||||
|     .ForwardedSrcAE, .ForwardedSrcBE, .IntDivE, .W64E, .ISpecialCaseE, | ||||
|     .BZeroM, .nM, .mM, .AM,  | ||||
|     .IntDivM, .W64M, .NegQuotM, .ALTBM, .AsM); | ||||
|     .IntDivM, .W64M, .ALTBM, .AsM, .BsM); | ||||
| 
 | ||||
|   fdivsqrtfsm #(P) fdivsqrtfsm(                                  // FSM
 | ||||
|     .clk, .reset, .XInfE, .YInfE, .XZeroE, .YZeroE, .XNaNE, .YNaNE,  | ||||
| @ -96,6 +96,6 @@ module fdivsqrt import cvw::*;  #(parameter cvw_t P) ( | ||||
|     .SqrtE, .Firstun, .SqrtM, .SpecialCaseM,  | ||||
|     .QmM, .WZeroE, .DivStickyM,  | ||||
|     // Int-specific 
 | ||||
|     .nM, .mM, .ALTBM, .AsM, .BZeroM, .NegQuotM, .W64M, .RemOpM(Funct3M[1]), .AM,  | ||||
|     .nM, .mM, .ALTBM, .AsM, .BsM, .BZeroM, .W64M, .RemOpM(Funct3M[1]), .AM,  | ||||
|     .FIntDivResultM); | ||||
| endmodule | ||||
|  | ||||
| @ -34,9 +34,9 @@ module fdivsqrtpostproc import cvw::*;  #(parameter cvw_t P) ( | ||||
|   input  logic [P.DIVb:0]    FirstU, FirstUM,  | ||||
|   input  logic [P.DIVb+1:0]  FirstC, | ||||
|   input  logic               SqrtE, | ||||
|   input  logic               Firstun, SqrtM, SpecialCaseM, NegQuotM, | ||||
|   input  logic               Firstun, SqrtM, SpecialCaseM,  | ||||
|   input  logic [P.XLEN-1:0]  AM, | ||||
|   input  logic               RemOpM, ALTBM, BZeroM, AsM, W64M, | ||||
|   input  logic               RemOpM, ALTBM, BZeroM, AsM, BsM, W64M, | ||||
|   input  logic [P.DIVBLEN:0] nM, mM, | ||||
|   output logic [P.DIVb:0]    QmM,  | ||||
|   output logic               WZeroE, | ||||
| @ -49,6 +49,7 @@ module fdivsqrtpostproc import cvw::*;  #(parameter cvw_t P) ( | ||||
|   logic                      NegStickyM; | ||||
|   logic                      weq0E, WZeroM; | ||||
|   logic [P.XLEN-1:0]         IntDivResultM; | ||||
|   logic                      NegQuotM; // Integer quotient is negative
 | ||||
| 
 | ||||
|   //////////////////////////
 | ||||
|   // Execute Stage: Detect early termination for an exact result
 | ||||
| @ -103,6 +104,7 @@ module fdivsqrtpostproc import cvw::*;  #(parameter cvw_t P) ( | ||||
|     assign UnsignedQuotM = {3'b000, PreQmM}; | ||||
| 
 | ||||
|     // Integer remainder: sticky and sign correction muxes
 | ||||
|     assign NegQuotM = AsM ^ BsM; // Integer Quotient is negative
 | ||||
|     mux2 #(P.DIVb+4) normremdmux(W, W+D, NegStickyM, NormRemDM); | ||||
|     mux2 #(P.DIVb+4) normremsmux(NormRemDM, -NormRemDM, AsM, NormRemM); | ||||
|     mux2 #(P.DIVb+4) quotresmux(UnsignedQuotM, -UnsignedQuotM, NegQuotM, NormQuotM); | ||||
|  | ||||
| @ -43,8 +43,8 @@ module fdivsqrtpreproc import cvw::*;  #(parameter cvw_t P) ( | ||||
|   output logic                 ISpecialCaseE, | ||||
|   output logic [P.DURLEN-1:0]  CyclesE, | ||||
|   output logic [P.DIVBLEN:0]   nM, mM, | ||||
|   output logic                 NegQuotM, ALTBM, IntDivM, W64M, | ||||
|   output logic                 AsM, BZeroM, | ||||
|   output logic                 ALTBM, IntDivM, W64M, | ||||
|   output logic                 AsM, BsM, BZeroM, | ||||
|   output logic [P.XLEN-1:0]    AM | ||||
| ); | ||||
| 
 | ||||
| @ -57,7 +57,6 @@ module fdivsqrtpreproc import cvw::*;  #(parameter cvw_t P) ( | ||||
|   logic                        NumerZeroE;                          // Numerator is zero (X or A)
 | ||||
|   logic                        AZeroE, BZeroE;                      // A or B is Zero for integer division
 | ||||
|   logic                        SignedDivE;                          // signed division
 | ||||
|   logic                        NegQuotE;                            // Integer quotient is negative
 | ||||
|   logic                        AsE, BsE;                            // Signs of integer inputs
 | ||||
|   logic [P.XLEN-1:0]           AE;                                  // input A after W64 adjustment
 | ||||
|   logic  ALTBE; | ||||
| @ -84,7 +83,6 @@ module fdivsqrtpreproc import cvw::*;  #(parameter cvw_t P) ( | ||||
|     assign BZeroE = ~(|BE); | ||||
|     assign AsE = AE[P.XLEN-1] & SignedDivE; | ||||
|     assign BsE = BE[P.XLEN-1] & SignedDivE;  | ||||
|     assign NegQuotE = AsE ^ BsE; // Integer Quotient is negative
 | ||||
| 
 | ||||
|     // Force integer inputs to be postiive
 | ||||
|     mux2 #(P.XLEN) posamux(AE, -AE, AsE, PosA); | ||||
| @ -192,9 +190,9 @@ module fdivsqrtpreproc import cvw::*;  #(parameter cvw_t P) ( | ||||
|     // pipeline registers
 | ||||
|     flopen #(1)        mdureg(clk, IFDivStartE, IntDivE,  IntDivM); | ||||
|     flopen #(1)       altbreg(clk, IFDivStartE, ALTBE,    ALTBM); | ||||
|     flopen #(1)    negquotreg(clk, IFDivStartE, NegQuotE, NegQuotM); | ||||
|     flopen #(1)      bzeroreg(clk, IFDivStartE, BZeroE,   BZeroM); | ||||
|     flopen #(1)      asignreg(clk, IFDivStartE, AsE,      AsM); | ||||
|     flopen #(1)      bsignreg(clk, IFDivStartE, BsE,      BsM); | ||||
|     flopen #(P.DIVBLEN+1) nreg(clk, IFDivStartE, nE,       nM);  | ||||
|     flopen #(P.DIVBLEN+1) mreg(clk, IFDivStartE, mE,       mM); | ||||
|     flopen #(P.XLEN)   srcareg(clk, IFDivStartE, AE,       AM); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user