mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	fma synth warnings and errors removed
This commit is contained in:
		
							parent
							
								
									2383ca4f53
								
							
						
					
					
						commit
						eb93bd46d7
					
				| @ -38,7 +38,8 @@ | ||||
| `define IEEE754 0 | ||||
| 
 | ||||
| // MISA RISC-V configuration per specification | ||||
| `define MISA (32'h00000104 | 1 << 5 | 1 << 3 | 1 << 18 | 1 << 20 | 1 << 12 | 1 << 0 ) | ||||
| //                    ZYXWVUTSRQPONMLKJIHGFEDCBA | ||||
| `define MISA 32'b0000000000101000001000100101101 | ||||
| `define ZICSR_SUPPORTED 1 | ||||
| `define ZIFENCEI_SUPPORTED 1 | ||||
| `define COUNTERS 32 | ||||
|  | ||||
| @ -51,43 +51,45 @@ | ||||
| `define PMPCFG_ENTRIES (`PMP_ENTRIES/8) | ||||
| 
 | ||||
| // Floating point constants for Quad, Double, Single, and Half precisions | ||||
| `define Q_LEN 128 | ||||
| `define Q_NE 15 | ||||
| `define Q_NF 112 | ||||
| `define Q_BIAS 16383 | ||||
| `define D_LEN 64 | ||||
| `define D_NE 11 | ||||
| `define D_NF 52 | ||||
| `define D_BIAS 1023 | ||||
| `define S_LEN 32 | ||||
| `define S_NE 8 | ||||
| `define S_NF 23 | ||||
| `define S_BIAS 127 | ||||
| `define H_LEN 16 | ||||
| `define H_NE 5 | ||||
| `define H_NF 10 | ||||
| `define H_BIAS 15 | ||||
| `define Q_LEN 32'd128 | ||||
| `define Q_NE 32'd15 | ||||
| `define Q_NF 32'd112 | ||||
| `define Q_BIAS 32'd16383 | ||||
| `define D_LEN 32'd64 | ||||
| `define D_NE 32'd11 | ||||
| `define D_NF 32'd52 | ||||
| `define D_BIAS 32'd1023 | ||||
| `define D_FMT 32'd1 | ||||
| `define S_LEN 32'd32 | ||||
| `define S_NE 32'd8 | ||||
| `define S_NF 32'd23 | ||||
| `define S_BIAS 32'd127 | ||||
| `define S_FMT 32'd1 | ||||
| `define H_LEN 32'd16 | ||||
| `define H_NE 32'd5 | ||||
| `define H_NF 32'd10 | ||||
| `define H_BIAS 32'd15 | ||||
| 
 | ||||
| // Floating point length FLEN and number of exponent (NE) and fraction (NF) bits | ||||
| `define FLEN (`Q_SUPPORTED ? `Q_LEN  : `D_SUPPORTED ? `D_LEN  : `F_SUPPORTED ? `S_LEN  : `H_LEN) | ||||
| `define NE   (`Q_SUPPORTED ? `Q_NE   : `D_SUPPORTED ? `D_NE   : `F_SUPPORTED ? `S_NE   : `H_NE) | ||||
| `define NF   (`Q_SUPPORTED ? `Q_NF   : `D_SUPPORTED ? `D_NF   : `F_SUPPORTED ? `S_NF   : `H_NF) | ||||
| `define FMT  (`Q_SUPPORTED ? 3       : `D_SUPPORTED ? 1       : `F_SUPPORTED ? 0       : 2) | ||||
| `define FMT  (`Q_SUPPORTED ? 2'd3       : `D_SUPPORTED ? 2'd1       : `F_SUPPORTED ? 2'd0       : 2'd2) | ||||
| `define BIAS (`Q_SUPPORTED ? `Q_BIAS : `D_SUPPORTED ? `D_BIAS : `F_SUPPORTED ? `S_BIAS : `H_BIAS) | ||||
| 
 | ||||
| // Floating point constants needed for FPU paramerterization | ||||
| `define FPSIZES ((3)'(`Q_SUPPORTED)+(3)'(`D_SUPPORTED)+(3)'(`F_SUPPORTED)+(3)'(`ZFH_SUPPORTED)) | ||||
| `define FMTBITS (((`FPSIZES==3'b011)|(`FPSIZES==3'b100)) ? 2 : 1) | ||||
| `define LEN1  ((`D_SUPPORTED & (`FLEN != `D_LEN)) ? `D_LEN   : (`F_SUPPORTED & (`FLEN != `S_LEN)) ? `S_LEN  : `H_LEN) | ||||
| `define NE1   ((`D_SUPPORTED & (`FLEN != `D_LEN)) ? `D_NE   : (`F_SUPPORTED & (`FLEN != `S_LEN)) ? `S_NE  : `H_NE) | ||||
| `define NF1   ((`D_SUPPORTED & (`FLEN != `D_LEN)) ? `D_NF  : (`F_SUPPORTED & (`FLEN != `S_LEN)) ? `S_NF : `H_NF) | ||||
| `define FMT1  ((`D_SUPPORTED & (`FLEN != `D_LEN)) ? 1        : (`F_SUPPORTED & (`FLEN != `S_LEN)) ? 0       : 2) | ||||
| `define BIAS1 ((`D_SUPPORTED & (`FLEN != `D_LEN)) ? `D_BIAS  : (`F_SUPPORTED & (`FLEN != `S_LEN)) ? `S_BIAS : `H_BIAS) | ||||
| `define LEN2  ((`F_SUPPORTED & (`LEN1 != `S_LEN)) ? `S_LEN   : `H_LEN) | ||||
| `define FPSIZES ((32)'(`Q_SUPPORTED)+(32)'(`D_SUPPORTED)+(32)'(`F_SUPPORTED)+(32)'(`ZFH_SUPPORTED)) | ||||
| `define FMTBITS ((`FPSIZES>=3)+1) | ||||
| `define LEN1  ((`D_SUPPORTED & (`FLEN != `D_LEN)) ? `D_LEN  : (`F_SUPPORTED & (`FLEN != `S_LEN)) ? `S_LEN  : `H_LEN) | ||||
| `define NE1   ((`D_SUPPORTED & (`FLEN != `D_LEN)) ? `D_NE   : (`F_SUPPORTED & (`FLEN != `S_LEN)) ? `S_NE   : `H_NE) | ||||
| `define NF1   ((`D_SUPPORTED & (`FLEN != `D_LEN)) ? `D_NF   : (`F_SUPPORTED & (`FLEN != `S_LEN)) ? `S_NF   : `H_NF) | ||||
| `define FMT1  ((`D_SUPPORTED & (`FLEN != `D_LEN)) ? 2'd1    : (`F_SUPPORTED & (`FLEN != `S_LEN)) ? 2'd0    : 2'd2) | ||||
| `define BIAS1 ((`D_SUPPORTED & (`FLEN != `D_LEN)) ? `D_BIAS : (`F_SUPPORTED & (`FLEN != `S_LEN)) ? `S_BIAS : `H_BIAS) | ||||
| `define LEN2  ((`F_SUPPORTED & (`LEN1 != `S_LEN)) ? `S_LEN  : `H_LEN) | ||||
| `define NE2   ((`F_SUPPORTED & (`LEN1 != `S_LEN)) ? `S_NE   : `H_NE) | ||||
| `define NF2   ((`F_SUPPORTED & (`LEN1 != `S_LEN)) ? `S_NF  : `H_NF) | ||||
| `define FMT2  ((`F_SUPPORTED & (`LEN1 != `S_LEN)) ? 0        : 2) | ||||
| `define BIAS2 ((`F_SUPPORTED & (`LEN1 != `S_LEN)) ? `S_BIAS  : `H_BIAS) | ||||
| `define NF2   ((`F_SUPPORTED & (`LEN1 != `S_LEN)) ? `S_NF   : `H_NF) | ||||
| `define FMT2  ((`F_SUPPORTED & (`LEN1 != `S_LEN)) ? 2'd0    : 2'd2) | ||||
| `define BIAS2 ((`F_SUPPORTED & (`LEN1 != `S_LEN)) ? `S_BIAS : `H_BIAS) | ||||
| 
 | ||||
| // Disable spurious Verilator warnings | ||||
| 
 | ||||
|  | ||||
| @ -5,7 +5,7 @@ export PATH=$PATH:/usr/local/bin/ | ||||
| verilator=`which verilator` | ||||
| 
 | ||||
