forked from Github_Repos/cvw
		
	classify unit created and passes imperas tests
This commit is contained in:
		
							parent
							
								
									1459d840ed
								
							
						
					
					
						commit
						778ba6bbf5
					
				| @ -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