mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	classify unit created and passes imperas tests
This commit is contained in:
		
							parent
							
								
									65eca433b6
								
							
						
					
					
						commit
						0646e08609
					
				@ -162,7 +162,6 @@ module fpu (
 | 
			
		||||
 | 
			
		||||
  // classify signals
 | 
			
		||||
  logic [63:0]      ClassResultE, ClassResultM, ClassResultW;
 | 
			
		||||
  logic [4:0]       ClassFlagsE, ClassFlagsM, ClassFlagsW;
 | 
			
		||||
 | 
			
		||||
  // other
 | 
			
		||||
  logic [63:0]      FPUResult64W, FPUResult64E;                                           // 64-bit FPU result
 | 
			
		||||
@ -287,6 +286,11 @@ module fpu (
 | 
			
		||||
  //first and only instance of floating-point sign converter
 | 
			
		||||
  fpusgn fpsgn (.SgnOpCodeE(FOpCtrlE[1:0]),.*);
 | 
			
		||||
 | 
			
		||||
  //first and only instance of floating-point classify unit
 | 
			
		||||
  fpuclassify fpuclass (.*);
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -394,7 +398,10 @@ module fpu (
 | 
			
		||||
  flopenrc #(1) EMReg7(clk, reset, PipeClearEM, PipeEnableEM, FWriteIntE, FWriteIntM);
 | 
			
		||||
  flopenrc #(2) EMReg8(clk, reset, PipeClearEM, PipeEnableEM, FMemRWE, FMemRWM);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  //*****************
 | 
			
		||||
  //fpuclassify E/M pipe registers
 | 
			
		||||
  //***************** 
 | 
			
		||||
  flopenrc #(64) EMRegClass(clk, reset, PipeClearEM, PipeEnableEM, ClassResultE, ClassResultM);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -471,6 +478,10 @@ module fpu (
 | 
			
		||||
  flopenrc #(1) MWReg7(clk, reset, PipeClearMW, PipeEnableMW, FWriteIntM, FWriteIntW);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  //*****************
 | 
			
		||||
  //fpuclassify M/W pipe registers
 | 
			
		||||
  //***************** 
 | 
			
		||||
  flopenrc #(64) MWRegClass(clk, reset, PipeClearMW, PipeEnableMW, ClassResultM, ClassResultW);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -496,7 +507,7 @@ module fpu (
 | 
			
		||||
		// add/sub/cnvt
 | 
			
		||||
		3'b100 : FPUFlagsW = FAddFlagsW;
 | 
			
		||||
		// classify
 | 
			
		||||
		3'b101 : FPUFlagsW = ClassFlagsW;
 | 
			
		||||
		3'b101 : FPUFlagsW = 5'b0;
 | 
			
		||||
		// output SrcAW
 | 
			
		||||
		3'b110 : FPUFlagsW = 5'b0;
 | 
			
		||||
		// output FRD1
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										50
									
								
								wally-pipelined/src/fpu/fpuclassify.sv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								wally-pipelined/src/fpu/fpuclassify.sv
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,50 @@
 | 
			
		||||
`include "wally-config.vh"
 | 
			
		||||
 | 
			
		||||
module fpuclassify (
 | 
			
		||||
    input  logic [63:0] FInput1E,
 | 
			
		||||
    input  logic        FmtE,           // 0-single 1-double
 | 
			
		||||
    output logic [63:0] ClassResultE
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    logic [31:0] single;
 | 
			
		||||
    logic [63:0] double;
 | 
			
		||||
    logic sign;
 | 
			
		||||
    logic infinity, NaN, zero, normal, subnormal;
 | 
			
		||||
    logic ExpNotZero, ExpOnes, ManNotZero, ExpZero, ManZero, FirstBitMan;
 | 
			
		||||
   
 | 
			
		||||
    // single and double precision layouts
 | 
			
		||||
    assign single = FInput1E[63:32];
 | 
			
		||||
    assign double = FInput1E;
 | 
			
		||||
    assign sign = FInput1E[63];
 | 
			
		||||
 | 
			
		||||
    // basic calculations for readabillity
 | 
			
		||||
    assign ExpNotZero = FmtE ? |double[62:52] : |single[30:23];
 | 
			
		||||
    assign ExpZero = ~ExpNotZero;
 | 
			
		||||
    assign ExpOnes = FmtE ? &double[62:52] : &single[30:23];
 | 
			
		||||
    assign ManNotZero = FmtE ? |double[51:0] : |single[22:0];
 | 
			
		||||
    assign ManZero = ~ManNotZero;
 | 
			
		||||
    assign FirstBitMan = FmtE ? double[51] : single[22];
 | 
			
		||||
 | 
			
		||||
    // determine the type of number
 | 
			
		||||
    assign NaN      = ExpOnes & ManNotZero;
 | 
			
		||||
    assign infinity = ExpOnes & ManZero;
 | 
			
		||||
    assign zero     = ExpZero & ManZero;
 | 
			
		||||
    assign subnormal= ExpZero & ManNotZero;
 | 
			
		||||
    assign normal   = ExpNotZero;
 | 
			
		||||
 | 
			
		||||
    // determine sub category and combine into the result
 | 
			
		||||
    //  bit 0 - -infinity
 | 
			
		||||
    //  bit 1 - -normal
 | 
			
		||||
    //  bit 2 - -subnormal
 | 
			
		||||
    //  bit 3 - -zero
 | 
			
		||||
    //  bit 4 - +zero
 | 
			
		||||
    //  bit 5 - +subnormal
 | 
			
		||||
    //  bit 6 - +normal
 | 
			
		||||
    //  bit 7 - +infinity
 | 
			
		||||
    //  bit 8 - signaling NaN
 | 
			
		||||
    //  bit 9 - quiet NaN
 | 
			
		||||
    assign ClassResultE = {{`XLEN-10{1'b0}}, FirstBitMan&NaN, ~FirstBitMan&NaN, ~sign&infinity, ~sign&normal, 
 | 
			
		||||
                                    ~sign&subnormal, ~sign&zero, sign&zero, sign&subnormal, sign&normal, sign&infinity, {64-`XLEN{1'b0}}};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
@ -124,7 +124,7 @@ string tests32f[] = '{
 | 
			
		||||
    "rv64d/I-FLT-D-01", "2000",
 | 
			
		||||
    "rv64d/I-FEQ-D-01", "2000",
 | 
			
		||||
    "rv64d/I-FADD-D-01", "2000",
 | 
			
		||||
    // "rv64d/I-FCLASS-D-01", "2000",
 | 
			
		||||
    "rv64d/I-FCLASS-D-01", "2000",
 | 
			
		||||
    // "rv64d/I-FCVT-D-L-01", "2000",
 | 
			
		||||
    // "rv64d/I-FCVT-D-LU-01", "2000",
 | 
			
		||||
    // "rv64d/I-FCVT-D-S-01", "2000",
 | 
			
		||||
@ -653,7 +653,7 @@ string tests32f[] = '{
 | 
			
		||||
              errors = errors+1;
 | 
			
		||||
              $display("  Error on test %s result %d: adr = %h sim = %h, signature = %h", 
 | 
			
		||||
                    tests[test], i, (testadr+i)*`XLEN/8, dut.uncore.dtim.RAM[testadr+i], signature[i]);
 | 
			
		||||
              // $stop;//***debug
 | 
			
		||||
              $stop;//***debug
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
          i = i + 1;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user