| basepath=$(dirname $0)/.. | ||||
| for config in rv64fp rv32e rv64gc rv32gc rv32ic; do | ||||
| for config in rv64fp rv64fpquad rv32e rv64gc rv32gc rv32ic; do | ||||
|     echo "$config linting..." | ||||
|     if !($verilator --lint-only "$@" --top-module wallypipelinedsoc "-I$basepath/config/shared" "-I$basepath/config/$config" $basepath/src/*/*.sv $basepath/src/*/*/*.sv --relative-includes); then | ||||
|         echo "Exiting after $config lint due to errors or warnings" | ||||
|  | ||||
| @ -1,2 +1,2 @@ | ||||
| vsim -do "do wally-pipelined.do rv32e imperas64d" | ||||
| vsim -do "do wally-pipelined.do rv32gc arch32f" | ||||
| 
 | ||||
|  | ||||
| @ -122,7 +122,7 @@ module fctrl ( | ||||
|     else if (`FPSIZES == 2)begin | ||||
|       logic [1:0] FmtTmp; | ||||
|       assign FmtTmp = (FResultSelD == 2'b00) ? {~Funct3D[1], ~(Funct3D[1]^Funct3D[0])} : ((Funct7D[6:3] == 4'b0100)&OpD[4]) ? Rs2D[1:0] : Funct7D[1:0]; | ||||
|       assign FmtD = `FMT == FmtTmp; | ||||
|       assign FmtD = (`FMT == FmtTmp); | ||||
|     end | ||||
|     else if (`FPSIZES == 3|`FPSIZES == 4) | ||||
|       assign FmtD = (FResultSelD == 2'b00) ? {~Funct3D[1], ~(Funct3D[1]^Funct3D[0])} : ((Funct7D[6:3] == 4'b0100)&OpD[4]) ? Rs2D[1:0] : Funct7D[1:0]; | ||||
|  | ||||
| @ -2,6 +2,7 @@ | ||||
| `include "wally-config.vh" | ||||
| // largest length in IEU/FPU
 | ||||
| `define LGLEN ((`NF<`XLEN) ? `XLEN : `NF) | ||||
| `define LOGLGLEN $unsigned($clog2(`LGLEN+1)) | ||||
| 
 | ||||
| module fcvt ( | ||||
|     input logic             XSgnE,          // input's sign
 | ||||
| @ -42,7 +43,7 @@ module fcvt ( | ||||
|     logic [`XLEN-1:0]       TrimInt;    // integer trimmed to the correct size
 | ||||
|     logic [`LGLEN-1:0]      LzcIn;      // input to the Leading Zero Counter (priority encoder)
 | ||||
|     logic [`NE:0]           CalcExp;    // the calculated expoent
 | ||||
| 	logic [$clog2(`LGLEN+1)-1:0] ShiftAmt;  // how much to shift by
 | ||||
| 	logic [`LOGLGLEN-1:0] ShiftAmt;  // how much to shift by
 | ||||
|     logic [`LGLEN+`NF:0]    ShiftIn;    // number to be shifted
 | ||||
|     logic                   ResDenormUf;// does the result underflow or is denormalized
 | ||||
|     logic                   ResUf;      // does the result underflow
 | ||||
| @ -72,7 +73,7 @@ module fcvt ( | ||||
|     logic                   Int64;      // is the integer 64 bits?
 | ||||
|     logic                   IntToFp;       // is the opperation an int->fp conversion?
 | ||||
|     logic                   ToInt;      // is the opperation an fp->int conversion?
 | ||||
|     logic [$clog2(`LGLEN+1)-1:0] ZeroCnt; // output from the LZC
 | ||||
|     logic [`LOGLGLEN-1:0] ZeroCnt; // output from the LZC
 | ||||
| 
 | ||||
| 
 | ||||
|     // seperate OpCtrl for code readability
 | ||||
| @ -143,9 +144,9 @@ module fcvt ( | ||||
|     //              - only shift fp -> fp if the intital value is denormalized
 | ||||
|     //                  - this is a problem because the input to the lzc was the fraction rather than the mantissa
 | ||||
|     //                  - rather have a few and-gates than an extra bit in the priority encoder??? *** is this true?
 | ||||
|     assign ShiftAmt = ToInt ? CalcExp[$clog2(`LGLEN+1)-1:0]&{$clog2(`LGLEN+1){~CalcExp[`NE]}} : | ||||
|                     ResDenormUf&~IntToFp ? ($clog2(`LGLEN+1))'(`NF-1)+CalcExp[$clog2(`LGLEN+1)-1:0] :  | ||||
|                               (ZeroCnt+1)&{$clog2(`LGLEN+1){XDenormE|IntToFp}}; | ||||
|     assign ShiftAmt = ToInt ? CalcExp[`LOGLGLEN-1:0]&{`LOGLGLEN{~CalcExp[`NE]}} : | ||||
|                     ResDenormUf&~IntToFp ? (`LOGLGLEN)'(`NF-1)+CalcExp[`LOGLGLEN-1:0] :  | ||||
|                               (ZeroCnt+1)&{`LOGLGLEN{XDenormE|IntToFp}}; | ||||
|      | ||||
|     // shift
 | ||||
|     //      fp -> int: |  `XLEN  zeros |     Mantissa      | 0's if nessisary | << CalcExp
 | ||||
| @ -261,34 +262,34 @@ module fcvt ( | ||||
|     //                  - shift left to normilize (-1-ZeroCnt)
 | ||||
|     //                  - newBias to make the biased exponent
 | ||||
|     //          
 | ||||
|     assign CalcExp = {1'b0, OldExp} - (`NE+1)'(`BIAS) + {2'b0, NewBias} - {{`NE{1'b0}}, XDenormE|IntToFp} - {{`NE-$clog2(`LGLEN+1)+1{1'b0}}, (ZeroCnt&{$clog2(`LGLEN+1){XDenormE|IntToFp}})}; | ||||
|     assign CalcExp = {1'b0, OldExp} - (`NE+1)'(`BIAS) + {2'b0, NewBias} - {{`NE{1'b0}}, XDenormE|IntToFp} - {{`NE-`LOGLGLEN+1{1'b0}}, (ZeroCnt&{`LOGLGLEN{XDenormE|IntToFp}})}; | ||||
|     // find if the result is dnormal or underflows
 | ||||
|     //      - if Calculated expoenent is 0 or negitive (and the input/result is not exactaly 0)
 | ||||
|     //      - can't underflow an integer to Fp conversion
 | ||||
|     assign ResDenormUf = (~|CalcExp | CalcExp[`NE])&~XZeroE&~IntToFp; | ||||
|     // choose the negative of the fraction size
 | ||||
|     if (`FPSIZES == 1) begin | ||||
|         assign ResNegNF = -`NF;  | ||||
|         assign ResNegNF = -($clog2(`NF)+1)'(`NF);  | ||||
| 
 | ||||
|     end else if (`FPSIZES == 2) begin | ||||
|         assign ResNegNF = OutFmt ? -`NF : -`NF1; | ||||
|         assign ResNegNF = OutFmt ? -($clog2(`NF)+1)'(`NF) : -($clog2(`NF)+1)'(`NF1); | ||||
| 
 | ||||
|     end else if (`FPSIZES == 3) begin | ||||
|         always_comb | ||||
|             case (OutFmt) | ||||
|                 `FMT:  ResNegNF = -`NF; | ||||
|                 `FMT1: ResNegNF = -`NF1; | ||||
|                 `FMT2: ResNegNF = -`NF2; | ||||
|                 `FMT:  ResNegNF = -($clog2(`NF)+1)'(`NF); | ||||
|                 `FMT1: ResNegNF = -($clog2(`NF)+1)'(`NF1); | ||||
|                 `FMT2: ResNegNF = -($clog2(`NF)+1)'(`NF2); | ||||
|                 default: ResNegNF = 1'bx; | ||||
|             endcase | ||||
| 
 | ||||
|     end else if (`FPSIZES == 4) begin         | ||||
|         always_comb | ||||
|             case (OutFmt) | ||||
|                 2'h3: ResNegNF = -`Q_NF; | ||||
|                 2'h1: ResNegNF = -`D_NF; | ||||
|                 2'h0: ResNegNF = -`S_NF; | ||||
|                 2'h2: ResNegNF = -`H_NF; | ||||
|                 2'h3: ResNegNF = -($clog2(`NF)+1)'(`Q_NF); | ||||
|                 2'h1: ResNegNF = -($clog2(`NF)+1)'(`D_NF); | ||||
|                 2'h0: ResNegNF = -($clog2(`NF)+1)'(`S_NF); | ||||
|                 2'h2: ResNegNF = -($clog2(`NF)+1)'(`H_NF); | ||||
|             endcase | ||||
|     end | ||||
|     // determine if the result underflows ??? -> fp
 | ||||
| @ -453,10 +454,10 @@ module fcvt ( | ||||
| 
 | ||||
|     // find the maximum exponent (the exponent and larger overflows)
 | ||||
|     if (`FPSIZES == 1) begin | ||||
|         assign MaxExp = ToInt ? Int64 ? 65 : 33 : {`NE{1'b1}}; | ||||
|         assign MaxExp = ToInt ? Int64 ? (`NE)'(65) : (`NE)'(33) : {`NE{1'b1}}; | ||||
| 
 | ||||
|     end else if (`FPSIZES == 2) begin     | ||||
|         assign MaxExp = ToInt ? Int64 ? 65 : 33 : | ||||
|         assign MaxExp = ToInt ? Int64 ? (`NE)'($unsigned(65)) : (`NE)'($unsigned(33)) : | ||||
|                 OutFmt ? {`NE{1'b1}} : {{`NE-`NE1{1'b0}}, {`NE1{1'b1}}}; | ||||
| 
 | ||||
|     end else if (`FPSIZES == 3) begin | ||||
| @ -476,7 +477,7 @@ module fcvt ( | ||||
|                      MaxExpFp = 1'bx; | ||||
|                 end | ||||
|             endcase | ||||
|             assign MaxExp = ToInt ? Int64 ? 65 : 33 : MaxExpFp; | ||||
|             assign MaxExp = ToInt ? Int64 ? (`NE)'(65) : (`NE)'(33) : MaxExpFp; | ||||
| 
 | ||||
|     end else if (`FPSIZES == 4) begin         | ||||
|         logic [`NE-1:0] MaxExpFp; | ||||
| @ -495,7 +496,7 @@ module fcvt ( | ||||
|                      MaxExpFp = {{`Q_NE-`H_NE{1'b0}}, {`H_NE{1'b1}}}; | ||||
|                 end | ||||
|             endcase | ||||
|             assign MaxExp = ToInt ? Int64 ? 65 : 33 : MaxExpFp; | ||||
|             assign MaxExp = ToInt ? Int64 ? (`NE)'(65) : (`NE)'(33) : MaxExpFp; | ||||
|     end | ||||
| 
 | ||||
|     //                 if the result exponent is larger then the maximum possible exponent
 | ||||
|  | ||||
| @ -81,7 +81,7 @@ module fma( | ||||
|                  | ||||
|     // E/M pipeline registers
 | ||||
|     flopenrc #(3*`NF+6) EMRegFma2(clk, reset, FlushM, ~StallM, SumE, SumM);  | ||||
|     flopenrc #(13) EMRegFma3(clk, reset, FlushM, ~StallM, ProdExpE, ProdExpM);   | ||||
|     flopenrc #(`NE+2) EMRegFma3(clk, reset, FlushM, ~StallM, ProdExpE, ProdExpM);   | ||||
|     flopenrc #($clog2(3*`NF+7)+8) EMRegFma4(clk, reset, FlushM, ~StallM,  | ||||
|                             {AddendStickyE, KillProdE, InvZE, NormCntE, NegSumE, ZSgnEffE, PSgnE, FOpCtrlE[2]&~FOpCtrlE[1]&~FOpCtrlE[0], ZDenormE}, | ||||
|                             {AddendStickyM, KillProdM, InvZM, NormCntM, NegSumM, ZSgnEffM, PSgnM, Mult, ZDenormM}); | ||||
| @ -237,7 +237,7 @@ module align( | ||||
|     //      - positive means the product is larger, so shift Z right
 | ||||
|     // *** can we use ProdExpE instead of XExp/YExp to save an adder? DH 5/12/22
 | ||||
|     //      KP- yes we used ProdExpE originally but we did this for timing
 | ||||
|     assign AlignCnt = XZeroE|YZeroE ? -1 : {2'b0, XExpE} + {2'b0, YExpE} - {2'b0, (`NE)'(`BIAS)} + `NF+3 - {2'b0, ZExpE}; | ||||
|     assign AlignCnt = XZeroE|YZeroE ? -(`NE+2)'($unsigned(1)) : {2'b0, XExpE} + {2'b0, YExpE} - {2'b0, (`NE)'(`BIAS)} + (`NE+2)'(`NF)+3 - {2'b0, ZExpE}; | ||||
| 
 | ||||
|     // Defualt Addition without shifting
 | ||||
|     //          |   54'b0    |  106'b(product)  | 2'b0 |
 | ||||
| @ -320,7 +320,7 @@ module add( | ||||
| 
 | ||||
|     // Do the addition
 | ||||
|     //      - calculate a positive and negitive sum in parallel
 | ||||
|     assign PreSum = AlignedAddendInv + {55'b0, ProdManKilled, 2'b0} + {{3*`NF+6{1'b0}}, InvZE}; | ||||
|     assign PreSum = AlignedAddendInv + {{`NF+3{1'b0}}, ProdManKilled, 2'b0} + {{3*`NF+6{1'b0}}, InvZE}; | ||||
|     assign NegPreSum = XZeroE|YZeroE|KillProdE ? {1'b0, AlignedAddendE} : {1'b0, AlignedAddendE} + {{`NF+3{1'b1}}, ~ProdManKilled, 2'b0} + {(3*`NF+7)'(4)}; | ||||
|       | ||||
|     // Is the sum negitive
 | ||||
| @ -543,7 +543,7 @@ module normalize( | ||||
|     assign SumZero = ~(|SumM); | ||||
| 
 | ||||
|     // calculate the sum's exponent
 | ||||
|     assign SumExpTmpTmp = KillProdM ? {2'b0, ZExpM[`NE-1:1], ZExpM[0]&~ZDenormM} : ProdExpM + -({4'b0, NormCntM} + 1 - (`NF+4)); | ||||
|     assign SumExpTmpTmp = KillProdM ? {2'b0, ZExpM[`NE-1:1], ZExpM[0]&~ZDenormM} : ProdExpM + -({{`NE+2-$unsigned($clog2(3*`NF+7)){1'b0}}, NormCntM} + 1 - (`NE+2)'(`NF+4)); | ||||
| 
 | ||||
|     //convert the sum's exponent into the propper percision
 | ||||
|     if (`FPSIZES == 1) begin | ||||
| @ -556,8 +556,8 @@ module normalize( | ||||
|         always_comb begin | ||||
|             case (FmtM) | ||||
|                 `FMT: SumExpTmp = SumExpTmpTmp; | ||||
|                 `FMT1: SumExpTmp = (SumExpTmpTmp-`BIAS+`BIAS1)&{`NE+2{|SumExpTmpTmp}}; | ||||
|                 `FMT2: SumExpTmp = (SumExpTmpTmp-`BIAS+`BIAS2)&{`NE+2{|SumExpTmpTmp}}; | ||||
|                 `FMT1: SumExpTmp = (SumExpTmpTmp-(`NE+2)'(`BIAS)+(`NE+2)'(`BIAS1))&{`NE+2{|SumExpTmpTmp}}; | ||||
|                 `FMT2: SumExpTmp = (SumExpTmpTmp-(`NE+2)'(`BIAS)+(`NE+2)'(`BIAS2))&{`NE+2{|SumExpTmpTmp}}; | ||||
|                 default: SumExpTmp = `NE+2'bx; | ||||
|             endcase | ||||
|         end | ||||
| @ -566,9 +566,9 @@ module normalize( | ||||
|         always_comb begin | ||||
|             case (FmtM) | ||||
|                 2'h3: SumExpTmp = SumExpTmpTmp; | ||||
|                 2'h1: SumExpTmp = (SumExpTmpTmp-`BIAS+`D_BIAS)&{`NE+2{|SumExpTmpTmp}}; | ||||
|                 2'h0: SumExpTmp = (SumExpTmpTmp-`BIAS+`S_BIAS)&{`NE+2{|SumExpTmpTmp}}; | ||||
|                 2'h2: SumExpTmp = (SumExpTmpTmp-`BIAS+`H_BIAS)&{`NE+2{|SumExpTmpTmp}}; | ||||
|                 2'h1: SumExpTmp = (SumExpTmpTmp-(`NE+2)'(`BIAS)+(`NE+2)'(`D_BIAS))&{`NE+2{|SumExpTmpTmp}}; | ||||
|                 2'h0: SumExpTmp = (SumExpTmpTmp-(`NE+2)'(`BIAS)+(`NE+2)'(`S_BIAS))&{`NE+2{|SumExpTmpTmp}}; | ||||
|                 2'h2: SumExpTmp = (SumExpTmpTmp-(`NE+2)'(`BIAS)+(`NE+2)'(`H_BIAS))&{`NE+2{|SumExpTmpTmp}}; | ||||
|             endcase | ||||
|         end | ||||
| 
 | ||||
| @ -674,7 +674,7 @@ module normalize( | ||||
| 
 | ||||
|     // Determine sum's exponent
 | ||||
|     //                          if plus1                     If plus2                                      if said denorm but norm plus 1           if said denorm but norm plus 2
 | ||||
|     assign SumExp = (SumExpTmp+{12'b0, LZAPlus1&~KillProdM}+{11'b0, LZAPlus2&~KillProdM, 1'b0}+{12'b0, ~ResultDenorm&PreResultDenorm&~KillProdM}+{12'b0, &SumExpTmp&SumShifted[3*`NF+6]&~KillProdM}) & {`NE+2{~(SumZero|ResultDenorm)}}; | ||||
|     assign SumExp = (SumExpTmp+{{`NE+1{1'b0}}, LZAPlus1&~KillProdM}+{{`NE{1'b0}}, LZAPlus2&~KillProdM, 1'b0}+{{`NE+1{1'b0}}, ~ResultDenorm&PreResultDenorm&~KillProdM}+{{`NE+1{1'b0}}, &SumExpTmp&SumShifted[3*`NF+6]&~KillProdM}) & {`NE+2{~(SumZero|ResultDenorm)}}; | ||||
|     // recalculate if the result is denormalized
 | ||||
|     assign ResultDenorm = PreResultDenorm&~SumShifted[3*`NF+6]&~SumShifted[3*`NF+7]; | ||||
| 
 | ||||
|  | ||||
| @ -107,7 +107,7 @@ module fpu ( | ||||
|    logic 		  FOpCtrlQ;      | ||||
| 
 | ||||
|    // result and flag signals
 | ||||
|    logic [`FLEN-1:0] 	  FDivResM, FDivResW;                 // divide/squareroot result
 | ||||
|    logic [63:0] 	  FDivResM, FDivResW;                 // divide/squareroot result
 | ||||
|    logic [4:0] 	  FDivFlgM;                 // divide/squareroot flags  
 | ||||
|    logic [`FLEN-1:0] 	  FMAResM, FMAResW;                   // FMA/multiply result
 | ||||
|    logic [4:0] 	  FMAFlgM;                   // FMA/multiply result	
 | ||||
| @ -125,7 +125,7 @@ module fpu ( | ||||
|    logic [`FLEN-1:0] 	  FPUResultW;                         // final FP result being written to the FP register     
 | ||||
|    // other signals
 | ||||
|    logic 		  FDivSqrtDoneE;                      // is divide done
 | ||||
|    logic [`FLEN-1:0] 	  DivInput1E, DivInput2E;             // inputs to divide/squareroot unit
 | ||||
|    logic [63:0] 	  DivInput1E, DivInput2E;             // inputs to divide/squareroot unit
 | ||||
|    logic 		  load_preload;                       // enable for FF on fpdivsqrt     
 | ||||
|    logic [`FLEN-1:0] 	  AlignedSrcAE;                       // align SrcA to the floating point format
 | ||||
|    logic [`FLEN-1:0]     BoxedZeroE;                         // Zero value for Z for multiplication, with NaN boxing if needed
 | ||||
| @ -184,11 +184,11 @@ module fpu ( | ||||
|    generate | ||||
|    if(`FPSIZES == 1) assign BoxedZeroE = 0; | ||||
|    else if(`FPSIZES == 2)  | ||||
|       mux2 #(`FLEN) fmulzeromux ({{`FLEN-`LEN1{1'b1}}, {`FLEN-`LEN1{1'b0}}}, (`FLEN)'(0), FmtE, BoxedZeroE); // NaN boxing zeroes
 | ||||
|       mux2 #(`FLEN) fmulzeromux ({{`FLEN-`LEN1{1'b1}}, {`LEN1{1'b0}}}, (`FLEN)'(0), FmtE, BoxedZeroE); // NaN boxing zeroes
 | ||||
|    else if(`FPSIZES == 3 | `FPSIZES == 4) | ||||
|       mux4 #(`FLEN) fmulzeromux ({{`FLEN-`S_LEN{1'b1}}, (`FLEN-`S_LEN)'(0)},  | ||||
|                                  {{`FLEN-`D_LEN{1'b1}}, (`FLEN-`D_LEN)'(0)},  | ||||
|                                  {{`FLEN-`H_LEN{1'b1}}, (`FLEN-`H_LEN)'(0)},  | ||||
|       mux4 #(`FLEN) fmulzeromux ({{`FLEN-`S_LEN{1'b1}}, {`S_LEN{1'b0}}},  | ||||
|                                  {{`FLEN-`D_LEN{1'b1}}, {`D_LEN{1'b0}}},  | ||||
|                                  {{`FLEN-`H_LEN{1'b1}}, {`H_LEN{1'b0}}},  | ||||
|                                  (`FLEN)'(0), FmtE, BoxedZeroE); // NaN boxing zeroes
 | ||||
|    endgenerate | ||||
| 
 | ||||
| @ -218,17 +218,27 @@ module fpu ( | ||||
|       .FMAFlgM, .FMAResM); | ||||
| 
 | ||||
|    // fpdivsqrt using Goldschmidt's iteration
 | ||||
|    flopenrc #(`FLEN) reg_input1 (.d({XSgnE, XExpE, XManE[51:0]}), .q(DivInput1E), | ||||
|    if(`FLEN == 64) begin  | ||||
|    flopenrc #(64) reg_input1 (.d({FSrcXE[63:0]}), .q(DivInput1E), | ||||
|          .clear(FDivSqrtDoneE), .en(load_preload), | ||||
|          .reset(reset),  .clk(clk)); | ||||
|    flopenrc #(`FLEN) reg_input2 (.d({YSgnE, YExpE, YManE[51:0]}), .q(DivInput2E), | ||||
|    flopenrc #(64) reg_input2 (.d({FSrcYE[63:0]}), .q(DivInput2E), | ||||
|             .clear(FDivSqrtDoneE), .en(load_preload), | ||||
|             .reset(reset),  .clk(clk)); | ||||
|    flopenrc #(8+int'(`FMTBITS-1)) reg_input3 (.d({XNaNE, YNaNE, XInfE, YInfE, XZeroE, YZeroE, FmtE, FOpCtrlE[0]}),  | ||||
|    end | ||||
|    else if (`FLEN == 32) begin  | ||||
|    flopenrc #(64) reg_input1 (.d({32'b0, FSrcXE[31:0]}), .q(DivInput1E), | ||||
|          .clear(FDivSqrtDoneE), .en(load_preload), | ||||
|          .reset(reset),  .clk(clk)); | ||||
|    flopenrc #(64) reg_input2 (.d({32'b0, FSrcYE[31:0]}), .q(DivInput2E), | ||||
|             .clear(FDivSqrtDoneE), .en(load_preload), | ||||
|             .reset(reset),  .clk(clk)); | ||||
|    end | ||||
|    flopenrc #(8) reg_input3 (.d({XNaNE, YNaNE, XInfE, YInfE, XZeroE, YZeroE, FmtE[0], FOpCtrlE[0]}),  | ||||
|             .q({XNaNQ, YNaNQ, XInfQ, YInfQ, XZeroQ, YZeroQ, FmtQ, FOpCtrlQ}), | ||||
|             .clear(FDivSqrtDoneE), .en(load_preload), | ||||
|             .reset(reset),  .clk(clk)); | ||||
|    fpdiv_pipe fdivsqrt (.op1(DivInput1E), .op2(DivInput2E), .rm(FrmE[1:0]), .op_type(FOpCtrlQ),  | ||||
|    fpdiv_pipe fdivsqrt (.op1(DivInput1E[63:0]), .op2(DivInput2E[63:0]), .rm(FrmE[1:0]), .op_type(FOpCtrlQ),  | ||||
|          .reset, .clk(clk), .start(FDivStartE), .P(~FmtQ), .OvEn(1'b1), .UnEn(1'b1), | ||||
|          .XNaNQ, .YNaNQ, .XInfQ, .YInfQ, .XZeroQ, .YZeroQ, .load_preload, | ||||
|          .FDivBusyE, .done(FDivSqrtDoneE), .AS_Result(FDivResM), .Flags(FDivFlgM)); | ||||
| @ -244,7 +254,8 @@ module fpu ( | ||||
|    // data to be stored in memory - to IEU
 | ||||
|    //    - FP uses NaN-blocking format
 | ||||
|    //        - if there are any unsused bits the most significant bits are filled with 1s
 | ||||
|    assign FWriteDataE = FSrcYE[`XLEN-1:0];      | ||||
|    if (`FLEN>`XLEN) assign FWriteDataE = FSrcYE[`XLEN-1:0];  | ||||
|    else assign FWriteDataE = {{`XLEN-`FLEN{FSrcYE[`FLEN-1]}}, FSrcYE};  | ||||
| 
 | ||||
|    // NaN Block SrcA
 | ||||
|    generate | ||||
| @ -262,8 +273,12 @@ module fpu ( | ||||
|    mux4  #(5)  FFlgMux(5'b0, 5'b0, {CmpNVE, 4'b0}, CvtFlgE, FResSelE, FFlgE); | ||||
| 
 | ||||
|    // select the result that may be written to the integer register - to IEU
 | ||||
|    mux4  #(`XLEN)  IntResMux(CmpResE[`XLEN-1:0], FSrcXE[`XLEN-1:0], ClassResE,  | ||||
|                CvtIntResE, FIntResSelE, FIntResE); | ||||
|    if (`FLEN>`XLEN)  | ||||
|       mux4  #(`XLEN)  IntResMux(CmpResE[`XLEN-1:0], FSrcXE[`XLEN-1:0], ClassResE,  | ||||
|                   CvtIntResE, FIntResSelE, FIntResE); | ||||
|    else  | ||||
|       mux4  #(`XLEN)  IntResMux({{`XLEN-`FLEN{CmpResE[`FLEN-1:0]}}, CmpResE}, {{`XLEN-`FLEN{FSrcXE[`FLEN-1:0]}}, FSrcXE}, ClassResE,  | ||||
|                   CvtIntResE, FIntResSelE, FIntResE); | ||||
|    // *** DH 5/25/22: CvtRes will move to mem stage.  Premux in execute to save area, then make sure stalls are ok
 | ||||
|    // *** make sure the fpu matches the chapter diagram
 | ||||
| 
 | ||||
| @ -290,7 +305,7 @@ module fpu ( | ||||
| 
 | ||||
|    // M/W pipe registers
 | ||||
|    flopenrc #(`FLEN) MWRegFma(clk, reset, FlushW, ~StallW, FMAResM, FMAResW);  | ||||
|    flopenrc #(`FLEN) MWRegDiv(clk, reset, FlushW, ~StallW, FDivResM, FDivResW);  | ||||
|    flopenrc #(64) MWRegDiv(clk, reset, FlushW, ~StallW, FDivResM, FDivResW);  | ||||
|    flopenrc #(`FLEN) MWRegClass(clk, reset, FlushW, ~StallW, FResM, FResW); | ||||
|    flopenrc #(4+int'(`FMTBITS-1))  MWCtrlReg(clk, reset, FlushW, ~StallW, | ||||
|             {FRegWriteM, FResultSelM, FmtM}, | ||||
| @ -313,5 +328,6 @@ module fpu ( | ||||
|    endgenerate | ||||
| 
 | ||||
|    // select the result to be written to the FP register
 | ||||
|    mux4  #(`FLEN)  FPUResultMux (ReadResW, FMAResW, FDivResW, FResW, FResultSelW, FPUResultW); | ||||
|    if(`FLEN>=64) | ||||
|    mux4  #(`FLEN)  FPUResultMux (ReadResW, FMAResW, {{`FLEN-64{1'b0}},FDivResW}, FResW, FResultSelW, FPUResultW); | ||||
| endmodule // fpu
 | ||||
|  | ||||
| @ -1,11 +1,11 @@ | ||||
| `include "wally-config.vh" | ||||
| 
 | ||||
| module unpack (  | ||||
|     input logic  [$signed(`FLEN)-$signed(1):0]        X, Y, Z,    // inputs from register file
 | ||||
|     input logic  [$signed(`FMTBITS)-$signed(1):0]     FmtE,       // format signal 00 - single 01 - double 11 - quad 10 - half
 | ||||
|     input logic  [`FLEN-1:0]        X, Y, Z,    // inputs from register file
 | ||||
|     input logic  [`FMTBITS-1:0]     FmtE,       // format signal 00 - single 01 - double 11 - quad 10 - half
 | ||||
|     output logic                    XSgnE, YSgnE, ZSgnE,    // sign bits of XYZ
 | ||||
|     output logic [$signed(`NE)-$signed(1):0]          XExpE, YExpE, ZExpE,    // exponents of XYZ (converted to largest supported precision)
 | ||||
|     output logic [$signed(`NF):0]            XManE, YManE, ZManE,    // mantissas of XYZ (converted to largest supported precision)
 | ||||
|     output logic [`NE-1:0]          XExpE, YExpE, ZExpE,    // exponents of XYZ (converted to largest supported precision)
 | ||||
|     output logic [`NF:0]            XManE, YManE, ZManE,    // mantissas of XYZ (converted to largest supported precision)
 | ||||
|     output logic                    XNaNE, YNaNE, ZNaNE,    // is XYZ a NaN
 | ||||
|     output logic                    XSNaNE, YSNaNE, ZSNaNE, // is XYZ a signaling NaN
 | ||||
|     output logic                    XDenormE, ZDenormE,   // is XYZ denormalized
 | ||||
| @ -14,7 +14,7 @@ module unpack ( | ||||
|     output logic                    XExpMaxE                        // does X have the maximum exponent (NaN or Inf)
 | ||||
| ); | ||||
|   | ||||
|     logic [$signed(`NF)-$signed(1):0] XFracE, YFracE, ZFracE; //Fraction of XYZ
 | ||||
|     logic [`NF-1:0] XFracE, YFracE, ZFracE; //Fraction of XYZ
 | ||||
|     logic           XExpNonZero, YExpNonZero, ZExpNonZero; // is the exponent of XYZ non-zero
 | ||||
|     logic           XFracZero, YFracZero, ZFracZero; // is the fraction zero
 | ||||
|     logic           YExpMaxE, ZExpMaxE;  // is the exponent all 1s
 | ||||
|  | ||||
| @ -261,26 +261,26 @@ module testbenchfp; | ||||
|             Fmt = {Fmt, 2'b11}; | ||||
|           end | ||||
|       end | ||||
|       if (TEST === "div"   | TEST === "all") begin // if division is being tested
 | ||||
|         // add the divide tests/op-ctrls/unit/fmt
 | ||||
|         Tests = {Tests, f128div}; | ||||
|         OpCtrl = {OpCtrl, `DIV_OPCTRL}; | ||||
|         WriteInt = {WriteInt, 1'b0}; | ||||
|           for(int i = 0; i<5; i++) begin | ||||
|             Unit = {Unit, `DIVUNIT}; | ||||
|             Fmt = {Fmt, 2'b11}; | ||||
|           end | ||||
|       end | ||||
|       if (TEST === "sqrt"  | TEST === "all") begin // if square-root is being tested
 | ||||
|         // add the square-root tests/op-ctrls/unit/fmt
 | ||||
|         Tests = {Tests, f128sqrt}; | ||||
|         OpCtrl = {OpCtrl, `SQRT_OPCTRL}; | ||||
|         WriteInt = {WriteInt, 1'b0}; | ||||
|           for(int i = 0; i<5; i++) begin | ||||
|             Unit = {Unit, `DIVUNIT}; | ||||
|             Fmt = {Fmt, 2'b11}; | ||||
|           end | ||||
|       end | ||||
|       // if (TEST === "div"   | TEST === "all") begin // if division is being tested
 | ||||
|       //   // add the divide tests/op-ctrls/unit/fmt
 | ||||
|       //   Tests = {Tests, f128div};
 | ||||
|       //   OpCtrl = {OpCtrl, `DIV_OPCTRL};
 | ||||
|       //   WriteInt = {WriteInt, 1'b0};
 | ||||
|       //     for(int i = 0; i<5; i++) begin
 | ||||
|       //       Unit = {Unit, `DIVUNIT};
 | ||||
|       //       Fmt = {Fmt, 2'b11};
 | ||||
|       //     end
 | ||||
|       // end
 | ||||
|       // if (TEST === "sqrt"  | TEST === "all") begin // if square-root is being tested
 | ||||
|       //   // add the square-root tests/op-ctrls/unit/fmt
 | ||||
|       //   Tests = {Tests, f128sqrt};
 | ||||
|       //   OpCtrl = {OpCtrl, `SQRT_OPCTRL};
 | ||||
|       //   WriteInt = {WriteInt, 1'b0};
 | ||||
|       //     for(int i = 0; i<5; i++) begin
 | ||||
|       //       Unit = {Unit, `DIVUNIT};
 | ||||
|       //       Fmt = {Fmt, 2'b11};
 | ||||
|       //     end
 | ||||
|       // end
 | ||||
|       if (TEST === "fma"   | TEST === "all") begin  // if fused-mutliply-add is being tested
 | ||||
|         // add each rounding mode to it's own list of tests
 | ||||
|         //    - fma tests are very long, so run all rounding modes in parallel
 | ||||
| @ -390,26 +390,26 @@ module testbenchfp; | ||||
|           Fmt = {Fmt, 2'b01}; | ||||
|         end | ||||
|       end | ||||
|       if (TEST === "div"   | TEST === "all") begin // if division is being tested
 | ||||
|         // add the correct tests/op-ctrls/unit/fmt to their lists
 | ||||
|         Tests = {Tests, f64div}; | ||||
|         OpCtrl = {OpCtrl, `DIV_OPCTRL}; | ||||
|         WriteInt = {WriteInt, 1'b0}; | ||||
|         for(int i = 0; i<5; i++) begin | ||||
|           Unit = {Unit, `DIVUNIT}; | ||||
|           Fmt = {Fmt, 2'b01}; | ||||
|         end | ||||
|       end | ||||
|       if (TEST === "sqrt"  | TEST === "all") begin // if square-root is being tessted
 | ||||
|         // add the correct tests/op-ctrls/unit/fmt to their lists
 | ||||
|         Tests = {Tests, f64sqrt}; | ||||
|         OpCtrl = {OpCtrl, `SQRT_OPCTRL}; | ||||
|         WriteInt = {WriteInt, 1'b0}; | ||||
|         for(int i = 0; i<5; i++) begin | ||||
|           Unit = {Unit, `DIVUNIT}; | ||||
|           Fmt = {Fmt, 2'b01}; | ||||
|         end | ||||
|       end | ||||
|       // if (TEST === "div"   | TEST === "all") begin // if division is being tested
 | ||||
|       //   // add the correct tests/op-ctrls/unit/fmt to their lists
 | ||||
|       //   Tests = {Tests, f64div};
 | ||||
|       //   OpCtrl = {OpCtrl, `DIV_OPCTRL};
 | ||||
|       //   WriteInt = {WriteInt, 1'b0};
 | ||||
|       //   for(int i = 0; i<5; i++) begin
 | ||||
|       //     Unit = {Unit, `DIVUNIT};
 | ||||
|       //     Fmt = {Fmt, 2'b01};
 | ||||
|       //   end
 | ||||
|       // end
 | ||||
|       // if (TEST === "sqrt"  | TEST === "all") begin // if square-root is being tessted
 | ||||
|       //   // add the correct tests/op-ctrls/unit/fmt to their lists
 | ||||
|       //   Tests = {Tests, f64sqrt};
 | ||||
|       //   OpCtrl = {OpCtrl, `SQRT_OPCTRL};
 | ||||
|       //   WriteInt = {WriteInt, 1'b0};
 | ||||
|       //   for(int i = 0; i<5; i++) begin
 | ||||
|       //     Unit = {Unit, `DIVUNIT};
 | ||||
|       //     Fmt = {Fmt, 2'b01};
 | ||||
|       //   end
 | ||||
|       // end
 | ||||
|       if (TEST === "fma"   | TEST === "all") begin // if the fused multiply add is being tested
 | ||||
|         // add each rounding mode to it's own list of tests
 | ||||
|         //    - fma tests are very long, so run all rounding modes in parallel
 | ||||
| @ -502,26 +502,26 @@ module testbenchfp; | ||||
|           Fmt = {Fmt, 2'b00}; | ||||
|         end | ||||
|       end | ||||
|       if (TEST === "div"   | TEST === "all") begin // if division is being tested
 | ||||
|         // add the correct tests/op-ctrls/unit/fmt to their lists
 | ||||
|         Tests = {Tests, f32div}; | ||||
|         OpCtrl = {OpCtrl, `DIV_OPCTRL}; | ||||
|         WriteInt = {WriteInt, 1'b0}; | ||||
|         for(int i = 0; i<5; i++) begin | ||||
|           Unit = {Unit, `DIVUNIT}; | ||||
|           Fmt = {Fmt, 2'b00}; | ||||
|         end | ||||
|       end | ||||
|       if (TEST === "sqrt"  | TEST === "all") begin // if sqrt is being tested
 | ||||
|         // add the correct tests/op-ctrls/unit/fmt to their lists
 | ||||
|         Tests = {Tests, f32sqrt}; | ||||
|         OpCtrl = {OpCtrl, `SQRT_OPCTRL}; | ||||
|         WriteInt = {WriteInt, 1'b0}; | ||||
|         for(int i = 0; i<5; i++) begin | ||||
|           Unit = {Unit, `DIVUNIT}; | ||||
|           Fmt = {Fmt, 2'b00}; | ||||
|         end | ||||
|       end | ||||
|       // if (TEST === "div"   | TEST === "all") begin // if division is being tested
 | ||||
|       //   // add the correct tests/op-ctrls/unit/fmt to their lists
 | ||||
|       //   Tests = {Tests, f32div};
 | ||||
|       //   OpCtrl = {OpCtrl, `DIV_OPCTRL};
 | ||||
|       //   WriteInt = {WriteInt, 1'b0};
 | ||||
|       //   for(int i = 0; i<5; i++) begin
 | ||||
|       //     Unit = {Unit, `DIVUNIT};
 | ||||
|       //     Fmt = {Fmt, 2'b00};
 | ||||
|       //   end
 | ||||
|       // end
 | ||||
|       // if (TEST === "sqrt"  | TEST === "all") begin // if sqrt is being tested
 | ||||
|       //   // add the correct tests/op-ctrls/unit/fmt to their lists
 | ||||
|       //   Tests = {Tests, f32sqrt};
 | ||||
|       //   OpCtrl = {OpCtrl, `SQRT_OPCTRL};
 | ||||
|       //   WriteInt = {WriteInt, 1'b0};
 | ||||
|       //   for(int i = 0; i<5; i++) begin
 | ||||
|       //     Unit = {Unit, `DIVUNIT};
 | ||||
|       //     Fmt = {Fmt, 2'b00};
 | ||||
|       //   end
 | ||||
|       // end
 | ||||
|       if (TEST === "fma"   | TEST === "all")  begin // if fma is being tested
 | ||||
|         // add each rounding mode to it's own list of tests
 | ||||
|         //    - fma tests are very long, so run all rounding modes in parallel
 | ||||
| @ -596,26 +596,26 @@ module testbenchfp; | ||||
|           Fmt = {Fmt, 2'b10}; | ||||
|         end | ||||
|       end | ||||
|       if (TEST === "div"   | TEST === "all") begin // if division is being tested
 | ||||
|         // add the correct tests/op-ctrls/unit/fmt to their lists
 | ||||
|         Tests = {Tests, f16div}; | ||||
|         OpCtrl = {OpCtrl, `DIV_OPCTRL}; | ||||
|         WriteInt = {WriteInt, 1'b0}; | ||||
|         for(int i = 0; i<5; i++) begin | ||||
|           Unit = {Unit, `DIVUNIT}; | ||||
|           Fmt = {Fmt, 2'b10}; | ||||
|         end | ||||
|       end | ||||
|       if (TEST === "sqrt"  | TEST === "all") begin // if sqrt is being tested
 | ||||
|         // add the correct tests/op-ctrls/unit/fmt to their lists
 | ||||
|         Tests = {Tests, f16sqrt}; | ||||
|         OpCtrl = {OpCtrl, `SQRT_OPCTRL}; | ||||
|         WriteInt = {WriteInt, 1'b0}; | ||||
|         for(int i = 0; i<5; i++) begin | ||||
|           Unit = {Unit, `DIVUNIT}; | ||||
|           Fmt = {Fmt, 2'b10}; | ||||
|         end | ||||
|       end | ||||
|       // if (TEST === "div"   | TEST === "all") begin // if division is being tested
 | ||||
|       //   // add the correct tests/op-ctrls/unit/fmt to their lists
 | ||||
|       //   Tests = {Tests, f16div};
 | ||||
|       //   OpCtrl = {OpCtrl, `DIV_OPCTRL};
 | ||||
|       //   WriteInt = {WriteInt, 1'b0};
 | ||||
|       //   for(int i = 0; i<5; i++) begin
 | ||||
|       //     Unit = {Unit, `DIVUNIT};
 | ||||
|       //     Fmt = {Fmt, 2'b10};
 | ||||
|       //   end
 | ||||
|       // end
 | ||||
|       // if (TEST === "sqrt"  | TEST === "all") begin // if sqrt is being tested
 | ||||
|       //   // add the correct tests/op-ctrls/unit/fmt to their lists
 | ||||
|       //   Tests = {Tests, f16sqrt};
 | ||||
|       //   OpCtrl = {OpCtrl, `SQRT_OPCTRL};
 | ||||
|       //   WriteInt = {WriteInt, 1'b0};
 | ||||
|       //   for(int i = 0; i<5; i++) begin
 | ||||
|       //     Unit = {Unit, `DIVUNIT};
 | ||||
|       //     Fmt = {Fmt, 2'b10};
 | ||||
|       //   end
 | ||||
|       // end
 | ||||
|       if (TEST === "fma"   | TEST === "all") begin // if fma is being tested
 | ||||
|         // add each rounding mode to it's own list of tests
 | ||||
|         //    - fma tests are very long, so run all rounding modes in parallel
 | ||||
| @ -673,10 +673,10 @@ module testbenchfp; | ||||
|   //    - 1 for the larger precision
 | ||||
|   //    - 0 for the smaller precision
 | ||||
|   always_comb begin | ||||
|     if(`FMTBITS == 2) ModFmt = FmtVal; | ||||
|     else ModFmt = FmtVal === `FMT; | ||||
|     if(`FMTBITS == 2) FmaModFmt = FmaFmtVal; | ||||
|     else FmaModFmt = FmaFmtVal === `FMT; | ||||
|     if(`FMTBITS == 1) ModFmt = FmtVal == `FMT; | ||||
|     else ModFmt = FmtVal; | ||||
|     if(`FMTBITS == 1) FmaModFmt = FmaFmtVal == `FMT; | ||||
|     else FmaModFmt = FmaFmtVal; | ||||
|   end | ||||
| 
 | ||||
|   // extract the inputs (X, Y, Z, SrcA) and the output (Ans, AnsFlg) from the current test vector
 | ||||
| @ -1028,111 +1028,111 @@ end | ||||
|     //    - the sign of the NaN does not matter for the opperations being tested
 | ||||
|     //    - when 2 or more NaNs are inputed the NaN that is propigated doesn't matter
 | ||||
|     case (FmaFmtVal) | ||||
|       4'b11: FmaRneNaNGood =(((`IEEE754==0)&(FmaRneRes === {1'b0, {`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|       4'b11: FmaRneNaNGood =(((`IEEE754==0)&FmaRneAnsNaN&(FmaRneRes === {1'b0, {`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|                             (FmaRneAnsFlg[4]&(FmaRneRes[`Q_LEN-2:0] === {{`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|                             (FmaRneXNaN&(FmaRneRes[`Q_LEN-2:0] === {FmaRneX[`Q_LEN-2:`Q_NF],1'b1,FmaRneX[`Q_NF-2:0]})) |  | ||||
|                             (FmaRneYNaN&(FmaRneRes[`Q_LEN-2:0] === {FmaRneY[`Q_LEN-2:`Q_NF],1'b1,FmaRneY[`Q_NF-2:0]})) |  | ||||
|                             (FmaRneZNaN&(FmaRneRes[`Q_LEN-2:0] === {FmaRneZ[`Q_LEN-2:`Q_NF],1'b1,FmaRneZ[`Q_NF-2:0]}))); | ||||
|       4'b01: FmaRneNaNGood =(((`IEEE754==0)&(FmaRneRes === {1'b0, {`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|       4'b01: FmaRneNaNGood =(((`IEEE754==0)&FmaRneAnsNaN&(FmaRneRes[`D_LEN-1:0] === {1'b0, {`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|                             (FmaRneAnsFlg[4]&(FmaRneRes[`D_LEN-2:0] === {{`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|                             (FmaRneXNaN&(FmaRneRes[`D_LEN-2:0] === {FmaRneX[`D_LEN-2:`D_NF],1'b1,FmaRneX[`D_NF-2:0]})) |  | ||||
|                             (FmaRneYNaN&(FmaRneRes[`D_LEN-2:0] === {FmaRneY[`D_LEN-2:`D_NF],1'b1,FmaRneY[`D_NF-2:0]})) |  | ||||
|                             (FmaRneZNaN&(FmaRneRes[`D_LEN-2:0] === {FmaRneZ[`D_LEN-2:`D_NF],1'b1,FmaRneZ[`D_NF-2:0]}))); | ||||
|       4'b00: FmaRneNaNGood =(((`IEEE754==0)&(FmaRneRes === {1'b0, {`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|       4'b00: FmaRneNaNGood =(((`IEEE754==0)&FmaRneAnsNaN&(FmaRneRes[`S_LEN-1:0] === {1'b0, {`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|                             (FmaRneAnsFlg[4]&(FmaRneRes[`S_LEN-2:0] === {{`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|                             (FmaRneXNaN&(FmaRneRes[`S_LEN-2:0] === {FmaRneX[`S_LEN-2:`S_NF],1'b1,FmaRneX[`S_NF-2:0]})) |  | ||||
|                             (FmaRneYNaN&(FmaRneRes[`S_LEN-2:0] === {FmaRneY[`S_LEN-2:`S_NF],1'b1,FmaRneY[`S_NF-2:0]})) |  | ||||
|                             (FmaRneZNaN&(FmaRneRes[`S_LEN-2:0] === {FmaRneZ[`S_LEN-2:`S_NF],1'b1,FmaRneZ[`S_NF-2:0]}))); | ||||
|       4'b10: FmaRneNaNGood =(((`IEEE754==0)&(FmaRneRes === {1'b0, {`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|       4'b10: FmaRneNaNGood =(((`IEEE754==0)&FmaRneAnsNaN&(FmaRneRes[`H_LEN-1:0] === {1'b0, {`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|                             (FmaRneAnsFlg[4]&(FmaRneRes[`H_LEN-2:0] === {{`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|                             (FmaRneXNaN&(FmaRneRes[`H_LEN-2:0] === {FmaRneX[`H_LEN-2:`H_NF],1'b1,FmaRneX[`H_NF-2:0]})) |  | ||||
|                             (FmaRneYNaN&(FmaRneRes[`H_LEN-2:0] === {FmaRneY[`H_LEN-2:`H_NF],1'b1,FmaRneY[`H_NF-2:0]})) |  | ||||
|                             (FmaRneZNaN&(FmaRneRes[`H_LEN-2:0] === {FmaRneZ[`H_LEN-2:`H_NF],1'b1,FmaRneZ[`H_NF-2:0]}))); | ||||
|     endcase | ||||
|     case (FmaFmtVal) | ||||
|       4'b11: FmaRzNaNGood = (((`IEEE754==0)&(FmaRneRes === {1'b0, {`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|       4'b11: FmaRzNaNGood = (((`IEEE754==0)&FmaRzAnsNaN&(FmaRzRes === {1'b0, {`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|                             (FmaRzAnsFlg[4]&(FmaRzRes[`Q_LEN-2:0] === {{`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|                             (FmaRzXNaN&(FmaRzRes[`Q_LEN-2:0] === {FmaRzX[`Q_LEN-2:`Q_NF],1'b1,FmaRzX[`Q_NF-2:0]})) |  | ||||
|                             (FmaRzYNaN&(FmaRzRes[`Q_LEN-2:0] === {FmaRzY[`Q_LEN-2:`Q_NF],1'b1,FmaRzY[`Q_NF-2:0]})) |  | ||||
|                             (FmaRzZNaN&(FmaRzRes[`Q_LEN-2:0] === {FmaRzZ[`Q_LEN-2:`Q_NF],1'b1,FmaRzZ[`Q_NF-2:0]}))); | ||||
|       4'b01: FmaRzNaNGood = (((`IEEE754==0)&(FmaRneRes === {1'b0, {`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|       4'b01: FmaRzNaNGood = (((`IEEE754==0)&FmaRzAnsNaN&(FmaRzRes[`D_LEN-1:0] === {1'b0, {`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|                             (FmaRzAnsFlg[4]&(FmaRzRes[`D_LEN-2:0] === {{`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|                             (FmaRzXNaN&(FmaRzRes[`D_LEN-2:0] === {FmaRzX[`D_LEN-2:`D_NF],1'b1,FmaRzX[`D_NF-2:0]})) |  | ||||
|                             (FmaRzYNaN&(FmaRzRes[`D_LEN-2:0] === {FmaRzY[`D_LEN-2:`D_NF],1'b1,FmaRzY[`D_NF-2:0]})) |  | ||||
|                             (FmaRzZNaN&(FmaRzRes[`D_LEN-2:0] === {FmaRzZ[`D_LEN-2:`D_NF],1'b1,FmaRzZ[`D_NF-2:0]}))); | ||||
|       4'b00: FmaRzNaNGood = (((`IEEE754==0)&(FmaRneRes === {1'b0, {`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|       4'b00: FmaRzNaNGood = (((`IEEE754==0)&FmaRzAnsNaN&(FmaRzRes[`S_LEN-1:0] === {1'b0, {`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|                             (FmaRzAnsFlg[4]&(FmaRzRes[`S_LEN-2:0] === {{`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|                             (FmaRzXNaN&(FmaRzRes[`S_LEN-2:0] === {FmaRzX[`S_LEN-2:`S_NF],1'b1,FmaRzX[`S_NF-2:0]})) |  | ||||
|                             (FmaRzYNaN&(FmaRzRes[`S_LEN-2:0] === {FmaRzY[`S_LEN-2:`S_NF],1'b1,FmaRzY[`S_NF-2:0]})) |  | ||||
|                             (FmaRzZNaN&(FmaRzRes[`S_LEN-2:0] === {FmaRzZ[`S_LEN-2:`S_NF],1'b1,FmaRzZ[`S_NF-2:0]}))); | ||||
|       4'b10: FmaRzNaNGood = (((`IEEE754==0)&(FmaRneRes === {1'b0, {`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|       4'b10: FmaRzNaNGood = (((`IEEE754==0)&FmaRzAnsNaN&(FmaRzRes[`H_LEN-1:0] === {1'b0, {`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|                             (FmaRzAnsFlg[4]&(FmaRzRes[`H_LEN-2:0] === {{`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|                             (FmaRzXNaN&(FmaRzRes[`H_LEN-2:0] === {FmaRzX[`H_LEN-2:`H_NF],1'b1,FmaRzX[`H_NF-2:0]})) |  | ||||
|                             (FmaRzYNaN&(FmaRzRes[`H_LEN-2:0] === {FmaRzY[`H_LEN-2:`H_NF],1'b1,FmaRzY[`H_NF-2:0]})) |  | ||||
|                             (FmaRzZNaN&(FmaRzRes[`H_LEN-2:0] === {FmaRzZ[`H_LEN-2:`H_NF],1'b1,FmaRzZ[`H_NF-2:0]}))); | ||||
|     endcase | ||||
|     case (FmaFmtVal) | ||||
|       4'b11: FmaRuNaNGood = (((`IEEE754==0)&(FmaRneRes === {1'b0, {`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|       4'b11: FmaRuNaNGood = (((`IEEE754==0)&FmaRuAnsNaN&(FmaRuRes === {1'b0, {`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|                             (FmaRuAnsFlg[4]&(FmaRuRes[`Q_LEN-2:0] === {{`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|                             (FmaRuXNaN&(FmaRuRes[`Q_LEN-2:0] === {FmaRuX[`Q_LEN-2:`Q_NF],1'b1,FmaRuX[`Q_NF-2:0]})) |  | ||||
|                             (FmaRuYNaN&(FmaRuRes[`Q_LEN-2:0] === {FmaRuY[`Q_LEN-2:`Q_NF],1'b1,FmaRuY[`Q_NF-2:0]})) |  | ||||
|                             (FmaRuZNaN&(FmaRuRes[`Q_LEN-2:0] === {FmaRuZ[`Q_LEN-2:`Q_NF],1'b1,FmaRuZ[`Q_NF-2:0]}))); | ||||
|       4'b01: FmaRuNaNGood = (((`IEEE754==0)&(FmaRneRes === {1'b0, {`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|       4'b01: FmaRuNaNGood = (((`IEEE754==0)&FmaRuAnsNaN&(FmaRuRes[`D_LEN-1:0] === {1'b0, {`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|                             (FmaRuAnsFlg[4]&(FmaRuRes[`D_LEN-2:0] === {{`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|                             (FmaRuAnsFlg[4]&(FmaRuRes[`Q_LEN-2:0] === {{`D_NE+1{1'b1}}, {`D_NF{1'b0}}})) | | ||||
|                             (FmaRuXNaN&(FmaRuRes[`D_LEN-2:0] === {FmaRuX[`D_LEN-2:`D_NF],1'b1,FmaRuX[`D_NF-2:0]})) |  | ||||
|                             (FmaRuYNaN&(FmaRuRes[`D_LEN-2:0] === {FmaRuY[`D_LEN-2:`D_NF],1'b1,FmaRuY[`D_NF-2:0]})) |  | ||||
|                             (FmaRuZNaN&(FmaRuRes[`D_LEN-2:0] === {FmaRuZ[`D_LEN-2:`D_NF],1'b1,FmaRuZ[`D_NF-2:0]}))); | ||||
|       4'b00: FmaRuNaNGood = (((`IEEE754==0)&(FmaRneRes === {1'b0, {`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|       4'b00: FmaRuNaNGood = (((`IEEE754==0)&FmaRuAnsNaN&(FmaRuRes[`S_LEN-1:0] === {1'b0, {`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|                             (FmaRuAnsFlg[4]&(FmaRuRes[`S_LEN-2:0] === {{`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|                             (FmaRuXNaN&(FmaRuRes[`S_LEN-2:0] === {FmaRuX[`S_LEN-2:`S_NF],1'b1,FmaRuX[`S_NF-2:0]})) |  | ||||
|                             (FmaRuYNaN&(FmaRuRes[`S_LEN-2:0] === {FmaRuY[`S_LEN-2:`S_NF],1'b1,FmaRuY[`S_NF-2:0]})) |  | ||||
|                             (FmaRuZNaN&(FmaRuRes[`S_LEN-2:0] === {FmaRuZ[`S_LEN-2:`S_NF],1'b1,FmaRuZ[`S_NF-2:0]}))); | ||||
|       4'b10: FmaRuNaNGood = (((`IEEE754==0)&(FmaRneRes === {1'b0, {`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|       4'b10: FmaRuNaNGood = (((`IEEE754==0)&FmaRuAnsNaN&(FmaRuRes[`H_LEN-1:0] === {1'b0, {`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|                             (FmaRuAnsFlg[4]&(FmaRuRes[`H_LEN-2:0] === {{`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|                             (FmaRuXNaN&(FmaRuRes[`H_LEN-2:0] === {FmaRuX[`H_LEN-2:`H_NF],1'b1,FmaRuX[`H_NF-2:0]})) |  | ||||
|                             (FmaRuYNaN&(FmaRuRes[`H_LEN-2:0] === {FmaRuY[`H_LEN-2:`H_NF],1'b1,FmaRuY[`H_NF-2:0]})) |  | ||||
|                             (FmaRuZNaN&(FmaRuRes[`H_LEN-2:0] === {FmaRuZ[`H_LEN-2:`H_NF],1'b1,FmaRuZ[`H_NF-2:0]}))); | ||||
|     endcase | ||||
|     case (FmaFmtVal) | ||||
|       4'b11: FmaRdNaNGood = (((`IEEE754==0)&(FmaRneRes === {1'b0, {`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|       4'b11: FmaRdNaNGood = (((`IEEE754==0)&FmaRdAnsNaN&(FmaRdRes === {1'b0, {`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|                             (FmaRdAnsFlg[4]&(FmaRdRes[`Q_LEN-2:0] === {{`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|                             (FmaRdXNaN&(FmaRdRes[`Q_LEN-2:0] === {FmaRdX[`Q_LEN-2:`Q_NF],1'b1,FmaRdX[`Q_NF-2:0]})) |  | ||||
|                             (FmaRdYNaN&(FmaRdRes[`Q_LEN-2:0] === {FmaRdY[`Q_LEN-2:`Q_NF],1'b1,FmaRdY[`Q_NF-2:0]})) |  | ||||
|                             (FmaRdZNaN&(FmaRdRes[`Q_LEN-2:0] === {FmaRdZ[`Q_LEN-2:`Q_NF],1'b1,FmaRdZ[`Q_NF-2:0]}))); | ||||
|       4'b01: FmaRdNaNGood = (((`IEEE754==0)&(FmaRneRes === {1'b0, {`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|       4'b01: FmaRdNaNGood = (((`IEEE754==0)&FmaRdAnsNaN&(FmaRdRes[`D_LEN-1:0] === {1'b0, {`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|                             (FmaRdAnsFlg[4]&(FmaRdRes[`D_LEN-2:0] === {{`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|                             (FmaRdXNaN&(FmaRdRes[`D_LEN-2:0] === {FmaRdX[`D_LEN-2:`D_NF],1'b1,FmaRdX[`D_NF-2:0]})) |  | ||||
|                             (FmaRdYNaN&(FmaRdRes[`D_LEN-2:0] === {FmaRdY[`D_LEN-2:`D_NF],1'b1,FmaRdY[`D_NF-2:0]})) |  | ||||
|                             (FmaRdZNaN&(FmaRdRes[`D_LEN-2:0] === {FmaRdZ[`D_LEN-2:`D_NF],1'b1,FmaRdZ[`D_NF-2:0]}))); | ||||
|       4'b00: FmaRdNaNGood = (((`IEEE754==0)&(FmaRneRes === {1'b0, {`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|       4'b00: FmaRdNaNGood = (((`IEEE754==0)&FmaRdAnsNaN&(FmaRdRes[`S_LEN-1:0] === {1'b0, {`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|                             (FmaRdAnsFlg[4]&(FmaRdRes[`S_LEN-2:0] === {{`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|                             (FmaRdXNaN&(FmaRdRes[`S_LEN-2:0] === {FmaRdX[`S_LEN-2:`S_NF],1'b1,FmaRdX[`S_NF-2:0]})) |  | ||||
|                             (FmaRdYNaN&(FmaRdRes[`S_LEN-2:0] === {FmaRdY[`S_LEN-2:`S_NF],1'b1,FmaRdY[`S_NF-2:0]})) |  | ||||
|                             (FmaRdZNaN&(FmaRdRes[`S_LEN-2:0] === {FmaRdZ[`S_LEN-2:`S_NF],1'b1,FmaRdZ[`S_NF-2:0]}))); | ||||
|       4'b10: FmaRdNaNGood = (((`IEEE754==0)&(FmaRneRes === {1'b0, {`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|       4'b10: FmaRdNaNGood = (((`IEEE754==0)&FmaRdAnsNaN&(FmaRdRes[`H_LEN-1:0] === {1'b0, {`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|                             (FmaRdAnsFlg[4]&(FmaRdRes[`H_LEN-2:0] === {{`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|                             (FmaRdXNaN&(FmaRdRes[`H_LEN-2:0] === {FmaRdX[`H_LEN-2:`H_NF],1'b1,FmaRdX[`H_NF-2:0]})) |  | ||||
|                             (FmaRdYNaN&(FmaRdRes[`H_LEN-2:0] === {FmaRdY[`H_LEN-2:`H_NF],1'b1,FmaRdY[`H_NF-2:0]})) |  | ||||
|                             (FmaRdZNaN&(FmaRdRes[`H_LEN-2:0] === {FmaRdZ[`H_LEN-2:`H_NF],1'b1,FmaRdZ[`H_NF-2:0]}))); | ||||
|     endcase | ||||
|     case (FmaFmtVal) | ||||
|       4'b11: FmaRnmNaNGood =(((`IEEE754==0)&(FmaRneRes === {1'b0, {`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|       4'b11: FmaRnmNaNGood =(((`IEEE754==0)&FmaRnmAnsNaN&(FmaRnmRes === {1'b0, {`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|                             (FmaRnmAnsFlg[4]&(FmaRnmRes[`Q_LEN-2:0] === {{`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|                             (FmaRnmXNaN&(FmaRnmRes[`Q_LEN-2:0] === {FmaRnmX[`Q_LEN-2:`Q_NF],1'b1,FmaRnmX[`Q_NF-2:0]})) |  | ||||
|                             (FmaRnmYNaN&(FmaRnmRes[`Q_LEN-2:0] === {FmaRnmY[`Q_LEN-2:`Q_NF],1'b1,FmaRnmY[`Q_NF-2:0]})) |  | ||||
|                             (FmaRnmZNaN&(FmaRnmRes[`Q_LEN-2:0] === {FmaRnmZ[`Q_LEN-2:`Q_NF],1'b1,FmaRnmZ[`Q_NF-2:0]}))); | ||||
|       4'b01: FmaRnmNaNGood =(((`IEEE754==0)&(FmaRneRes === {1'b0, {`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|       4'b01: FmaRnmNaNGood =(((`IEEE754==0)&FmaRnmAnsNaN&(FmaRnmRes[`D_LEN-1:0] === {1'b0, {`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|                             (FmaRnmAnsFlg[4]&(FmaRnmRes[`D_LEN-2:0] === {{`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|                             (FmaRnmXNaN&(FmaRnmRes[`D_LEN-2:0] === {FmaRnmX[`D_LEN-2:`D_NF],1'b1,FmaRnmX[`D_NF-2:0]})) |  | ||||
|                             (FmaRnmYNaN&(FmaRnmRes[`D_LEN-2:0] === {FmaRnmY[`D_LEN-2:`D_NF],1'b1,FmaRnmY[`D_NF-2:0]})) |  | ||||
|                             (FmaRnmZNaN&(FmaRnmRes[`D_LEN-2:0] === {FmaRnmZ[`D_LEN-2:`D_NF],1'b1,FmaRnmZ[`D_NF-2:0]}))); | ||||
|       4'b00: FmaRnmNaNGood =(((`IEEE754==0)&(FmaRneRes === {1'b0, {`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|       4'b00: FmaRnmNaNGood =(((`IEEE754==0)&FmaRnmAnsNaN&(FmaRnmRes[`S_LEN-1:0] === {1'b0, {`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|                             (FmaRnmAnsFlg[4]&(FmaRnmRes[`S_LEN-2:0] === {{`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|                             (FmaRnmXNaN&(FmaRnmRes[`S_LEN-2:0] === {FmaRnmX[`S_LEN-2:`S_NF],1'b1,FmaRnmX[`S_NF-2:0]})) |  | ||||
|                             (FmaRnmYNaN&(FmaRnmRes[`S_LEN-2:0] === {FmaRnmY[`S_LEN-2:`S_NF],1'b1,FmaRnmY[`S_NF-2:0]})) |  | ||||
|                             (FmaRnmZNaN&(FmaRnmRes[`S_LEN-2:0] === {FmaRnmZ[`S_LEN-2:`S_NF],1'b1,FmaRnmZ[`S_NF-2:0]}))); | ||||
|       4'b10: FmaRnmNaNGood =(((`IEEE754==0)&(FmaRneRes === {1'b0, {`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|       4'b10: FmaRnmNaNGood =(((`IEEE754==0)&FmaRnmAnsNaN&(FmaRnmRes[`H_LEN-1:0] === {1'b0, {`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|                             (FmaRnmAnsFlg[4]&(FmaRnmRes[`H_LEN-2:0] === {{`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|                             (FmaRnmXNaN&(FmaRnmRes[`H_LEN-2:0] === {FmaRnmX[`H_LEN-2:`H_NF],1'b1,FmaRnmX[`H_NF-2:0]})) |  | ||||
|                             (FmaRnmYNaN&(FmaRnmRes[`H_LEN-2:0] === {FmaRnmY[`H_LEN-2:`H_NF],1'b1,FmaRnmY[`H_NF-2:0]})) |  | ||||
| @ -1140,22 +1140,22 @@ end | ||||
|     endcase | ||||
|     if (UnitVal !== `CVTFPUNIT & UnitVal !== `CVTINTUNIT) | ||||
|       case (FmtVal) | ||||
|         4'b11: NaNGood =  (((`IEEE754==0)&(Res === {1'b0, {`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|         4'b11: NaNGood =  (((`IEEE754==0)&AnsNaN&(Res === {1'b0, {`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|                           (AnsFlg[4]&(Res[`Q_LEN-2:0] === {{`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|                           (XNaN&(Res[`Q_LEN-2:0] === {X[`Q_LEN-2:`Q_NF],1'b1,X[`Q_NF-2:0]})) |  | ||||
|                           (YNaN&(Res[`Q_LEN-2:0] === {Y[`Q_LEN-2:`Q_NF],1'b1,Y[`Q_NF-2:0]})) | | ||||
|                           (ZNaN&(Res[`Q_LEN-2:0] === {Z[`Q_LEN-2:`Q_NF],1'b1,Z[`Q_NF-2:0]}))); | ||||
|         4'b01: NaNGood =  (((`IEEE754==0)&(Res === {1'b0, {`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|         4'b01: NaNGood =  (((`IEEE754==0)&AnsNaN&(Res[`D_LEN-1:0] === {1'b0, {`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|                           (AnsFlg[4]&(Res[`D_LEN-2:0] === {{`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|                           (XNaN&(Res[`D_LEN-2:0] === {X[`D_LEN-2:`D_NF],1'b1,X[`D_NF-2:0]})) |  | ||||
|                           (YNaN&(Res[`D_LEN-2:0] === {Y[`D_LEN-2:`D_NF],1'b1,Y[`D_NF-2:0]})) | | ||||
|                           (ZNaN&(Res[`D_LEN-2:0] === {Z[`D_LEN-2:`D_NF],1'b1,Z[`D_NF-2:0]}))); | ||||
|         4'b00: NaNGood =  (((`IEEE754==0)&(Res === {1'b0, {`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|         4'b00: NaNGood =  (((`IEEE754==0)&AnsNaN&(Res[`S_LEN-1:0] === {1'b0, {`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|                           (AnsFlg[4]&(Res[`S_LEN-2:0] === {{`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|                           (XNaN&(Res[`S_LEN-2:0] === {X[`S_LEN-2:`S_NF],1'b1,X[`S_NF-2:0]})) |  | ||||
|                           (YNaN&(Res[`S_LEN-2:0] === {Y[`S_LEN-2:`S_NF],1'b1,Y[`S_NF-2:0]})) | | ||||
|                           (ZNaN&(Res[`S_LEN-2:0] === {Z[`S_LEN-2:`S_NF],1'b1,Z[`S_NF-2:0]}))); | ||||
|         4'b10: NaNGood =  (((`IEEE754==0)&(Res === {1'b0, {`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|         4'b10: NaNGood =  (((`IEEE754==0)&AnsNaN&(Res[`H_LEN-1:0] === {1'b0, {`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|                           (AnsFlg[4]&(Res[`H_LEN-2:0] === {{`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|                           (XNaN&(Res[`H_LEN-2:0] === {X[`H_LEN-2:`H_NF],1'b1,X[`H_NF-2:0]})) |  | ||||
|                           (YNaN&(Res[`H_LEN-2:0] === {Y[`H_LEN-2:`H_NF],1'b1,Y[`H_NF-2:0]})) | | ||||
| @ -1163,22 +1163,22 @@ end | ||||
|       endcase | ||||
|     else if (UnitVal === `CVTFPUNIT) // if converting from floating point to floating point OpCtrl contains the final FP format
 | ||||
|       case (OpCtrlVal[1:0])  | ||||
|         2'b11: NaNGood = (((`IEEE754==0)&(Res === {1'b0, {`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|         2'b11: NaNGood = (((`IEEE754==0)&AnsNaN&(Res === {1'b0, {`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|                           (AnsFlg[4]&(Res[`Q_LEN-2:0] === {{`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) | | ||||
|                           (AnsNaN&(Res[`Q_LEN-2:0] === Ans[`Q_LEN-2:0])) |  | ||||
|                           (XNaN&(Res[`Q_LEN-2:0] === {X[`Q_LEN-2:`Q_NF],1'b1,X[`Q_NF-2:0]})) |  | ||||
|                           (YNaN&(Res[`Q_LEN-2:0] === {Y[`Q_LEN-2:`Q_NF],1'b1,Y[`Q_NF-2:0]}))); | ||||
|         2'b01: NaNGood = (((`IEEE754==0)&(Res === {1'b0, {`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|         2'b01: NaNGood = (((`IEEE754==0)&AnsNaN&(Res[`D_LEN-1:0] === {1'b0, {`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|                           (AnsFlg[4]&(Res[`D_LEN-2:0] === {{`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) | | ||||
|                           (AnsNaN&(Res[`D_LEN-2:0] === Ans[`D_LEN-2:0])) |  | ||||
|                           (XNaN&(Res[`D_LEN-2:0] === {X[`D_LEN-2:`D_NF],1'b1,X[`D_NF-2:0]})) |  | ||||
|                           (YNaN&(Res[`D_LEN-2:0] === {Y[`D_LEN-2:`D_NF],1'b1,Y[`D_NF-2:0]}))); | ||||
|         2'b00: NaNGood = (((`IEEE754==0)&(Res === {1'b0, {`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|         2'b00: NaNGood = (((`IEEE754==0)&AnsNaN&(Res[`S_LEN-1:0] === {1'b0, {`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|                           (AnsFlg[4]&(Res[`S_LEN-2:0] === {{`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) | | ||||
|                           (AnsNaN&(Res[`S_LEN-2:0] === Ans[`S_LEN-2:0])) |  | ||||
|                           (XNaN&(Res[`S_LEN-2:0] === {X[`S_LEN-2:`S_NF],1'b1,X[`S_NF-2:0]})) |  | ||||
|                           (YNaN&(Res[`S_LEN-2:0] === {Y[`S_LEN-2:`S_NF],1'b1,Y[`S_NF-2:0]}))); | ||||
|         2'b10: NaNGood = (((`IEEE754==0)&(Res === {1'b0, {`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|         2'b10: NaNGood = (((`IEEE754==0)&AnsNaN&(Res[`H_LEN-1:0] === {1'b0, {`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|                           (AnsFlg[4]&(Res[`H_LEN-2:0] === {{`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) | | ||||
|                           (AnsNaN&(Res[`H_LEN-2:0] === Ans[`H_LEN-2:0])) |  | ||||
|                           (XNaN&(Res[`H_LEN-2:0] === {X[`H_LEN-2:`H_NF],1'b1,X[`H_NF-2:0]})) |  | ||||
| @ -1452,14 +1452,14 @@ module readvectors ( | ||||
|         case (Fmt) | ||||
|           2'b11: begin       // quad
 | ||||
|             X = TestVector[8+3*(`Q_LEN)-1:8+2*(`Q_LEN)]; | ||||
|             if(OpCtrl === `MUL_OPCTRL) Y = TestVector[8+2*(`Q_LEN)-1:8+(`Q_LEN)]; else Y = {2'b0, {`Q_NE-1{1'b1}}, `Q_NF'h0}; | ||||
|             if(OpCtrl === `MUL_OPCTRL) Y = TestVector[8+2*(`Q_LEN)-1:8+(`Q_LEN)]; else Y = {2'b0, {`Q_NE-1{1'b1}}, (`Q_NF)'(0)}; | ||||
|             if(OpCtrl === `MUL_OPCTRL) Z = 0; else Z = TestVector[8+2*(`Q_LEN)-1:8+(`Q_LEN)]; | ||||
|             Ans = TestVector[8+(`Q_LEN-1):8]; | ||||
|           end | ||||
|           2'b01:	begin	  // double
 | ||||
|             X = {{`FLEN-`D_LEN{1'b1}}, TestVector[8+3*(`D_LEN)-1:8+2*(`D_LEN)]}; | ||||
|             if(OpCtrl === `MUL_OPCTRL) Y = {{`FLEN-`D_LEN{1'b1}}, TestVector[8+2*(`D_LEN)-1:8+(`D_LEN)]};  | ||||
|             else Y = {{`FLEN-`D_LEN{1'b1}}, 2'b0, {`D_NE-1{1'b1}}, `D_NF'h0}; | ||||
|             else Y = {{`FLEN-`D_LEN{1'b1}}, 2'b0, {`D_NE-1{1'b1}}, (`D_NF)'(0)}; | ||||
|             if(OpCtrl === `MUL_OPCTRL) Z = {{`FLEN-`D_LEN{1'b1}}, {`D_LEN{1'b0}}};  | ||||
|             else Z = {{`FLEN-`D_LEN{1'b1}}, TestVector[8+2*(`D_LEN)-1:8+(`D_LEN)]}; | ||||
|             Ans = {{`FLEN-`D_LEN{1'b1}}, TestVector[8+(`D_LEN-1):8]}; | ||||
| @ -1467,7 +1467,7 @@ module readvectors ( | ||||
|           2'b00:	begin	  // single
 | ||||
|             X = {{`FLEN-`S_LEN{1'b1}}, TestVector[8+3*(`S_LEN)-1:8+2*(`S_LEN)]}; | ||||
|             if(OpCtrl === `MUL_OPCTRL) Y = {{`FLEN-`S_LEN{1'b1}}, TestVector[8+2*(`S_LEN)-1:8+(`S_LEN)]};  | ||||
|             else Y = {{`FLEN-`S_LEN{1'b1}}, 2'b0, {`S_NE-1{1'b1}}, `S_NF'h0}; | ||||
|             else Y = {{`FLEN-`S_LEN{1'b1}}, 2'b0, {`S_NE-1{1'b1}}, (`S_NF)'(0)}; | ||||
|             if(OpCtrl === `MUL_OPCTRL) Z = {{`FLEN-`S_LEN{1'b1}}, {`S_LEN{1'b0}}};  | ||||
|             else Z = {{`FLEN-`S_LEN{1'b1}}, TestVector[8+2*(`S_LEN)-1:8+(`S_LEN)]}; | ||||
|             Ans = {{`FLEN-`S_LEN{1'b1}}, TestVector[8+(`S_LEN-1):8]}; | ||||
| @ -1475,7 +1475,7 @@ module readvectors ( | ||||
|           2'b10:	begin	  // half
 | ||||
|             X = {{`FLEN-`H_LEN{1'b1}}, TestVector[8+3*(`H_LEN)-1:8+2*(`H_LEN)]}; | ||||
|             if(OpCtrl === `MUL_OPCTRL) Y = {{`FLEN-`H_LEN{1'b1}}, TestVector[8+2*(`H_LEN)-1:8+(`H_LEN)]};  | ||||
|             else Y = {{`FLEN-`H_LEN{1'b1}}, 2'b0, {`H_NE-1{1'b1}}, `H_NF'h0}; | ||||
|             else Y = {{`FLEN-`H_LEN{1'b1}}, 2'b0, {`H_NE-1{1'b1}}, (`H_NF)'(0)}; | ||||
|             if(OpCtrl === `MUL_OPCTRL) Z = {{`FLEN-`H_LEN{1'b1}}, {`H_LEN{1'b0}}};  | ||||
|             else Z = {{`FLEN-`H_LEN{1'b1}}, TestVector[8+2*(`H_LEN)-1:8+(`H_LEN)]}; | ||||
|             Ans = {{`FLEN-`H_LEN{1'b1}}, TestVector[8+(`H_LEN-1):8]}; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user