mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Simplified interface to fclassify and fsgn
This commit is contained in:
		
							parent
							
								
									3dd89a7e62
								
							
						
					
					
						commit
						5e155e4fd1
					
				@ -3,43 +3,18 @@
 | 
			
		||||
 | 
			
		||||
module fclassify (
 | 
			
		||||
    input  logic XSgnE,
 | 
			
		||||
    input  logic [51:0] XFracE,
 | 
			
		||||
    input logic XNaNE, 
 | 
			
		||||
    input logic XSNaNE,
 | 
			
		||||
    input logic XNormE,
 | 
			
		||||
    input logic XDenormE,
 | 
			
		||||
    input logic XZeroE,
 | 
			
		||||
    input logic XInfE,
 | 
			
		||||
    // input  logic        FmtE,           // 0-Single 1-Double
 | 
			
		||||
    output logic [63:0] ClassResE
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    // logic XSgnE;
 | 
			
		||||
    // logic Inf, NaN, Zero, Norm, Denorm;
 | 
			
		||||
    logic PInf, PZero, PNorm, PDenorm;
 | 
			
		||||
    logic NInf, NZero, NNorm, NDenorm;
 | 
			
		||||
    // logic MaxExp, ExpZero, ManZero, FirstBitFrac;
 | 
			
		||||
   
 | 
			
		||||
    // Single and Double precision layouts
 | 
			
		||||
    // assign XSgnE = FmtE ? FSrcXE[63] : FSrcXE[31];
 | 
			
		||||
 | 
			
		||||
    // basic calculations for readabillity
 | 
			
		||||
    
 | 
			
		||||
    // assign ExpZero = FmtE ? ~|FSrcXE[62:52] : ~|FSrcXE[30:23];
 | 
			
		||||
    // assign MaxExp = FmtE ? &FSrcXE[62:52] : &FSrcXE[30:23];
 | 
			
		||||
    // assign ManZero = FmtE ? ~|FSrcXE[51:0] : ~|FSrcXE[22:0];
 | 
			
		||||
    // assign FirstBitFrac = FmtE ? FSrcXE[51] : FSrcXE[22];
 | 
			
		||||
 | 
			
		||||
    // determine the type of number
 | 
			
		||||
    // assign NaN      = MaxExp & ~ManZero;
 | 
			
		||||
    // assign Inf = MaxExp & ManZero;
 | 
			
		||||
    // assign Zero     = ExpZero & ManZero;
 | 
			
		||||
    // assign Denorm= ExpZero & ~ManZero;
 | 
			
		||||
    // assign Norm   = ~ExpZero;
 | 
			
		||||
 | 
			
		||||
    // determine the sub categories
 | 
			
		||||
    // assign QNaN = FirstBitFrac&NaN;
 | 
			
		||||
    // assign SNaN = ~FirstBitFrac&NaN;
 | 
			
		||||
    assign PInf = ~XSgnE&XInfE;
 | 
			
		||||
    assign NInf = XSgnE&XInfE;
 | 
			
		||||
    assign PNorm = ~XSgnE&XNormE;
 | 
			
		||||
 | 
			
		||||
@ -374,7 +374,7 @@ module fma2(
 | 
			
		||||
    assign UfLSBNormSum = FmtM ? NormSum[2] : NormSum[31];
 | 
			
		||||
 | 
			
		||||
    // Deterimine if a small number was supposed to be subtrated
 | 
			
		||||
    assign SubBySmallNum = AddendStickyM&InvZ&~(NormSumSticky)&~ZZeroM;
 | 
			
		||||
    assign SubBySmallNum = AddendStickyM & InvZ & ~(NormSumSticky) & ~ZZeroM;
 | 
			
		||||
 | 
			
		||||
    always_comb begin
 | 
			
		||||
        // Determine if you add 1
 | 
			
		||||
 | 
			
		||||
@ -216,15 +216,15 @@ module fpu (
 | 
			
		||||
                         .FSrcXE, .FSrcYE, .FOpCtrlE, .FAddResM, .FAddFlgM);
 | 
			
		||||
	
 | 
			
		||||
	// first and only instance of floating-point comparator
 | 
			
		||||
	fcmp fcmp (.op1({XSgnE,XExpE,XFracE}), .op2({YSgnE,YExpE,YFracE}), .FSrcXE, 
 | 
			
		||||
	fcmp fcmp (.op1({FSrcXE}), .op2({FSrcYE}), .FSrcXE, 
 | 
			
		||||
		   .FSrcYE, .FOpCtrlE(FOpCtrlE[2:0]), .FmtE, 
 | 
			
		||||
		   .Invalid(CmpNVE), .CmpResE, .XNaNE, .YNaNE, .XZeroE, .YZeroE);
 | 
			
		||||
	
 | 
			
		||||
	// first and only instance of floating-point sign converter
 | 
			
		||||
	fsgn fsgn (.SgnOpCodeE(FOpCtrlE[1:0]), .XSgnE, .YSgnE, .XExpE, .XFracE, .FmtE, .SgnResE, .SgnNVE, .XExpMaxE);
 | 
			
		||||
	
 | 
			
		||||
	fsgn fsgn (.SgnOpCodeE(FOpCtrlE[1:0]), .XSgnE, .YSgnE, .FSrcXE, /*.XExpE, .XFracE, */.FmtE, .SgnResE, .SgnNVE, .XExpMaxE);
 | 
			
		||||
 | 
			
		||||
	// first and only instance of floating-point classify unit
 | 
			
		||||
	fclassify fclassify (.XSgnE, .XFracE, .XDenormE, .XZeroE, .XNaNE, .XInfE, .XNormE, .XSNaNE, .ClassResE);
 | 
			
		||||
	fclassify fclassify (.XSgnE, .XDenormE, .XZeroE, .XNaNE, .XInfE, .XNormE, .XSNaNE, .ClassResE);
 | 
			
		||||
	
 | 
			
		||||
	fcvt fcvt (.XSgnE, .XExpE, .XFracE, .XAssumed1E, .XZeroE, .XNaNE, .XInfE, .XDenormE, .BiasE, .SrcAE, .FOpCtrlE, .FmtE, .FrmE, .CvtResE, .CvtFlgE);
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
@ -2,8 +2,7 @@
 | 
			
		||||
 | 
			
		||||
module fsgn (  
 | 
			
		||||
	input logic        XSgnE, YSgnE,
 | 
			
		||||
    input logic [10:0] XExpE,
 | 
			
		||||
    input logic [51:0] XFracE,
 | 
			
		||||
	input logic [63:0] FSrcXE,
 | 
			
		||||
	input logic XExpMaxE,
 | 
			
		||||
	input logic FmtE,
 | 
			
		||||
	input  logic [1:0]   SgnOpCodeE,
 | 
			
		||||
@ -21,7 +20,7 @@ module fsgn (
 | 
			
		||||
	//
 | 
			
		||||
	
 | 
			
		||||
	assign ResSgn = SgnOpCodeE[1] ? (XSgnE ^ YSgnE) : (YSgnE ^ SgnOpCodeE[0]);
 | 
			
		||||
	assign SgnResE = FmtE ? {ResSgn, XExpE, XFracE} : {{32{1'b1}}, ResSgn, XExpE[7:0], XFracE[51:29]};
 | 
			
		||||
	assign SgnResE = FmtE ? {ResSgn, FSrcXE[62:0]} : {FSrcXE[63:32], ResSgn, FSrcXE[30:0]};
 | 
			
		||||
 | 
			
		||||
	//If the exponent is all ones, then the value is either Inf or NaN,
 | 
			
		||||
	//both of which will produce a QNaN/SNaN value of some sort. This will 
 | 
			
		||||
 | 
			
		||||
@ -24,9 +24,9 @@ module unpacking (
 | 
			
		||||
    assign Addend = FOpCtrlE[2] ? 64'b0 : Z; // Z is only used in the FMA, and is set to Zero if a multiply opperation
 | 
			
		||||
    assign XSgnE = FmtE ? X[63] : X[31];
 | 
			
		||||
    assign YSgnE = FmtE ? Y[63] : Y[31];
 | 
			
		||||
    assign ZSgnE = FmtE ? Addend[63]^FOpCtrlE[0] : Addend[31]^FOpCtrlE[0];
 | 
			
		||||
    assign ZSgnE = FmtE ? Addend[63]^FOpCtrlE[0] : Addend[31]^FOpCtrlE[0]; // *** Maybe this should be done in the FMA for modularity?
 | 
			
		||||
 | 
			
		||||
    assign XExpE = FmtE ? X[62:52] : {3'b0, X[30:23]};
 | 
			
		||||
    assign XExpE = FmtE ? X[62:52] : {3'b0, X[30:23]}; // *** maybe convert to full number of bits here?
 | 
			
		||||
    assign YExpE = FmtE ? Y[62:52] : {3'b0, Y[30:23]};
 | 
			
		||||
    assign ZExpE = FmtE ? Addend[62:52] : {3'b0, Addend[30:23]};
 | 
			
		||||
 | 
			
		||||
@ -34,7 +34,7 @@ module unpacking (
 | 
			
		||||
    assign YFracE = FmtE ? Y[51:0] : {Y[22:0], 29'b0};
 | 
			
		||||
    assign ZFracE = FmtE ? Addend[51:0] : {Addend[22:0], 29'b0};
 | 
			
		||||
 | 
			
		||||
    assign XAssumed1E = |XExpE;
 | 
			
		||||
    assign XAssumed1E = |XExpE; // *** should these be prepended now to create a significand?
 | 
			
		||||
    assign YAssumed1E = |YExpE;
 | 
			
		||||
    assign ZAssumed1E = |ZExpE;
 | 
			
		||||
 | 
			
		||||
@ -72,6 +72,6 @@ module unpacking (
 | 
			
		||||
    assign YZeroE = YExpZero & YFracZero;
 | 
			
		||||
    assign ZZeroE = ZExpZero & ZFracZero;
 | 
			
		||||
 | 
			
		||||
    assign BiasE = FmtE ? 13'h3ff : 13'h7f;
 | 
			
		||||
    assign BiasE = FmtE ? 13'h3ff : 13'h7f; // *** is it better to convert to full precision exponents so bias isn't needed?
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user