forked from Github_Repos/cvw
		
	single and double conversions pass all tests
This commit is contained in:
		
							parent
							
								
									5311c0c9eb
								
							
						
					
					
						commit
						f35450207f
					
				@ -1 +1 @@
 | 
				
			|||||||
Subproject commit 307c77b26e070ae85ffea665ad9b642b40e33c86
 | 
					Subproject commit be67c99bd461742aa1c100bcc0732657faae2230
 | 
				
			||||||
@ -39,12 +39,12 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// MISA RISC-V configuration per specification
 | 
					// MISA RISC-V configuration per specification
 | 
				
			||||||
//16 - quad 3 - double 5 - single
 | 
					//16 - quad 3 - double 5 - single
 | 
				
			||||||
`define MISA (32'h00000104 | 1 << 5 | 1 << 3 | 1 << 16 | 1 << 18 | 1 << 20 | 1 << 12 | 1 << 0 )
 | 
					`define MISA (32'h00000104 | 1 << 5 | 1 << 3 | 0 << 16 | 1 << 18 | 1 << 20 | 1 << 12 | 1 << 0 )
 | 
				
			||||||
`define ZICSR_SUPPORTED 1
 | 
					`define ZICSR_SUPPORTED 1
 | 
				
			||||||
`define ZIFENCEI_SUPPORTED 1
 | 
					`define ZIFENCEI_SUPPORTED 1
 | 
				
			||||||
`define COUNTERS 32
 | 
					`define COUNTERS 32
 | 
				
			||||||
`define ZICOUNTERS_SUPPORTED 1
 | 
					`define ZICOUNTERS_SUPPORTED 1
 | 
				
			||||||
`define ZFH_SUPPORTED 1
 | 
					`define ZFH_SUPPORTED 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Microarchitectural Features
 | 
					/// Microarchitectural Features
 | 
				
			||||||
`define UARCH_PIPELINED 1
 | 
					`define UARCH_PIPELINED 1
 | 
				
			||||||
 | 
				
			|||||||
@ -1,2 +1,2 @@
 | 
				
			|||||||
vsim -do "do wally-pipelined.do rv64gc imperas64f"
 | 
					vsim -do "do wally-pipelined.do rv64gc imperas64d"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -11,97 +11,97 @@ module fctrl (
 | 
				
			|||||||
  output logic       FDivStartD,  // Start division or squareroot
 | 
					  output logic       FDivStartD,  // Start division or squareroot
 | 
				
			||||||
  output logic [1:0] FResultSelD, // select result to be written to fp register
 | 
					  output logic [1:0] FResultSelD, // select result to be written to fp register
 | 
				
			||||||
  output logic [2:0] FOpCtrlD,    // chooses which opperation to do - specifics shown at bottom of module and in each unit
 | 
					  output logic [2:0] FOpCtrlD,    // chooses which opperation to do - specifics shown at bottom of module and in each unit
 | 
				
			||||||
  output logic [2:0] FResSelD,    // select one of the results done in the memory stage
 | 
					  output logic [1:0] FResSelD,    // select one of the results done in the memory stage
 | 
				
			||||||
  output logic [1:0] FIntResSelD, // select the result that will be written to the integer register
 | 
					  output logic [1:0] FIntResSelD, // select the result that will be written to the integer register
 | 
				
			||||||
  output logic       FmtD,        // precision - single-0 double-1
 | 
					  output logic       FmtD,        // precision - single-0 double-1
 | 
				
			||||||
  output logic [2:0] FrmD,        // rounding mode 000 = rount to nearest, ties to even   001 = round twords zero  010 = round down  011 = round up  100 = round to nearest, ties to max magnitude
 | 
					  output logic [2:0] FrmD,        // rounding mode 000 = rount to nearest, ties to even   001 = round twords zero  010 = round down  011 = round up  100 = round to nearest, ties to max magnitude
 | 
				
			||||||
  output logic       FWriteIntD   // is the result written to the integer register
 | 
					  output logic       FWriteIntD   // is the result written to the integer register
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  `define FCTRLW 14
 | 
					  `define FCTRLW 13
 | 
				
			||||||
  logic [`FCTRLW-1:0] ControlsD;
 | 
					  logic [`FCTRLW-1:0] ControlsD;
 | 
				
			||||||
  // FPU Instruction Decoder
 | 
					  // FPU Instruction Decoder
 | 
				
			||||||
  always_comb
 | 
					  always_comb
 | 
				
			||||||
    if (STATUS_FS == 2'b00) // FPU instructions are illegal when FPU is disabled
 | 
					    if (STATUS_FS == 2'b00) // FPU instructions are illegal when FPU is disabled
 | 
				
			||||||
      ControlsD = `FCTRLW'b0_0_00_000_000_00_0_1;
 | 
					      ControlsD = `FCTRLW'b0_0_00_000_00_00_0_1;
 | 
				
			||||||
    else case(OpD)
 | 
					    else case(OpD)
 | 
				
			||||||
    // FRegWrite_FWriteInt_FResultSel_FOpCtrl_FResSel_FIntResSel_FDivStart_IllegalFPUInstr
 | 
					    // FRegWrite_FWriteInt_FResultSel_FOpCtrl_FResSel_FIntResSel_FDivStart_IllegalFPUInstr
 | 
				
			||||||
      7'b0000111: case(Funct3D)
 | 
					      7'b0000111: case(Funct3D)
 | 
				
			||||||
                    3'b010:  ControlsD = `FCTRLW'b1_0_00_000_000_00_0_0; // flw
 | 
					                    3'b010:  ControlsD = `FCTRLW'b1_0_00_000_00_00_0_0; // flw
 | 
				
			||||||
                    3'b011:  ControlsD = `FCTRLW'b1_0_00_001_000_00_0_0; // fld
 | 
					                    3'b011:  ControlsD = `FCTRLW'b1_0_00_001_00_00_0_0; // fld
 | 
				
			||||||
                    default: ControlsD = `FCTRLW'b0_0_00_000_000_00_0_1; // non-implemented instruction
 | 
					                    default: ControlsD = `FCTRLW'b0_0_00_000_00_00_0_1; // non-implemented instruction
 | 
				
			||||||
                  endcase
 | 
					                  endcase
 | 
				
			||||||
      7'b0100111: case(Funct3D)
 | 
					      7'b0100111: case(Funct3D)
 | 
				
			||||||
                    3'b010:  ControlsD = `FCTRLW'b0_0_00_010_000_00_0_0; // fsw
 | 
					                    3'b010:  ControlsD = `FCTRLW'b0_0_00_010_00_00_0_0; // fsw
 | 
				
			||||||
                    3'b011:  ControlsD = `FCTRLW'b0_0_00_011_000_00_0_0; // fsd
 | 
					                    3'b011:  ControlsD = `FCTRLW'b0_0_00_011_00_00_0_0; // fsd
 | 
				
			||||||
                    default: ControlsD = `FCTRLW'b0_0_00_000_000_00_0_1; // non-implemented instruction
 | 
					                    default: ControlsD = `FCTRLW'b0_0_00_000_00_00_0_1; // non-implemented instruction
 | 
				
			||||||
                  endcase
 | 
					                  endcase
 | 
				
			||||||
      7'b1000011:   ControlsD = `FCTRLW'b1_0_01_000_000_00_0_0; // fmadd
 | 
					      7'b1000011:   ControlsD = `FCTRLW'b1_0_01_000_00_00_0_0; // fmadd
 | 
				
			||||||
      7'b1000111:   ControlsD = `FCTRLW'b1_0_01_001_000_00_0_0; // fmsub
 | 
					      7'b1000111:   ControlsD = `FCTRLW'b1_0_01_001_00_00_0_0; // fmsub
 | 
				
			||||||
      7'b1001011:   ControlsD = `FCTRLW'b1_0_01_010_000_00_0_0; // fnmsub
 | 
					      7'b1001011:   ControlsD = `FCTRLW'b1_0_01_010_00_00_0_0; // fnmsub
 | 
				
			||||||
      7'b1001111:   ControlsD = `FCTRLW'b1_0_01_011_000_00_0_0; // fnmadd
 | 
					      7'b1001111:   ControlsD = `FCTRLW'b1_0_01_011_00_00_0_0; // fnmadd
 | 
				
			||||||
      7'b1010011: casez(Funct7D)
 | 
					      7'b1010011: casez(Funct7D)
 | 
				
			||||||
                    7'b00000??: ControlsD = `FCTRLW'b1_0_01_110_000_00_0_0; // fadd
 | 
					                    7'b00000??: ControlsD = `FCTRLW'b1_0_01_110_00_00_0_0; // fadd
 | 
				
			||||||
                    7'b00001??: ControlsD = `FCTRLW'b1_0_01_111_000_00_0_0; // fsub
 | 
					                    7'b00001??: ControlsD = `FCTRLW'b1_0_01_111_00_00_0_0; // fsub
 | 
				
			||||||
                    7'b00010??: ControlsD = `FCTRLW'b1_0_01_100_000_00_0_0; // fmul
 | 
					                    7'b00010??: ControlsD = `FCTRLW'b1_0_01_100_00_00_0_0; // fmul
 | 
				
			||||||
                    7'b00011??: ControlsD = `FCTRLW'b1_0_10_000_000_00_1_0; // fdiv
 | 
					                    7'b00011??: ControlsD = `FCTRLW'b1_0_10_000_00_00_1_0; // fdiv
 | 
				
			||||||
                    7'b01011??: ControlsD = `FCTRLW'b1_0_10_001_000_00_1_0; // fsqrt
 | 
					                    7'b01011??: ControlsD = `FCTRLW'b1_0_10_001_00_00_1_0; // fsqrt
 | 
				
			||||||
                    7'b00100??: case(Funct3D)
 | 
					                    7'b00100??: case(Funct3D)
 | 
				
			||||||
                                  3'b000:  ControlsD = `FCTRLW'b1_0_11_000_001_00_0_0; // fsgnj
 | 
					                                  3'b000:  ControlsD = `FCTRLW'b1_0_11_000_01_00_0_0; // fsgnj
 | 
				
			||||||
                                  3'b001:  ControlsD = `FCTRLW'b1_0_11_001_001_00_0_0; // fsgnjn
 | 
					                                  3'b001:  ControlsD = `FCTRLW'b1_0_11_001_01_00_0_0; // fsgnjn
 | 
				
			||||||
                                  3'b010:  ControlsD = `FCTRLW'b1_0_11_010_001_00_0_0; // fsgnjx
 | 
					                                  3'b010:  ControlsD = `FCTRLW'b1_0_11_010_01_00_0_0; // fsgnjx
 | 
				
			||||||
                                  default: ControlsD = `FCTRLW'b0_0_00_000_000_00_0_1; // non-implemented instruction
 | 
					                                  default: ControlsD = `FCTRLW'b0_0_00_000_00_00_0_1; // non-implemented instruction
 | 
				
			||||||
                                endcase
 | 
					                                endcase
 | 
				
			||||||
                    7'b00101??: case(Funct3D)
 | 
					                    7'b00101??: case(Funct3D)
 | 
				
			||||||
                                  3'b000:  ControlsD = `FCTRLW'b1_0_11_111_010_00_0_0; // fmin
 | 
					                                  3'b000:  ControlsD = `FCTRLW'b1_0_11_111_10_00_0_0; // fmin
 | 
				
			||||||
                                  3'b001:  ControlsD = `FCTRLW'b1_0_11_101_010_00_0_0; // fmax
 | 
					                                  3'b001:  ControlsD = `FCTRLW'b1_0_11_101_10_00_0_0; // fmax
 | 
				
			||||||
                                  default: ControlsD = `FCTRLW'b0_0_00_000_000_00_0_1; // non-implemented instruction
 | 
					                                  default: ControlsD = `FCTRLW'b0_0_00_000_00_00_0_1; // non-implemented instruction
 | 
				
			||||||
                                endcase
 | 
					                                endcase
 | 
				
			||||||
                    7'b10100??: case(Funct3D)
 | 
					                    7'b10100??: case(Funct3D)
 | 
				
			||||||
                                  3'b010:  ControlsD = `FCTRLW'b0_1_11_010_010_00_0_0; // feq
 | 
					                                  3'b010:  ControlsD = `FCTRLW'b0_1_11_010_10_00_0_0; // feq
 | 
				
			||||||
                                  3'b001:  ControlsD = `FCTRLW'b0_1_11_001_010_00_0_0; // flt
 | 
					                                  3'b001:  ControlsD = `FCTRLW'b0_1_11_001_10_00_0_0; // flt
 | 
				
			||||||
                                  3'b000:  ControlsD = `FCTRLW'b0_1_11_011_010_00_0_0; // fle
 | 
					                                  3'b000:  ControlsD = `FCTRLW'b0_1_11_011_10_00_0_0; // fle
 | 
				
			||||||
                                  default: ControlsD = `FCTRLW'b0_0_00_000_000_00_0_1; // non-implemented instruction
 | 
					                                  default: ControlsD = `FCTRLW'b0_0_00_000_00_00_0_1; // non-implemented instruction
 | 
				
			||||||
                                endcase
 | 
					                                endcase
 | 
				
			||||||
                    7'b11100??: if (Funct3D == 3'b001) ControlsD = `FCTRLW'b0_1_11_000_000_10_0_0; // fclass
 | 
					                    7'b11100??: if (Funct3D == 3'b001) ControlsD = `FCTRLW'b0_1_11_000_00_10_0_0; // fclass
 | 
				
			||||||
                                else if (Funct3D[1:0] == 2'b00) ControlsD = `FCTRLW'b0_1_11_100_000_01_0_0; // fmv.x.w
 | 
					                                else if (Funct3D[1:0] == 2'b00) ControlsD = `FCTRLW'b0_1_11_100_00_01_0_0; // fmv.x.w
 | 
				
			||||||
                                else if (Funct3D[1:0] == 2'b01) ControlsD = `FCTRLW'b0_1_11_101_000_01_0_0; // fmv.x.d
 | 
					                                else if (Funct3D[1:0] == 2'b01) ControlsD = `FCTRLW'b0_1_11_101_00_01_0_0; // fmv.x.d
 | 
				
			||||||
                                else                            ControlsD = `FCTRLW'b0_0_00_000_000_00_0_1; // non-implemented instruction
 | 
					                                else                            ControlsD = `FCTRLW'b0_0_00_000_00_00_0_1; // non-implemented instruction
 | 
				
			||||||
                    7'b1101000: case(Rs2D[1:0])
 | 
					                    7'b1101000: case(Rs2D[1:0])//***reduce resSel
 | 
				
			||||||
                                  2'b00:    ControlsD = `FCTRLW'b1_0_11_000_011_00_0_0; // fcvt.s.w
 | 
					                                  2'b00:    ControlsD = `FCTRLW'b1_0_11_101_11_00_0_0; // fcvt.s.w   w->s
 | 
				
			||||||
                                  2'b01:    ControlsD = `FCTRLW'b1_0_11_010_011_00_0_0; // fcvt.s.wu
 | 
					                                  2'b01:    ControlsD = `FCTRLW'b1_0_11_100_11_00_0_0; // fcvt.s.wu wu->s
 | 
				
			||||||
                                  2'b10:    ControlsD = `FCTRLW'b1_0_11_100_011_00_0_0; // fcvt.s.l
 | 
					                                  2'b10:    ControlsD = `FCTRLW'b1_0_11_111_11_00_0_0; // fcvt.s.l   l->s
 | 
				
			||||||
                                  2'b11:    ControlsD = `FCTRLW'b1_0_11_110_011_00_0_0; // fcvt.s.lu
 | 
					                                  2'b11:    ControlsD = `FCTRLW'b1_0_11_110_11_00_0_0; // fcvt.s.lu lu->s
 | 
				
			||||||
                                  default: ControlsD = `FCTRLW'b0_0_00_000_000_00_0_1; // non-implemented instruction
 | 
					                                  default: ControlsD = `FCTRLW'b0_0_00_000_00_00_0_1; // non-implemented instruction
 | 
				
			||||||
                                endcase
 | 
					                                endcase
 | 
				
			||||||
                    7'b1100000: case(Rs2D[1:0])
 | 
					                    7'b1100000: case(Rs2D[1:0])
 | 
				
			||||||
                                  2'b00:    ControlsD = `FCTRLW'b0_1_11_001_011_11_0_0; // fcvt.w.s
 | 
					                                  2'b00:    ControlsD = `FCTRLW'b0_1_11_001_11_11_0_0; // fcvt.w.s   s->w
 | 
				
			||||||
                                  2'b01:    ControlsD = `FCTRLW'b0_1_11_011_011_11_0_0; // fcvt.wu.s
 | 
					                                  2'b01:    ControlsD = `FCTRLW'b0_1_11_000_11_11_0_0; // fcvt.wu.s  s->wu
 | 
				
			||||||
                                  2'b10:    ControlsD = `FCTRLW'b0_1_11_101_011_11_0_0; // fcvt.l.s
 | 
					                                  2'b10:    ControlsD = `FCTRLW'b0_1_11_011_11_11_0_0; // fcvt.l.s   s->l
 | 
				
			||||||
                                  2'b11:    ControlsD = `FCTRLW'b0_1_11_111_011_11_0_0; // fcvt.lu.s
 | 
					                                  2'b11:    ControlsD = `FCTRLW'b0_1_11_010_11_11_0_0; // fcvt.lu.s  s->lu
 | 
				
			||||||
                                  default: ControlsD = `FCTRLW'b0_0_00_000_000_00_0_1; // non-implemented instruction
 | 
					                                  default: ControlsD = `FCTRLW'b0_0_00_000_00_00_0_1; // non-implemented instruction
 | 
				
			||||||
                                endcase
 | 
					                                endcase
 | 
				
			||||||
                    7'b1111000: ControlsD = `FCTRLW'b1_0_11_000_000_00_0_0; // fmv.w.x
 | 
					                    7'b1111000: ControlsD = `FCTRLW'b1_0_11_000_00_00_0_0; // fmv.w.x
 | 
				
			||||||
                    7'b010000?: ControlsD = `FCTRLW'b1_0_11_000_100_00_0_0; // fcvt.s.d
 | 
					                    7'b0100000: ControlsD = `FCTRLW'b1_0_11_000_11_00_0_0; // fcvt.s.d
 | 
				
			||||||
                    7'b1101001: case(Rs2D[1:0])
 | 
					                    7'b1101001: case(Rs2D[1:0])
 | 
				
			||||||
                                  2'b00:    ControlsD = `FCTRLW'b1_0_11_000_011_00_0_0; // fcvt.d.w
 | 
					                                  2'b00:    ControlsD = `FCTRLW'b1_0_11_101_11_00_0_0; // fcvt.d.w   w->d
 | 
				
			||||||
                                  2'b01:    ControlsD = `FCTRLW'b1_0_11_010_011_00_0_0; // fcvt.d.wu
 | 
					                                  2'b01:    ControlsD = `FCTRLW'b1_0_11_100_11_00_0_0; // fcvt.d.wu wu->d
 | 
				
			||||||
                                  2'b10:    ControlsD = `FCTRLW'b1_0_11_100_011_00_0_0; // fcvt.d.l
 | 
					                                  2'b10:    ControlsD = `FCTRLW'b1_0_11_111_11_00_0_0; // fcvt.d.l   l->d
 | 
				
			||||||
                                  2'b11:    ControlsD = `FCTRLW'b1_0_11_110_011_00_0_0; // fcvt.d.lu
 | 
					                                  2'b11:    ControlsD = `FCTRLW'b1_0_11_110_11_00_0_0; // fcvt.d.lu lu->d
 | 
				
			||||||
                                  default: ControlsD = `FCTRLW'b0_0_00_000_000_00_0_1; // non-implemented instruction
 | 
					                                  default: ControlsD = `FCTRLW'b0_0_00_000_00_00_0_1; // non-implemented instruction
 | 
				
			||||||
                                endcase
 | 
					                                endcase
 | 
				
			||||||
                    7'b1100001: case(Rs2D[1:0])
 | 
					                    7'b1100001: case(Rs2D[1:0])
 | 
				
			||||||
                                  2'b00:    ControlsD = `FCTRLW'b0_1_11_001_011_11_0_0; // fcvt.w.d
 | 
					                                  2'b00:    ControlsD = `FCTRLW'b0_1_11_001_11_11_0_0; // fcvt.w.d   d->w
 | 
				
			||||||
                                  2'b01:    ControlsD = `FCTRLW'b0_1_11_011_011_11_0_0; // fcvt.wu.d
 | 
					                                  2'b01:    ControlsD = `FCTRLW'b0_1_11_000_11_11_0_0; // fcvt.wu.d  d->wu
 | 
				
			||||||
                                  2'b10:    ControlsD = `FCTRLW'b0_1_11_101_011_11_0_0; // fcvt.l.d
 | 
					                                  2'b10:    ControlsD = `FCTRLW'b0_1_11_011_11_11_0_0; // fcvt.l.d   d->l
 | 
				
			||||||
                                  2'b11:    ControlsD = `FCTRLW'b0_1_11_111_011_11_0_0; // fcvt.lu.d
 | 
					                                  2'b11:    ControlsD = `FCTRLW'b0_1_11_010_11_11_0_0; // fcvt.lu.d  d->lu
 | 
				
			||||||
                                  default: ControlsD = `FCTRLW'b0_0_00_000_000_00_0_1; // non-implemented instruction
 | 
					                                  default: ControlsD = `FCTRLW'b0_0_00_000_00_00_0_1; // non-implemented instruction
 | 
				
			||||||
                                endcase
 | 
					                                endcase
 | 
				
			||||||
                    7'b1111001: ControlsD = `FCTRLW'b1_0_11_001_000_00_0_0; // fmv.d.x
 | 
					                    7'b1111001: ControlsD = `FCTRLW'b1_0_11_001_00_00_0_0; // fmv.d.x
 | 
				
			||||||
                    //7'b0100001: ControlsD = `FCTRLW'b1_0_11_000_100_00_0_0; // fcvt.d.s
 | 
					                    7'b0100001: ControlsD = `FCTRLW'b1_0_11_001_11_00_0_0; // fcvt.d.s
 | 
				
			||||||
                    default:    ControlsD = `FCTRLW'b0_0_00_000_100_00_0_1; // non-implemented instruction
 | 
					                    default:    ControlsD = `FCTRLW'b0_0_00_000_00_00_0_1; // non-implemented instruction
 | 
				
			||||||
                  endcase
 | 
					                  endcase
 | 
				
			||||||
      default:      ControlsD = `FCTRLW'b0_0_00_000_000_00_0_1; // non-implemented instruction
 | 
					      default:      ControlsD = `FCTRLW'b0_0_00_000_00_00_0_1; // non-implemented instruction
 | 
				
			||||||
    endcase
 | 
					    endcase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // unswizzle control bits
 | 
					  // unswizzle control bits
 | 
				
			||||||
@ -119,7 +119,7 @@ module fctrl (
 | 
				
			|||||||
  // Precision
 | 
					  // Precision
 | 
				
			||||||
  //    0-single
 | 
					  //    0-single
 | 
				
			||||||
  //    1-double
 | 
					  //    1-double
 | 
				
			||||||
  assign FmtD = FResultSelD == 2'b00 ? Funct3D[0] : FResSelD == 3'b100 | OpD[6:1] == 6'b010000 ? ~Funct7D[0] : Funct7D[0];
 | 
					  assign FmtD = FResultSelD == 2'b00 ? Funct3D[0] : ((Funct7D[6:3] == 4'b0100)&OpD[4]) | OpD[6:1] == 6'b010000 ? ~Funct7D[0] : Funct7D[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // FResultSel:
 | 
					  // FResultSel:
 | 
				
			||||||
  //    000 - ReadRes - load
 | 
					  //    000 - ReadRes - load
 | 
				
			||||||
 | 
				
			|||||||
@ -599,7 +599,7 @@ module normalize(
 | 
				
			|||||||
    ///////////////////////////////////////////////////////////////////////////////
 | 
					    ///////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
    // Normalization
 | 
					    // Normalization
 | 
				
			||||||
    ///////////////////////////////////////////////////////////////////////////////
 | 
					    ///////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					    //*** insert bias-bias simplification in fcvt.sv/phone pictures/ whiteboard... if still there
 | 
				
			||||||
    // Determine if the sum is zero
 | 
					    // Determine if the sum is zero
 | 
				
			||||||
    assign SumZero = ~(|SumM);
 | 
					    assign SumZero = ~(|SumM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -72,7 +72,7 @@ module fpu (
 | 
				
			|||||||
   logic [1:0] 	  FResultSelD, FResultSelE;           // Select the result written to FP register
 | 
					   logic [1:0] 	  FResultSelD, FResultSelE;           // Select the result written to FP register
 | 
				
			||||||
   logic [1:0] 	  FResultSelM, FResultSelW;           // Select the result written to FP register
 | 
					   logic [1:0] 	  FResultSelM, FResultSelW;           // Select the result written to FP register
 | 
				
			||||||
   logic [2:0] 	  FOpCtrlD, FOpCtrlE;       // Select which opperation to do in each component
 | 
					   logic [2:0] 	  FOpCtrlD, FOpCtrlE;       // Select which opperation to do in each component
 | 
				
			||||||
   logic [2:0] 	  FResSelD, FResSelE;       // Select one of the results that finish in the memory stage
 | 
					   logic [1:0] 	  FResSelD, FResSelE;       // Select one of the results that finish in the memory stage
 | 
				
			||||||
   logic [1:0] 	  FIntResSelD, FIntResSelE;           // Select the result written to the integer resister
 | 
					   logic [1:0] 	  FIntResSelD, FIntResSelE;           // Select the result written to the integer resister
 | 
				
			||||||
   logic [4:0] 	  Adr1E, Adr2E, Adr3E;                // adresses of each input
 | 
					   logic [4:0] 	  Adr1E, Adr2E, Adr3E;                // adresses of each input
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -104,7 +104,7 @@ module fpu (
 | 
				
			|||||||
   logic 		  XInfQ, YInfQ;                       // is the input infinity - divide
 | 
					   logic 		  XInfQ, YInfQ;                       // is the input infinity - divide
 | 
				
			||||||
   logic 		  XExpMaxE;                           // is the exponent all ones (max value)
 | 
					   logic 		  XExpMaxE;                           // is the exponent all ones (max value)
 | 
				
			||||||
   logic 		  XNormE;                             // is normal
 | 
					   logic 		  XNormE;                             // is normal
 | 
				
			||||||
   logic         ZOrigDenormE;
 | 
					   logic         ZOrigDenormE, XOrigDenormE;
 | 
				
			||||||
   logic 		  FmtQ;
 | 
					   logic 		  FmtQ;
 | 
				
			||||||
   logic 		  FOpCtrlQ;     
 | 
					   logic 		  FOpCtrlQ;     
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -114,9 +114,8 @@ module fpu (
 | 
				
			|||||||
   logic [63:0] 	  FMAResM, FMAResW;                   // FMA/multiply result
 | 
					   logic [63:0] 	  FMAResM, FMAResW;                   // FMA/multiply result
 | 
				
			||||||
   logic [4:0] 	  FMAFlgM;                   // FMA/multiply result	
 | 
					   logic [4:0] 	  FMAFlgM;                   // FMA/multiply result	
 | 
				
			||||||
   logic [63:0] 	  ReadResW;                           // read result (load instruction)
 | 
					   logic [63:0] 	  ReadResW;                           // read result (load instruction)
 | 
				
			||||||
   logic [63:0] 	  CvtFpResE;    // add/FP -> FP convert result
 | 
					 | 
				
			||||||
   logic [4:0] 	  CvtFpFlgE;    // add/FP -> FP convert flags
 | 
					 | 
				
			||||||
   logic [63:0] 	  CvtResE;                   // FP <-> int convert result
 | 
					   logic [63:0] 	  CvtResE;                   // FP <-> int convert result
 | 
				
			||||||
 | 
					   logic [`XLEN-1:0] CvtIntResE;                   // FP <-> int convert result
 | 
				
			||||||
   logic [4:0] 	  CvtFlgE;                   // FP <-> int convert flags //*** trim this	
 | 
					   logic [4:0] 	  CvtFlgE;                   // FP <-> int convert flags //*** trim this	
 | 
				
			||||||
   logic [63:0] 	  ClassResE;               // classify result
 | 
					   logic [63:0] 	  ClassResE;               // classify result
 | 
				
			||||||
   logic [63:0] 	  CmpResE;                   // compare result
 | 
					   logic [63:0] 	  CmpResE;                   // compare result
 | 
				
			||||||
@ -152,7 +151,7 @@ module fpu (
 | 
				
			|||||||
   flopenrc #(64) DEReg3(clk, reset, FlushE, ~StallE, FRD3D, FRD3E);
 | 
					   flopenrc #(64) DEReg3(clk, reset, FlushE, ~StallE, FRD3D, FRD3E);
 | 
				
			||||||
   flopenrc #(15) DEAdrReg(clk, reset, FlushE, ~StallE, {InstrD[19:15], InstrD[24:20], InstrD[31:27]}, 
 | 
					   flopenrc #(15) DEAdrReg(clk, reset, FlushE, ~StallE, {InstrD[19:15], InstrD[24:20], InstrD[31:27]}, 
 | 
				
			||||||
                           {Adr1E, Adr2E, Adr3E});
 | 
					                           {Adr1E, Adr2E, Adr3E});
 | 
				
			||||||
   flopenrc #(17) DECtrlReg3(clk, reset, FlushE, ~StallE, 
 | 
					   flopenrc #(16) DECtrlReg3(clk, reset, FlushE, ~StallE, 
 | 
				
			||||||
               {FRegWriteD, FResultSelD, FResSelD, FIntResSelD, FrmD, FmtD, FOpCtrlD, FWriteIntD, FDivStartD},
 | 
					               {FRegWriteD, FResultSelD, FResSelD, FIntResSelD, FrmD, FmtD, FOpCtrlD, FWriteIntD, FDivStartD},
 | 
				
			||||||
               {FRegWriteE, FResultSelE, FResSelE, FIntResSelE, FrmE, FmtE, FOpCtrlE, FWriteIntE, FDivStartE});
 | 
					               {FRegWriteE, FResultSelE, FResSelE, FIntResSelE, FrmE, FmtE, FOpCtrlE, FWriteIntE, FDivStartE});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -177,7 +176,7 @@ module fpu (
 | 
				
			|||||||
   // unpack unit
 | 
					   // unpack unit
 | 
				
			||||||
   //    - splits FP inputs into their various parts
 | 
					   //    - splits FP inputs into their various parts
 | 
				
			||||||
   //    - does some classifications (SNaN, NaN, Denorm, Norm, Zero, Infifnity)
 | 
					   //    - does some classifications (SNaN, NaN, Denorm, Norm, Zero, Infifnity)
 | 
				
			||||||
   unpack unpack (.X(FSrcXE), .Y(FSrcYE), .Z(FSrcZE), .FmtE, .ZOrigDenormE,
 | 
					   unpack unpack (.X(FSrcXE), .Y(FSrcYE), .Z(FSrcZE), .FmtE, .ZOrigDenormE, .XOrigDenormE,
 | 
				
			||||||
         .XSgnE, .YSgnE, .ZSgnE, .XExpE, .YExpE, .ZExpE, .XManE, .YManE, .ZManE, 
 | 
					         .XSgnE, .YSgnE, .ZSgnE, .XExpE, .YExpE, .ZExpE, .XManE, .YManE, .ZManE, 
 | 
				
			||||||
         .XNaNE, .YNaNE, .ZNaNE, .XSNaNE, .YSNaNE, .ZSNaNE, .XDenormE, .YDenormE, .ZDenormE, 
 | 
					         .XNaNE, .YNaNE, .ZNaNE, .XSNaNE, .YSNaNE, .ZSNaNE, .XDenormE, .YDenormE, .ZDenormE, 
 | 
				
			||||||
         .XZeroE, .YZeroE, .ZZeroE, .XInfE, .YInfE, .ZInfE, .XExpMaxE, .XNormE);
 | 
					         .XZeroE, .YZeroE, .ZZeroE, .XInfE, .YInfE, .ZInfE, .XExpMaxE, .XNormE);
 | 
				
			||||||
@ -214,13 +213,12 @@ module fpu (
 | 
				
			|||||||
         .FDivBusyE, .done(FDivSqrtDoneE), .AS_Result(FDivResM), .Flags(FDivFlgM));
 | 
					         .FDivBusyE, .done(FDivSqrtDoneE), .AS_Result(FDivResM), .Flags(FDivFlgM));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   // other FP execution units
 | 
					   // other FP execution units
 | 
				
			||||||
   fcvtfp fcvtfp (.XExpE, .XManE, .XSgnE, .XZeroE, .XDenormE, .XInfE, .XNaNE, .XSNaNE, .FrmE, .FmtE, .CvtFpResE, .CvtFpFlgE);
 | 
					 | 
				
			||||||
   fcmp fcmp (.FmtE, .FOpCtrlE, .XSgnE, .YSgnE, .XExpE, .YExpE, .XManE, .YManE, 
 | 
					   fcmp fcmp (.FmtE, .FOpCtrlE, .XSgnE, .YSgnE, .XExpE, .YExpE, .XManE, .YManE, 
 | 
				
			||||||
            .XZeroE, .YZeroE, .XNaNE, .YNaNE, .XSNaNE, .YSNaNE, .FSrcXE, .FSrcYE, .CmpNVE, .CmpResE);
 | 
					            .XZeroE, .YZeroE, .XNaNE, .YNaNE, .XSNaNE, .YSNaNE, .FSrcXE, .FSrcYE, .CmpNVE, .CmpResE);
 | 
				
			||||||
   fsgn fsgn (.SgnOpCodeE(FOpCtrlE[1:0]), .XSgnE, .YSgnE, .FSrcXE, .FmtE, .SgnResE);
 | 
					   fsgn fsgn (.SgnOpCodeE(FOpCtrlE[1:0]), .XSgnE, .YSgnE, .FSrcXE, .FmtE, .SgnResE);
 | 
				
			||||||
   fclassify fclassify (.XSgnE, .XDenormE, .XZeroE, .XNaNE, .XInfE, .XNormE, .XSNaNE, .ClassResE);
 | 
					   fclassify fclassify (.XSgnE, .XDenormE, .XZeroE, .XNaNE, .XInfE, .XNormE, .XSNaNE, .ClassResE);
 | 
				
			||||||
   fcvtint fcvtint (.XSgnE, .XExpE, .XManE, .XZeroE, .XNaNE, .XInfE, .XDenormE, .ForwardedSrcAE, .FOpCtrlE, .FmtE, .FrmE,
 | 
					   fcvt fcvt (.XSgnE, .XExpE, .XManE, .ForwardedSrcAE, .FOpCtrlE, .FWriteIntE, .XZeroE, .XOrigDenormE,
 | 
				
			||||||
   .CvtResE, .CvtFlgE);
 | 
					              .XInfE, .XNaNE, .XSNaNE, .FrmE, .FmtE, .CvtResE, .CvtIntResE, .CvtFlgE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   // data to be stored in memory - to IEU
 | 
					   // data to be stored in memory - to IEU
 | 
				
			||||||
   //    - FP uses NaN-blocking format
 | 
					   //    - FP uses NaN-blocking format
 | 
				
			||||||
@ -231,12 +229,12 @@ module fpu (
 | 
				
			|||||||
   mux2  #(64)  SrcAMux({{32{1'b1}}, ForwardedSrcAE[31:0]}, {{64-`XLEN{1'b1}}, ForwardedSrcAE}, FmtE, AlignedSrcAE);
 | 
					   mux2  #(64)  SrcAMux({{32{1'b1}}, ForwardedSrcAE[31:0]}, {{64-`XLEN{1'b1}}, ForwardedSrcAE}, FmtE, AlignedSrcAE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   // select a result that may be written to the FP register
 | 
					   // select a result that may be written to the FP register
 | 
				
			||||||
   mux5  #(64) FResMux(AlignedSrcAE, SgnResE, CmpResE, CvtResE, CvtFpResE, FResSelE, FResE);
 | 
					   mux4  #(64) FResMux(AlignedSrcAE, SgnResE, CmpResE, CvtResE, FResSelE, FResE);
 | 
				
			||||||
   mux5  #(5)  FFlgMux(5'b0, 5'b0, {CmpNVE, 4'b0}, CvtFlgE, CvtFpFlgE, FResSelE, FFlgE);
 | 
					   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
 | 
					   // 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[`XLEN-1:0], 
 | 
					   mux4  #(`XLEN)  IntResMux(CmpResE[`XLEN-1:0], FSrcXE[`XLEN-1:0], ClassResE[`XLEN-1:0], 
 | 
				
			||||||
               CvtResE[`XLEN-1:0], FIntResSelE, FIntResE);
 | 
					               CvtIntResE, FIntResSelE, FIntResE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   // E/M pipe registers
 | 
					   // E/M pipe registers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -12,7 +12,7 @@ module unpack (
 | 
				
			|||||||
    output logic                    XDenormE, YDenormE, ZDenormE,   // is XYZ denormalized
 | 
					    output logic                    XDenormE, YDenormE, ZDenormE,   // is XYZ denormalized
 | 
				
			||||||
    output logic                    XZeroE, YZeroE, ZZeroE,         // is XYZ zero
 | 
					    output logic                    XZeroE, YZeroE, ZZeroE,         // is XYZ zero
 | 
				
			||||||
    output logic                    XInfE, YInfE, ZInfE,            // is XYZ infinity
 | 
					    output logic                    XInfE, YInfE, ZInfE,            // is XYZ infinity
 | 
				
			||||||
    output logic                    ZOrigDenormE,                   // is the original precision denormalized
 | 
					    output logic                    XOrigDenormE, ZOrigDenormE,     // is the original precision denormalized
 | 
				
			||||||
    output logic                    XExpMaxE                        // does X have the maximum exponent (NaN or Inf)
 | 
					    output logic                    XExpMaxE                        // does X have the maximum exponent (NaN or Inf)
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@ -49,6 +49,7 @@ module unpack (
 | 
				
			|||||||
        assign YExpMaxE = &YExpE;
 | 
					        assign YExpMaxE = &YExpE;
 | 
				
			||||||
        assign ZExpMaxE = &ZExpE;
 | 
					        assign ZExpMaxE = &ZExpE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assign XOrigDenormE = 1'b0;
 | 
				
			||||||
        assign ZOrigDenormE = 1'b0;
 | 
					        assign ZOrigDenormE = 1'b0;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -73,7 +74,7 @@ module unpack (
 | 
				
			|||||||
        //      double and half
 | 
					        //      double and half
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        logic  [`LEN1-1:0]  XLen1, YLen1, ZLen1; // Remove NaN boxing or NaN, if not properly NaN boxed
 | 
					        logic  [`LEN1-1:0]  XLen1, YLen1, ZLen1; // Remove NaN boxing or NaN, if not properly NaN boxed
 | 
				
			||||||
        logic               XOrigDenormE, YOrigDenormE;   // the original value of XYZ is denormalized
 | 
					        logic               YOrigDenormE;   // the original value of XYZ is denormalized
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Check NaN boxing, If the value is not properly NaN boxed, set the value to a quiet NaN
 | 
					        // Check NaN boxing, If the value is not properly NaN boxed, set the value to a quiet NaN
 | 
				
			||||||
        assign XLen1 = &X[`FLEN-1:`LEN1] ? X[`LEN1-1:0] : {1'b0, {`NE1+1{1'b1}}, (`NF1-1)'(0)};
 | 
					        assign XLen1 = &X[`FLEN-1:`LEN1] ? X[`LEN1-1:0] : {1'b0, {`NE1+1{1'b1}}, (`NF1-1)'(0)};
 | 
				
			||||||
@ -141,7 +142,7 @@ module unpack (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        logic  [`LEN1-1:0]  XLen1, YLen1, ZLen1; // Remove NaN boxing or NaN, if not properly NaN boxed for larger percision
 | 
					        logic  [`LEN1-1:0]  XLen1, YLen1, ZLen1; // Remove NaN boxing or NaN, if not properly NaN boxed for larger percision
 | 
				
			||||||
        logic  [`LEN2-1:0]  XLen2, YLen2, ZLen2; // Remove NaN boxing or NaN, if not properly NaN boxed for smallest precision
 | 
					        logic  [`LEN2-1:0]  XLen2, YLen2, ZLen2; // Remove NaN boxing or NaN, if not properly NaN boxed for smallest precision
 | 
				
			||||||
        logic               XOrigDenormE, YOrigDenormE;   // the original value of XYZ is denormalized
 | 
					        logic               YOrigDenormE;   // the original value of XYZ is denormalized
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        // Check NaN boxing, If the value is not properly NaN boxed, set the value to a quiet NaN - for larger precision
 | 
					        // Check NaN boxing, If the value is not properly NaN boxed, set the value to a quiet NaN - for larger precision
 | 
				
			||||||
        assign XLen1 = &X[`FLEN-1:`LEN1] ? X[`LEN1-1:0] : {1'b0, {`NE1+1{1'b1}}, (`NF1-1)'(0)};
 | 
					        assign XLen1 = &X[`FLEN-1:`LEN1] ? X[`LEN1-1:0] : {1'b0, {`NE1+1{1'b1}}, (`NF1-1)'(0)};
 | 
				
			||||||
@ -318,7 +319,7 @@ module unpack (
 | 
				
			|||||||
        logic  [`D_LEN-1:0]  XLen1, YLen1, ZLen1; // Remove NaN boxing or NaN, if not properly NaN boxed for double percision
 | 
					        logic  [`D_LEN-1:0]  XLen1, YLen1, ZLen1; // Remove NaN boxing or NaN, if not properly NaN boxed for double percision
 | 
				
			||||||
        logic  [`S_LEN-1:0]  XLen2, YLen2, ZLen2; // Remove NaN boxing or NaN, if not properly NaN boxed for single percision
 | 
					        logic  [`S_LEN-1:0]  XLen2, YLen2, ZLen2; // Remove NaN boxing or NaN, if not properly NaN boxed for single percision
 | 
				
			||||||
        logic  [`H_LEN-1:0]  XLen3, YLen3, ZLen3; // Remove NaN boxing or NaN, if not properly NaN boxed for half percision
 | 
					        logic  [`H_LEN-1:0]  XLen3, YLen3, ZLen3; // Remove NaN boxing or NaN, if not properly NaN boxed for half percision
 | 
				
			||||||
        logic                XOrigDenormE, YOrigDenormE;   // the original value of XYZ is denormalized
 | 
					        logic                YOrigDenormE;   // the original value of XYZ is denormalized
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        // Check NaN boxing, If the value is not properly NaN boxed, set the value to a quiet NaN - for double precision
 | 
					        // Check NaN boxing, If the value is not properly NaN boxed, set the value to a quiet NaN - for double precision
 | 
				
			||||||
        assign XLen1 = &X[`Q_LEN-1:`D_LEN] ? X[`D_LEN-1:0] : {1'b0, {`D_NE+1{1'b1}}, (`D_NF-1)'(0)};
 | 
					        assign XLen1 = &X[`Q_LEN-1:`D_LEN] ? X[`D_LEN-1:0] : {1'b0, {`D_NE+1{1'b1}}, (`D_NF-1)'(0)};
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,7 @@ module testbenchfp;
 | 
				
			|||||||
  string      FmaRnmTests[];  // list of FMA round to nearest max magnitude
 | 
					  string      FmaRnmTests[];  // list of FMA round to nearest max magnitude
 | 
				
			||||||
  logic [2:0] OpCtrl[];       // list of op controls
 | 
					  logic [2:0] OpCtrl[];       // list of op controls
 | 
				
			||||||
  logic [2:0] Unit[];         // list of units being tested
 | 
					  logic [2:0] Unit[];         // list of units being tested
 | 
				
			||||||
 | 
					  logic WriteInt[];           // Is being written to integer resgiter
 | 
				
			||||||
  logic [2:0] Frm[4:0] = {3'b100, 3'b010, 3'b011, 3'b001, 3'b000}; // rounding modes: rne-000, rz-001, ru-011, rd-010, rnm-100
 | 
					  logic [2:0] Frm[4:0] = {3'b100, 3'b010, 3'b011, 3'b001, 3'b000}; // rounding modes: rne-000, rz-001, ru-011, rd-010, rnm-100
 | 
				
			||||||
  logic [1:0] Fmt[];          // list of formats for the other units
 | 
					  logic [1:0] Fmt[];          // list of formats for the other units
 | 
				
			||||||
  logic [1:0] FmaFmt[];       // list of formats for the FMA
 | 
					  logic [1:0] FmaFmt[];       // list of formats for the FMA
 | 
				
			||||||
@ -37,6 +38,7 @@ module testbenchfp;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  logic [1:0]           FmaFmtVal, FmtVal;          // value of the current Fmt
 | 
					  logic [1:0]           FmaFmtVal, FmtVal;          // value of the current Fmt
 | 
				
			||||||
  logic [2:0]           UnitVal, OpCtrlVal, FrmVal; // vlaue of the currnet Unit/OpCtrl/FrmVal
 | 
					  logic [2:0]           UnitVal, OpCtrlVal, FrmVal; // vlaue of the currnet Unit/OpCtrl/FrmVal
 | 
				
			||||||
 | 
					  logic                 WriteIntVal;                // value of the current WriteInt
 | 
				
			||||||
  logic [`FLEN-1:0]     X, Y, Z;                    // inputs read from TestFloat
 | 
					  logic [`FLEN-1:0]     X, Y, Z;                    // inputs read from TestFloat
 | 
				
			||||||
  logic [`FLEN-1:0]     FmaRneX, FmaRneY, FmaRneZ;  // inputs read from TestFloat
 | 
					  logic [`FLEN-1:0]     FmaRneX, FmaRneY, FmaRneZ;  // inputs read from TestFloat
 | 
				
			||||||
  logic [`FLEN-1:0]     FmaRzX, FmaRzY, FmaRzZ;     // inputs read from TestFloat
 | 
					  logic [`FLEN-1:0]     FmaRzX, FmaRzY, FmaRzZ;     // inputs read from TestFloat
 | 
				
			||||||
@ -53,8 +55,9 @@ module testbenchfp;
 | 
				
			|||||||
  logic [4:0]	 	        ResFlg;                                                            // Result flags
 | 
					  logic [4:0]	 	        ResFlg;                                                            // Result flags
 | 
				
			||||||
  logic [4:0]           FmaRneResFlg, FmaRzResFlg, FmaRuResFlg, FmaRdResFlg, FmaRnmResFlg; // flags read form testfloat
 | 
					  logic [4:0]           FmaRneResFlg, FmaRzResFlg, FmaRuResFlg, FmaRdResFlg, FmaRnmResFlg; // flags read form testfloat
 | 
				
			||||||
  logic	[`FPSIZES/3:0]  ModFmt, FmaModFmt;  // format - 10 = half, 00 = single, 01 = double, 11 = quad
 | 
					  logic	[`FPSIZES/3:0]  ModFmt, FmaModFmt;  // format - 10 = half, 00 = single, 01 = double, 11 = quad
 | 
				
			||||||
  logic [`FLEN-1:0]     FmaRes, DivRes, CmpRes, CvtRes, CvtFpRes;  // Results from each unit
 | 
					  logic [`FLEN-1:0]     FmaRes, DivRes, CmpRes, CvtRes;  // Results from each unit
 | 
				
			||||||
  logic [4:0]           FmaFlg, CvtFpFlg, DivFlg, CvtIntFlg, CmpFlg;  // Outputed flags
 | 
					  logic [`XLEN-1:0]     CvtIntRes;  // Results from each unit
 | 
				
			||||||
 | 
					  logic [4:0]           FmaFlg, CvtFlg, DivFlg, CmpFlg;  // Outputed flags
 | 
				
			||||||
  logic                 ResNaN, FmaRneResNaN, FmaRzResNaN, FmaRuResNaN, FmaRdResNaN, FmaRnmResNaN;   // is the outputed result NaN
 | 
					  logic                 ResNaN, FmaRneResNaN, FmaRzResNaN, FmaRuResNaN, FmaRdResNaN, FmaRnmResNaN;   // is the outputed result NaN
 | 
				
			||||||
  logic                 AnsNaN, FmaRneAnsNaN, FmaRzAnsNaN, FmaRuAnsNaN, FmaRdAnsNaN, FmaRnmAnsNaN;   // is the correct answer NaN
 | 
					  logic                 AnsNaN, FmaRneAnsNaN, FmaRzAnsNaN, FmaRuAnsNaN, FmaRdAnsNaN, FmaRnmAnsNaN;   // is the correct answer NaN
 | 
				
			||||||
  logic                 NaNGood, FmaRneNaNGood, FmaRzNaNGood, FmaRuNaNGood, FmaRdNaNGood, FmaRnmNaNGood; // is the NaN answer correct
 | 
					  logic                 NaNGood, FmaRneNaNGood, FmaRzNaNGood, FmaRuNaNGood, FmaRdNaNGood, FmaRnmNaNGood; // is the NaN answer correct
 | 
				
			||||||
@ -150,6 +153,7 @@ module testbenchfp;
 | 
				
			|||||||
                                              Tests = {Tests, f128rv32cvtint};
 | 
					                                              Tests = {Tests, f128rv32cvtint};
 | 
				
			||||||
                                              // add the op-codes for these tests to the op-code list
 | 
					                                              // add the op-codes for these tests to the op-code list
 | 
				
			||||||
                                              OpCtrl = {OpCtrl, `FROM_UI_OPCTRL, `FROM_I_OPCTRL, `TO_UI_OPCTRL, `TO_I_OPCTRL};
 | 
					                                              OpCtrl = {OpCtrl, `FROM_UI_OPCTRL, `FROM_I_OPCTRL, `TO_UI_OPCTRL, `TO_I_OPCTRL};
 | 
				
			||||||
 | 
					                                              WriteInt = {WriteInt, 1'b0, 1'b0, 1'b1, 1'b1};
 | 
				
			||||||
                                              // add what unit is used and the fmt to their lists (one for each test)
 | 
					                                              // add what unit is used and the fmt to their lists (one for each test)
 | 
				
			||||||
                                              for(int i = 0; i<20; i++) begin
 | 
					                                              for(int i = 0; i<20; i++) begin
 | 
				
			||||||
                                                Unit = {Unit, `CVTINTUNIT};
 | 
					                                                Unit = {Unit, `CVTINTUNIT};
 | 
				
			||||||
@ -159,6 +163,7 @@ module testbenchfp;
 | 
				
			|||||||
                                                Tests = {Tests, f128rv64cvtint};
 | 
					                                                Tests = {Tests, f128rv64cvtint};
 | 
				
			||||||
                                              // add the op-codes for these tests to the op-code list
 | 
					                                              // add the op-codes for these tests to the op-code list
 | 
				
			||||||
                                                OpCtrl = {OpCtrl, `FROM_UL_OPCTRL, `FROM_L_OPCTRL, `TO_UL_OPCTRL, `TO_L_OPCTRL};
 | 
					                                                OpCtrl = {OpCtrl, `FROM_UL_OPCTRL, `FROM_L_OPCTRL, `TO_UL_OPCTRL, `TO_L_OPCTRL};
 | 
				
			||||||
 | 
					                                                WriteInt = {WriteInt, 1'b0, 1'b0, 1'b1, 1'b1};
 | 
				
			||||||
                                              // add what unit is used and the fmt to their lists (one for each test)
 | 
					                                              // add what unit is used and the fmt to their lists (one for each test)
 | 
				
			||||||
                                              for(int i = 0; i<20; i++) begin
 | 
					                                              for(int i = 0; i<20; i++) begin
 | 
				
			||||||
                                                Unit = {Unit, `CVTINTUNIT};
 | 
					                                                Unit = {Unit, `CVTINTUNIT};
 | 
				
			||||||
@ -172,39 +177,55 @@ module testbenchfp;
 | 
				
			|||||||
          Tests = {Tests, f128f64cvt};
 | 
					          Tests = {Tests, f128f64cvt};
 | 
				
			||||||
          // add the op-ctrls (i.e. the format of the result)
 | 
					          // add the op-ctrls (i.e. the format of the result)
 | 
				
			||||||
          OpCtrl = {OpCtrl, 3'b01, 3'b11};
 | 
					          OpCtrl = {OpCtrl, 3'b01, 3'b11};
 | 
				
			||||||
 | 
					          WriteInt = {WriteInt, 1'b0, 1'b0};
 | 
				
			||||||
          // add the unit being tested and fmt (input format)
 | 
					          // add the unit being tested and fmt (input format)
 | 
				
			||||||
          for(int i = 0; i<10; i++) begin
 | 
					          for(int i = 0; i<5; i++) begin
 | 
				
			||||||
            Unit = {Unit, `CVTFPUNIT};
 | 
					            Unit = {Unit, `CVTFPUNIT};
 | 
				
			||||||
            Fmt = {Fmt, 2'b11};
 | 
					            Fmt = {Fmt, 2'b11};
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
 | 
					          for(int i = 0; i<5; i++) begin
 | 
				
			||||||
 | 
					            Unit = {Unit, `CVTFPUNIT};
 | 
				
			||||||
 | 
					            Fmt = {Fmt, 2'b01};
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
        if(`F_SUPPORTED) begin // if single precision is supported
 | 
					        if(`F_SUPPORTED) begin // if single precision is supported
 | 
				
			||||||
          // add the 128 <-> 32 bit conversions to the to-be-tested list
 | 
					          // add the 128 <-> 32 bit conversions to the to-be-tested list
 | 
				
			||||||
          Tests = {Tests, f128f32cvt};
 | 
					          Tests = {Tests, f128f32cvt};
 | 
				
			||||||
          // add the op-ctrls (i.e. the format of the result)
 | 
					          // add the op-ctrls (i.e. the format of the result)
 | 
				
			||||||
          OpCtrl = {OpCtrl, 3'b00, 3'b11};
 | 
					          OpCtrl = {OpCtrl, 3'b00, 3'b11};
 | 
				
			||||||
 | 
					          WriteInt = {WriteInt, 1'b0, 1'b0};
 | 
				
			||||||
          // add the unit being tested and fmt (input format)
 | 
					          // add the unit being tested and fmt (input format)
 | 
				
			||||||
          for(int i = 0; i<10; i++) begin
 | 
					          for(int i = 0; i<5; i++) begin
 | 
				
			||||||
            Unit = {Unit, `CVTFPUNIT};
 | 
					            Unit = {Unit, `CVTFPUNIT};
 | 
				
			||||||
            Fmt = {Fmt, 2'b11};
 | 
					            Fmt = {Fmt, 2'b11};
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
 | 
					          for(int i = 0; i<5; i++) begin
 | 
				
			||||||
 | 
					            Unit = {Unit, `CVTFPUNIT};
 | 
				
			||||||
 | 
					            Fmt = {Fmt, 2'b00};
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
        if(`ZFH_SUPPORTED) begin // if half precision is supported
 | 
					        if(`ZFH_SUPPORTED) begin // if half precision is supported
 | 
				
			||||||
          // add the 128 <-> 16 bit conversions to the to-be-tested list
 | 
					          // add the 128 <-> 16 bit conversions to the to-be-tested list
 | 
				
			||||||
          Tests = {Tests, f128f16cvt};
 | 
					          Tests = {Tests, f128f16cvt};
 | 
				
			||||||
          // add the op-ctrls (i.e. the format of the result)
 | 
					          // add the op-ctrls (i.e. the format of the result)
 | 
				
			||||||
          OpCtrl = {OpCtrl, 3'b10, 3'b11};
 | 
					          OpCtrl = {OpCtrl, 3'b10, 3'b11};
 | 
				
			||||||
 | 
					          WriteInt = {WriteInt, 1'b0, 1'b0};
 | 
				
			||||||
          // add the unit being tested and fmt (input format)
 | 
					          // add the unit being tested and fmt (input format)
 | 
				
			||||||
          for(int i = 0; i<10; i++) begin
 | 
					          for(int i = 0; i<5; i++) begin
 | 
				
			||||||
            Unit = {Unit, `CVTFPUNIT};
 | 
					            Unit = {Unit, `CVTFPUNIT};
 | 
				
			||||||
            Fmt = {Fmt, 2'b11};
 | 
					            Fmt = {Fmt, 2'b11};
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
 | 
					          for(int i = 0; i<5; i++) begin
 | 
				
			||||||
 | 
					            Unit = {Unit, `CVTFPUNIT};
 | 
				
			||||||
 | 
					            Fmt = {Fmt, 2'b10};
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
      if (TEST === "cmp"   | TEST === "all") begin// if comparisons are being tested
 | 
					      if (TEST === "cmp"   | TEST === "all") begin// if comparisons are being tested
 | 
				
			||||||
        // add the compare tests/op-ctrls/unit/fmt
 | 
					        // add the compare tests/op-ctrls/unit/fmt
 | 
				
			||||||
        Tests = {Tests, f128cmp};
 | 
					        Tests = {Tests, f128cmp};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `EQ_OPCTRL, `LE_OPCTRL, `LT_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `EQ_OPCTRL, `LE_OPCTRL, `LT_OPCTRL};
 | 
				
			||||||
 | 
					          WriteInt = {WriteInt, 1'b0, 1'b0, 1'b0};
 | 
				
			||||||
          for(int i = 0; i<15; i++) begin
 | 
					          for(int i = 0; i<15; i++) begin
 | 
				
			||||||
            Unit = {Unit, `CMPUNIT};
 | 
					            Unit = {Unit, `CMPUNIT};
 | 
				
			||||||
            Fmt = {Fmt, 2'b11};
 | 
					            Fmt = {Fmt, 2'b11};
 | 
				
			||||||
@ -214,6 +235,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the addition tests/op-ctrls/unit/fmt
 | 
					        // add the addition tests/op-ctrls/unit/fmt
 | 
				
			||||||
        Tests = {Tests, f128add};
 | 
					        Tests = {Tests, f128add};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `ADD_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `ADD_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
          for(int i = 0; i<5; i++) begin
 | 
					          for(int i = 0; i<5; i++) begin
 | 
				
			||||||
            Unit = {Unit, `FMAUNIT};
 | 
					            Unit = {Unit, `FMAUNIT};
 | 
				
			||||||
            Fmt = {Fmt, 2'b11};
 | 
					            Fmt = {Fmt, 2'b11};
 | 
				
			||||||
@ -223,6 +245,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the subtraction tests/op-ctrls/unit/fmt
 | 
					        // add the subtraction tests/op-ctrls/unit/fmt
 | 
				
			||||||
        Tests = {Tests, f128sub};
 | 
					        Tests = {Tests, f128sub};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `SUB_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `SUB_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
          for(int i = 0; i<5; i++) begin
 | 
					          for(int i = 0; i<5; i++) begin
 | 
				
			||||||
            Unit = {Unit, `FMAUNIT};
 | 
					            Unit = {Unit, `FMAUNIT};
 | 
				
			||||||
            Fmt = {Fmt, 2'b11};
 | 
					            Fmt = {Fmt, 2'b11};
 | 
				
			||||||
@ -232,6 +255,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the multiply tests/op-ctrls/unit/fmt
 | 
					        // add the multiply tests/op-ctrls/unit/fmt
 | 
				
			||||||
        Tests = {Tests, f128mul};
 | 
					        Tests = {Tests, f128mul};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `MUL_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `MUL_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
          for(int i = 0; i<5; i++) begin
 | 
					          for(int i = 0; i<5; i++) begin
 | 
				
			||||||
            Unit = {Unit, `FMAUNIT};
 | 
					            Unit = {Unit, `FMAUNIT};
 | 
				
			||||||
            Fmt = {Fmt, 2'b11};
 | 
					            Fmt = {Fmt, 2'b11};
 | 
				
			||||||
@ -241,6 +265,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the divide tests/op-ctrls/unit/fmt
 | 
					        // add the divide tests/op-ctrls/unit/fmt
 | 
				
			||||||
        Tests = {Tests, f128div};
 | 
					        Tests = {Tests, f128div};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `DIV_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `DIV_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
          for(int i = 0; i<5; i++) begin
 | 
					          for(int i = 0; i<5; i++) begin
 | 
				
			||||||
            Unit = {Unit, `DIVUNIT};
 | 
					            Unit = {Unit, `DIVUNIT};
 | 
				
			||||||
            Fmt = {Fmt, 2'b11};
 | 
					            Fmt = {Fmt, 2'b11};
 | 
				
			||||||
@ -250,6 +275,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the square-root tests/op-ctrls/unit/fmt
 | 
					        // add the square-root tests/op-ctrls/unit/fmt
 | 
				
			||||||
        Tests = {Tests, f128sqrt};
 | 
					        Tests = {Tests, f128sqrt};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `SQRT_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `SQRT_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
          for(int i = 0; i<5; i++) begin
 | 
					          for(int i = 0; i<5; i++) begin
 | 
				
			||||||
            Unit = {Unit, `DIVUNIT};
 | 
					            Unit = {Unit, `DIVUNIT};
 | 
				
			||||||
            Fmt = {Fmt, 2'b11};
 | 
					            Fmt = {Fmt, 2'b11};
 | 
				
			||||||
@ -264,9 +290,7 @@ module testbenchfp;
 | 
				
			|||||||
        FmaRdTests  = {FmaRdTests,  "f128_mulAdd_rd.tv"};
 | 
					        FmaRdTests  = {FmaRdTests,  "f128_mulAdd_rd.tv"};
 | 
				
			||||||
        FmaRnmTests = {FmaRnmTests, "f128_mulAdd_rnm.tv"};
 | 
					        FmaRnmTests = {FmaRnmTests, "f128_mulAdd_rnm.tv"};
 | 
				
			||||||
        // add the format for the Fma
 | 
					        // add the format for the Fma
 | 
				
			||||||
        for(int i = 0; i<5; i++) begin
 | 
					        FmaFmt = {FmaFmt, 2'b11};
 | 
				
			||||||
          FmaFmt = {FmaFmt, 2'b11};
 | 
					 | 
				
			||||||
        end
 | 
					 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
    if (`D_SUPPORTED) begin // if double precision is supported
 | 
					    if (`D_SUPPORTED) begin // if double precision is supported
 | 
				
			||||||
@ -274,6 +298,7 @@ module testbenchfp;
 | 
				
			|||||||
                                              Tests = {Tests, f64rv32cvtint};
 | 
					                                              Tests = {Tests, f64rv32cvtint};
 | 
				
			||||||
                                              // add the op-codes for these tests to the op-code list
 | 
					                                              // add the op-codes for these tests to the op-code list
 | 
				
			||||||
                                              OpCtrl = {OpCtrl, `FROM_UI_OPCTRL, `FROM_I_OPCTRL, `TO_UI_OPCTRL, `TO_I_OPCTRL};
 | 
					                                              OpCtrl = {OpCtrl, `FROM_UI_OPCTRL, `FROM_I_OPCTRL, `TO_UI_OPCTRL, `TO_I_OPCTRL};
 | 
				
			||||||
 | 
					                                              WriteInt = {WriteInt, 1'b0, 1'b0, 1'b1, 1'b1};
 | 
				
			||||||
                                              // add what unit is used and the fmt to their lists (one for each test)
 | 
					                                              // add what unit is used and the fmt to their lists (one for each test)
 | 
				
			||||||
                                              for(int i = 0; i<20; i++) begin
 | 
					                                              for(int i = 0; i<20; i++) begin
 | 
				
			||||||
                                                Unit = {Unit, `CVTINTUNIT};
 | 
					                                                Unit = {Unit, `CVTINTUNIT};
 | 
				
			||||||
@ -281,9 +306,10 @@ module testbenchfp;
 | 
				
			|||||||
                                              end
 | 
					                                              end
 | 
				
			||||||
                                              if (`XLEN == 64) begin // if 64-bit integers are being supported
 | 
					                                              if (`XLEN == 64) begin // if 64-bit integers are being supported
 | 
				
			||||||
                                                Tests = {Tests, f64rv64cvtint};
 | 
					                                                Tests = {Tests, f64rv64cvtint};
 | 
				
			||||||
                                              // add the op-codes for these tests to the op-code list
 | 
					                                                // add the op-codes for these tests to the op-code list
 | 
				
			||||||
                                                OpCtrl = {OpCtrl, `FROM_UL_OPCTRL, `FROM_L_OPCTRL, `TO_UL_OPCTRL, `TO_L_OPCTRL};
 | 
					                                                OpCtrl = {OpCtrl, `FROM_UL_OPCTRL, `FROM_L_OPCTRL, `TO_UL_OPCTRL, `TO_L_OPCTRL};
 | 
				
			||||||
                                              // add what unit is used and the fmt to their lists (one for each test)
 | 
					                                                WriteInt = {WriteInt, 1'b0, 1'b0, 1'b1, 1'b1};
 | 
				
			||||||
 | 
					                                                // add what unit is used and the fmt to their lists (one for each test)
 | 
				
			||||||
                                                for(int i = 0; i<20; i++) begin
 | 
					                                                for(int i = 0; i<20; i++) begin
 | 
				
			||||||
                                                  Unit = {Unit, `CVTINTUNIT};
 | 
					                                                  Unit = {Unit, `CVTINTUNIT};
 | 
				
			||||||
                                                  Fmt = {Fmt, 2'b01};
 | 
					                                                  Fmt = {Fmt, 2'b01};
 | 
				
			||||||
@ -296,28 +322,39 @@ module testbenchfp;
 | 
				
			|||||||
          Tests = {Tests, f64f32cvt};
 | 
					          Tests = {Tests, f64f32cvt};
 | 
				
			||||||
          // add the op-ctrls (i.e. the format of the result)
 | 
					          // add the op-ctrls (i.e. the format of the result)
 | 
				
			||||||
          OpCtrl = {OpCtrl, 3'b00, 3'b01};
 | 
					          OpCtrl = {OpCtrl, 3'b00, 3'b01};
 | 
				
			||||||
 | 
					          WriteInt = {WriteInt, 1'b0, 1'b0};
 | 
				
			||||||
          // add the unit being tested and fmt (input format)
 | 
					          // add the unit being tested and fmt (input format)
 | 
				
			||||||
          for(int i = 0; i<10; i++) begin
 | 
					          for(int i = 0; i<5; i++) begin
 | 
				
			||||||
            Unit = {Unit, `CVTFPUNIT};
 | 
					            Unit = {Unit, `CVTFPUNIT};
 | 
				
			||||||
            Fmt = {Fmt, 2'b01};
 | 
					            Fmt = {Fmt, 2'b01};
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
 | 
					          for(int i = 0; i<5; i++) begin
 | 
				
			||||||
 | 
					            Unit = {Unit, `CVTFPUNIT};
 | 
				
			||||||
 | 
					            Fmt = {Fmt, 2'b00};
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
        if(`ZFH_SUPPORTED) begin // if half precision is supported
 | 
					        if(`ZFH_SUPPORTED) begin // if half precision is supported
 | 
				
			||||||
          // add the 64 <-> 16 bit conversions to the to-be-tested list
 | 
					          // add the 64 <-> 16 bit conversions to the to-be-tested list
 | 
				
			||||||
          Tests = {Tests, f64f16cvt};
 | 
					          Tests = {Tests, f64f16cvt};
 | 
				
			||||||
          // add the op-ctrls (i.e. the format of the result)
 | 
					          // add the op-ctrls (i.e. the format of the result)
 | 
				
			||||||
          OpCtrl = {OpCtrl, 3'b10, 3'b01};
 | 
					          OpCtrl = {OpCtrl, 3'b10, 3'b01};
 | 
				
			||||||
 | 
					          WriteInt = {WriteInt, 1'b0, 1'b0};
 | 
				
			||||||
          // add the unit being tested and fmt (input format)
 | 
					          // add the unit being tested and fmt (input format)
 | 
				
			||||||
          for(int i = 0; i<10; i++) begin
 | 
					          for(int i = 0; i<5; i++) begin
 | 
				
			||||||
            Unit = {Unit, `CVTFPUNIT};
 | 
					            Unit = {Unit, `CVTFPUNIT};
 | 
				
			||||||
            Fmt = {Fmt, 2'b01};
 | 
					            Fmt = {Fmt, 2'b01};
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
 | 
					          for(int i = 0; i<5; i++) begin
 | 
				
			||||||
 | 
					            Unit = {Unit, `CVTFPUNIT};
 | 
				
			||||||
 | 
					            Fmt = {Fmt, 2'b10};
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
      if (TEST === "cmp"   | TEST === "all") begin // if comparisions are being tested
 | 
					      if (TEST === "cmp"   | TEST === "all") begin // if comparisions are being tested
 | 
				
			||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f64cmp};
 | 
					        Tests = {Tests, f64cmp};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `EQ_OPCTRL, `LE_OPCTRL, `LT_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `EQ_OPCTRL, `LE_OPCTRL, `LT_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0, 1'b0, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<15; i++) begin
 | 
					        for(int i = 0; i<15; i++) begin
 | 
				
			||||||
          Unit = {Unit, `CMPUNIT};
 | 
					          Unit = {Unit, `CMPUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b01};
 | 
					          Fmt = {Fmt, 2'b01};
 | 
				
			||||||
@ -327,6 +364,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f64add};
 | 
					        Tests = {Tests, f64add};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `ADD_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `ADD_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<5; i++) begin
 | 
					        for(int i = 0; i<5; i++) begin
 | 
				
			||||||
          Unit = {Unit, `FMAUNIT};
 | 
					          Unit = {Unit, `FMAUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b01};
 | 
					          Fmt = {Fmt, 2'b01};
 | 
				
			||||||
@ -336,6 +374,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f64sub};
 | 
					        Tests = {Tests, f64sub};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `SUB_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `SUB_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<5; i++) begin
 | 
					        for(int i = 0; i<5; i++) begin
 | 
				
			||||||
          Unit = {Unit, `FMAUNIT};
 | 
					          Unit = {Unit, `FMAUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b01};
 | 
					          Fmt = {Fmt, 2'b01};
 | 
				
			||||||
@ -345,6 +384,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f64mul};
 | 
					        Tests = {Tests, f64mul};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `MUL_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `MUL_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<5; i++) begin
 | 
					        for(int i = 0; i<5; i++) begin
 | 
				
			||||||
          Unit = {Unit, `FMAUNIT};
 | 
					          Unit = {Unit, `FMAUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b01};
 | 
					          Fmt = {Fmt, 2'b01};
 | 
				
			||||||
@ -354,6 +394,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f64div};
 | 
					        Tests = {Tests, f64div};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `DIV_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `DIV_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<5; i++) begin
 | 
					        for(int i = 0; i<5; i++) begin
 | 
				
			||||||
          Unit = {Unit, `DIVUNIT};
 | 
					          Unit = {Unit, `DIVUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b01};
 | 
					          Fmt = {Fmt, 2'b01};
 | 
				
			||||||
@ -363,6 +404,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f64sqrt};
 | 
					        Tests = {Tests, f64sqrt};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `SQRT_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `SQRT_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<5; i++) begin
 | 
					        for(int i = 0; i<5; i++) begin
 | 
				
			||||||
          Unit = {Unit, `DIVUNIT};
 | 
					          Unit = {Unit, `DIVUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b01};
 | 
					          Fmt = {Fmt, 2'b01};
 | 
				
			||||||
@ -376,9 +418,7 @@ module testbenchfp;
 | 
				
			|||||||
        FmaRuTests  = {FmaRuTests,  "f64_mulAdd_ru.tv"};
 | 
					        FmaRuTests  = {FmaRuTests,  "f64_mulAdd_ru.tv"};
 | 
				
			||||||
        FmaRdTests  = {FmaRdTests,  "f64_mulAdd_rd.tv"};
 | 
					        FmaRdTests  = {FmaRdTests,  "f64_mulAdd_rd.tv"};
 | 
				
			||||||
        FmaRnmTests = {FmaRnmTests, "f64_mulAdd_rnm.tv"};
 | 
					        FmaRnmTests = {FmaRnmTests, "f64_mulAdd_rnm.tv"};
 | 
				
			||||||
        for(int i = 0; i<5; i++) begin
 | 
					        FmaFmt = {FmaFmt, 2'b01};
 | 
				
			||||||
          FmaFmt = {FmaFmt, 2'b01};
 | 
					 | 
				
			||||||
        end
 | 
					 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
    if (`F_SUPPORTED) begin // if single precision being supported
 | 
					    if (`F_SUPPORTED) begin // if single precision being supported
 | 
				
			||||||
@ -386,6 +426,7 @@ module testbenchfp;
 | 
				
			|||||||
                                              Tests = {Tests, f32rv32cvtint};
 | 
					                                              Tests = {Tests, f32rv32cvtint};
 | 
				
			||||||
                                              // add the op-codes for these tests to the op-code list
 | 
					                                              // add the op-codes for these tests to the op-code list
 | 
				
			||||||
                                              OpCtrl = {OpCtrl, `FROM_UI_OPCTRL, `FROM_I_OPCTRL, `TO_UI_OPCTRL, `TO_I_OPCTRL};
 | 
					                                              OpCtrl = {OpCtrl, `FROM_UI_OPCTRL, `FROM_I_OPCTRL, `TO_UI_OPCTRL, `TO_I_OPCTRL};
 | 
				
			||||||
 | 
					                                              WriteInt = {WriteInt, 1'b0, 1'b0, 1'b1, 1'b1};
 | 
				
			||||||
                                              // add what unit is used and the fmt to their lists (one for each test)
 | 
					                                              // add what unit is used and the fmt to their lists (one for each test)
 | 
				
			||||||
                                              for(int i = 0; i<20; i++) begin
 | 
					                                              for(int i = 0; i<20; i++) begin
 | 
				
			||||||
                                                Unit = {Unit, `CVTINTUNIT};
 | 
					                                                Unit = {Unit, `CVTINTUNIT};
 | 
				
			||||||
@ -393,9 +434,10 @@ module testbenchfp;
 | 
				
			|||||||
                                              end
 | 
					                                              end
 | 
				
			||||||
                                              if (`XLEN == 64) begin // if 64-bit integers are supported
 | 
					                                              if (`XLEN == 64) begin // if 64-bit integers are supported
 | 
				
			||||||
                                                Tests = {Tests, f32rv64cvtint};
 | 
					                                                Tests = {Tests, f32rv64cvtint};
 | 
				
			||||||
                                              // add the op-codes for these tests to the op-code list
 | 
					                                                // add the op-codes for these tests to the op-code list
 | 
				
			||||||
                                                OpCtrl = {OpCtrl, `FROM_UL_OPCTRL, `FROM_L_OPCTRL, `TO_UL_OPCTRL, `TO_L_OPCTRL};
 | 
					                                                OpCtrl = {OpCtrl, `FROM_UL_OPCTRL, `FROM_L_OPCTRL, `TO_UL_OPCTRL, `TO_L_OPCTRL};
 | 
				
			||||||
                                              // add what unit is used and the fmt to their lists (one for each test)
 | 
					                                                WriteInt = {WriteInt, 1'b0, 1'b0, 1'b1, 1'b1};
 | 
				
			||||||
 | 
					                                                // add what unit is used and the fmt to their lists (one for each test)
 | 
				
			||||||
                                              for(int i = 0; i<20; i++) begin
 | 
					                                              for(int i = 0; i<20; i++) begin
 | 
				
			||||||
                                                Unit = {Unit, `CVTINTUNIT};
 | 
					                                                Unit = {Unit, `CVTINTUNIT};
 | 
				
			||||||
                                                Fmt = {Fmt, 2'b00};
 | 
					                                                Fmt = {Fmt, 2'b00};
 | 
				
			||||||
@ -408,17 +450,23 @@ module testbenchfp;
 | 
				
			|||||||
          Tests = {Tests, f32f16cvt};
 | 
					          Tests = {Tests, f32f16cvt};
 | 
				
			||||||
          // add the op-ctrls (i.e. the format of the result)
 | 
					          // add the op-ctrls (i.e. the format of the result)
 | 
				
			||||||
          OpCtrl = {OpCtrl, 3'b10, 3'b00};
 | 
					          OpCtrl = {OpCtrl, 3'b10, 3'b00};
 | 
				
			||||||
 | 
					          WriteInt = {WriteInt, 1'b0, 1'b0};
 | 
				
			||||||
          // add the unit being tested and fmt (input format)
 | 
					          // add the unit being tested and fmt (input format)
 | 
				
			||||||
          for(int i = 0; i<10; i++) begin
 | 
					          for(int i = 0; i<5; i++) begin
 | 
				
			||||||
            Unit = {Unit, `CVTFPUNIT};
 | 
					            Unit = {Unit, `CVTFPUNIT};
 | 
				
			||||||
            Fmt = {Fmt, 2'b00};
 | 
					            Fmt = {Fmt, 2'b00};
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
 | 
					          for(int i = 0; i<5; i++) begin
 | 
				
			||||||
 | 
					            Unit = {Unit, `CVTFPUNIT};
 | 
				
			||||||
 | 
					            Fmt = {Fmt, 2'b10};
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
      if (TEST === "cmp"   | TEST === "all") begin // if comparision is being tested
 | 
					      if (TEST === "cmp"   | TEST === "all") begin // if comparision is being tested
 | 
				
			||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f32cmp};
 | 
					        Tests = {Tests, f32cmp};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `EQ_OPCTRL, `LE_OPCTRL, `LT_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `EQ_OPCTRL, `LE_OPCTRL, `LT_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0, 1'b0, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<15; i++) begin
 | 
					        for(int i = 0; i<15; i++) begin
 | 
				
			||||||
          Unit = {Unit, `CMPUNIT};
 | 
					          Unit = {Unit, `CMPUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b00};
 | 
					          Fmt = {Fmt, 2'b00};
 | 
				
			||||||
@ -428,6 +476,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f32add};
 | 
					        Tests = {Tests, f32add};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `ADD_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `ADD_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<5; i++) begin
 | 
					        for(int i = 0; i<5; i++) begin
 | 
				
			||||||
          Unit = {Unit, `FMAUNIT};
 | 
					          Unit = {Unit, `FMAUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b00};
 | 
					          Fmt = {Fmt, 2'b00};
 | 
				
			||||||
@ -437,6 +486,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f32sub};
 | 
					        Tests = {Tests, f32sub};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `SUB_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `SUB_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<5; i++) begin
 | 
					        for(int i = 0; i<5; i++) begin
 | 
				
			||||||
          Unit = {Unit, `FMAUNIT};
 | 
					          Unit = {Unit, `FMAUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b00};
 | 
					          Fmt = {Fmt, 2'b00};
 | 
				
			||||||
@ -446,6 +496,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f32mul};
 | 
					        Tests = {Tests, f32mul};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `MUL_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `MUL_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<5; i++) begin
 | 
					        for(int i = 0; i<5; i++) begin
 | 
				
			||||||
          Unit = {Unit, `FMAUNIT};
 | 
					          Unit = {Unit, `FMAUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b00};
 | 
					          Fmt = {Fmt, 2'b00};
 | 
				
			||||||
@ -455,6 +506,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f32div};
 | 
					        Tests = {Tests, f32div};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `DIV_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `DIV_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<5; i++) begin
 | 
					        for(int i = 0; i<5; i++) begin
 | 
				
			||||||
          Unit = {Unit, `DIVUNIT};
 | 
					          Unit = {Unit, `DIVUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b00};
 | 
					          Fmt = {Fmt, 2'b00};
 | 
				
			||||||
@ -464,6 +516,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f32sqrt};
 | 
					        Tests = {Tests, f32sqrt};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `SQRT_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `SQRT_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<5; i++) begin
 | 
					        for(int i = 0; i<5; i++) begin
 | 
				
			||||||
          Unit = {Unit, `DIVUNIT};
 | 
					          Unit = {Unit, `DIVUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b00};
 | 
					          Fmt = {Fmt, 2'b00};
 | 
				
			||||||
@ -473,13 +526,11 @@ module testbenchfp;
 | 
				
			|||||||
        // add each rounding mode to it's own list of tests
 | 
					        // add each rounding mode to it's own list of tests
 | 
				
			||||||
        //    - fma tests are very long, so run all rounding modes in parallel
 | 
					        //    - fma tests are very long, so run all rounding modes in parallel
 | 
				
			||||||
        FmaRneTests = {FmaRneTests, "f32_mulAdd_rne.tv"};
 | 
					        FmaRneTests = {FmaRneTests, "f32_mulAdd_rne.tv"};
 | 
				
			||||||
        // FmaRzTests  = {FmaRzTests,  "f32_mulAdd_rz.tv"};
 | 
					        FmaRzTests  = {FmaRzTests,  "f32_mulAdd_rz.tv"};
 | 
				
			||||||
        // FmaRuTests  = {FmaRuTests,  "f32_mulAdd_ru.tv"};
 | 
					        FmaRuTests  = {FmaRuTests,  "f32_mulAdd_ru.tv"};
 | 
				
			||||||
        // FmaRdTests  = {FmaRdTests,  "f32_mulAdd_rd.tv"};
 | 
					        FmaRdTests  = {FmaRdTests,  "f32_mulAdd_rd.tv"};
 | 
				
			||||||
        // FmaRnmTests = {FmaRnmTests, "f32_mulAdd_rnm.tv"};
 | 
					        FmaRnmTests = {FmaRnmTests, "f32_mulAdd_rnm.tv"};
 | 
				
			||||||
        // for(int i = 0; i<5; i++) begin
 | 
					        FmaFmt = {FmaFmt, 2'b00};
 | 
				
			||||||
          FmaFmt = {FmaFmt, 2'b00};
 | 
					 | 
				
			||||||
        // end
 | 
					 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
    if (`ZFH_SUPPORTED) begin // if half precision supported
 | 
					    if (`ZFH_SUPPORTED) begin // if half precision supported
 | 
				
			||||||
@ -487,6 +538,7 @@ module testbenchfp;
 | 
				
			|||||||
                                              Tests = {Tests, f16rv32cvtint};
 | 
					                                              Tests = {Tests, f16rv32cvtint};
 | 
				
			||||||
                                              // add the op-codes for these tests to the op-code list
 | 
					                                              // add the op-codes for these tests to the op-code list
 | 
				
			||||||
                                              OpCtrl = {OpCtrl, `FROM_UI_OPCTRL, `FROM_I_OPCTRL, `TO_UI_OPCTRL, `TO_I_OPCTRL};
 | 
					                                              OpCtrl = {OpCtrl, `FROM_UI_OPCTRL, `FROM_I_OPCTRL, `TO_UI_OPCTRL, `TO_I_OPCTRL};
 | 
				
			||||||
 | 
					                                              WriteInt = {WriteInt, 1'b0, 1'b0, 1'b1, 1'b1};
 | 
				
			||||||
                                              // add what unit is used and the fmt to their lists (one for each test)
 | 
					                                              // add what unit is used and the fmt to their lists (one for each test)
 | 
				
			||||||
                                              for(int i = 0; i<20; i++) begin
 | 
					                                              for(int i = 0; i<20; i++) begin
 | 
				
			||||||
                                                Unit = {Unit, `CVTINTUNIT};
 | 
					                                                Unit = {Unit, `CVTINTUNIT};
 | 
				
			||||||
@ -496,6 +548,7 @@ module testbenchfp;
 | 
				
			|||||||
                                              Tests = {Tests, f16rv64cvtint, f16rv32cvtint};
 | 
					                                              Tests = {Tests, f16rv64cvtint, f16rv32cvtint};
 | 
				
			||||||
                                              // add the op-codes for these tests to the op-code list
 | 
					                                              // add the op-codes for these tests to the op-code list
 | 
				
			||||||
                                              OpCtrl = {OpCtrl, `FROM_UL_OPCTRL, `FROM_L_OPCTRL, `TO_UL_OPCTRL, `TO_L_OPCTRL};
 | 
					                                              OpCtrl = {OpCtrl, `FROM_UL_OPCTRL, `FROM_L_OPCTRL, `TO_UL_OPCTRL, `TO_L_OPCTRL};
 | 
				
			||||||
 | 
					                                              WriteInt = {WriteInt, 1'b0, 1'b0, 1'b1, 1'b1};
 | 
				
			||||||
                                              // add what unit is used and the fmt to their lists (one for each test)
 | 
					                                              // add what unit is used and the fmt to their lists (one for each test)
 | 
				
			||||||
                                              for(int i = 0; i<20; i++) begin
 | 
					                                              for(int i = 0; i<20; i++) begin
 | 
				
			||||||
                                                Unit = {Unit, `CVTINTUNIT};
 | 
					                                                Unit = {Unit, `CVTINTUNIT};
 | 
				
			||||||
@ -507,6 +560,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f16cmp};
 | 
					        Tests = {Tests, f16cmp};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `EQ_OPCTRL, `LE_OPCTRL, `LT_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `EQ_OPCTRL, `LE_OPCTRL, `LT_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0, 1'b0, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<15; i++) begin
 | 
					        for(int i = 0; i<15; i++) begin
 | 
				
			||||||
          Unit = {Unit, `CMPUNIT};
 | 
					          Unit = {Unit, `CMPUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b10};
 | 
					          Fmt = {Fmt, 2'b10};
 | 
				
			||||||
@ -516,6 +570,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f16add};
 | 
					        Tests = {Tests, f16add};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `ADD_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `ADD_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<5; i++) begin
 | 
					        for(int i = 0; i<5; i++) begin
 | 
				
			||||||
          Unit = {Unit, `FMAUNIT};
 | 
					          Unit = {Unit, `FMAUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b10};
 | 
					          Fmt = {Fmt, 2'b10};
 | 
				
			||||||
@ -525,6 +580,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f16sub};
 | 
					        Tests = {Tests, f16sub};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `SUB_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `SUB_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<5; i++) begin
 | 
					        for(int i = 0; i<5; i++) begin
 | 
				
			||||||
          Unit = {Unit, `FMAUNIT};
 | 
					          Unit = {Unit, `FMAUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b10};
 | 
					          Fmt = {Fmt, 2'b10};
 | 
				
			||||||
@ -534,6 +590,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f16mul};
 | 
					        Tests = {Tests, f16mul};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `MUL_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `MUL_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<5; i++) begin
 | 
					        for(int i = 0; i<5; i++) begin
 | 
				
			||||||
          Unit = {Unit, `FMAUNIT};
 | 
					          Unit = {Unit, `FMAUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b10};
 | 
					          Fmt = {Fmt, 2'b10};
 | 
				
			||||||
@ -543,6 +600,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f16div};
 | 
					        Tests = {Tests, f16div};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `DIV_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `DIV_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<5; i++) begin
 | 
					        for(int i = 0; i<5; i++) begin
 | 
				
			||||||
          Unit = {Unit, `DIVUNIT};
 | 
					          Unit = {Unit, `DIVUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b10};
 | 
					          Fmt = {Fmt, 2'b10};
 | 
				
			||||||
@ -552,6 +610,7 @@ module testbenchfp;
 | 
				
			|||||||
        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
					        // add the correct tests/op-ctrls/unit/fmt to their lists
 | 
				
			||||||
        Tests = {Tests, f16sqrt};
 | 
					        Tests = {Tests, f16sqrt};
 | 
				
			||||||
        OpCtrl = {OpCtrl, `SQRT_OPCTRL};
 | 
					        OpCtrl = {OpCtrl, `SQRT_OPCTRL};
 | 
				
			||||||
 | 
					        WriteInt = {WriteInt, 1'b0};
 | 
				
			||||||
        for(int i = 0; i<5; i++) begin
 | 
					        for(int i = 0; i<5; i++) begin
 | 
				
			||||||
          Unit = {Unit, `DIVUNIT};
 | 
					          Unit = {Unit, `DIVUNIT};
 | 
				
			||||||
          Fmt = {Fmt, 2'b10};
 | 
					          Fmt = {Fmt, 2'b10};
 | 
				
			||||||
@ -561,13 +620,11 @@ module testbenchfp;
 | 
				
			|||||||
        // add each rounding mode to it's own list of tests
 | 
					        // add each rounding mode to it's own list of tests
 | 
				
			||||||
        //    - fma tests are very long, so run all rounding modes in parallel
 | 
					        //    - fma tests are very long, so run all rounding modes in parallel
 | 
				
			||||||
        FmaRneTests = {FmaRneTests, "f16_mulAdd_rne.tv"};
 | 
					        FmaRneTests = {FmaRneTests, "f16_mulAdd_rne.tv"};
 | 
				
			||||||
        // FmaRzTests  = {FmaRzTests,  "f16_mulAdd_rz.tv"};
 | 
					        FmaRzTests  = {FmaRzTests,  "f16_mulAdd_rz.tv"};
 | 
				
			||||||
        // FmaRuTests  = {FmaRuTests,  "f16_mulAdd_ru.tv"};
 | 
					        FmaRuTests  = {FmaRuTests,  "f16_mulAdd_ru.tv"};
 | 
				
			||||||
        // FmaRdTests  = {FmaRdTests,  "f16_mulAdd_rd.tv"};
 | 
					        FmaRdTests  = {FmaRdTests,  "f16_mulAdd_rd.tv"};
 | 
				
			||||||
        // FmaRnmTests = {FmaRnmTests, "f16_mulAdd_rnm.tv"};
 | 
					        FmaRnmTests = {FmaRnmTests, "f16_mulAdd_rnm.tv"};
 | 
				
			||||||
        // for(int i = 0; i<5; i++) begin
 | 
					        FmaFmt = {FmaFmt, 2'b10};
 | 
				
			||||||
          FmaFmt = {FmaFmt, 2'b10};
 | 
					 | 
				
			||||||
        // end
 | 
					 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -606,6 +663,7 @@ module testbenchfp;
 | 
				
			|||||||
  always_comb UnitVal = Unit[TestNum];
 | 
					  always_comb UnitVal = Unit[TestNum];
 | 
				
			||||||
  always_comb FmtVal = Fmt[TestNum];
 | 
					  always_comb FmtVal = Fmt[TestNum];
 | 
				
			||||||
  always_comb OpCtrlVal = OpCtrl[OpCtrlNum];
 | 
					  always_comb OpCtrlVal = OpCtrl[OpCtrlNum];
 | 
				
			||||||
 | 
					  always_comb WriteIntVal = WriteInt[OpCtrlNum];
 | 
				
			||||||
  always_comb FrmVal = Frm[FrmNum];
 | 
					  always_comb FrmVal = Frm[FrmNum];
 | 
				
			||||||
  assign Mult = OpCtrlVal === 3'b100;
 | 
					  assign Mult = OpCtrlVal === 3'b100;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -673,7 +731,7 @@ module testbenchfp;
 | 
				
			|||||||
  readvectors readvectors          (.clk, .Fmt(FmtVal), .ModFmt, .TestVector(TestVectors[VectorNum]), .VectorNum, .Ans(Ans), .AnsFlg(AnsFlg), .SrcA, 
 | 
					  readvectors readvectors          (.clk, .Fmt(FmtVal), .ModFmt, .TestVector(TestVectors[VectorNum]), .VectorNum, .Ans(Ans), .AnsFlg(AnsFlg), .SrcA, 
 | 
				
			||||||
                                    .XSgnE(XSgn), .YSgnE(YSgn), .ZSgnE(ZSgn), .Unit (UnitVal),
 | 
					                                    .XSgnE(XSgn), .YSgnE(YSgn), .ZSgnE(ZSgn), .Unit (UnitVal),
 | 
				
			||||||
                                    .XExpE(XExp), .YExpE(YExp), .ZExpE(ZExp), .TestNum, .OpCtrl(OpCtrlVal),
 | 
					                                    .XExpE(XExp), .YExpE(YExp), .ZExpE(ZExp), .TestNum, .OpCtrl(OpCtrlVal),
 | 
				
			||||||
                                    .XManE(XMan), .YManE(YMan), .ZManE(ZMan), .ZOrigDenormE(ZOrigDenorm),
 | 
					                                    .XManE(XMan), .YManE(YMan), .ZManE(ZMan), .ZOrigDenormE(ZOrigDenorm), .XOrigDenormE(XOrigDenorm),
 | 
				
			||||||
                                    .XNaNE(XNaN), .YNaNE(YNaN), .ZNaNE(ZNaN),
 | 
					                                    .XNaNE(XNaN), .YNaNE(YNaN), .ZNaNE(ZNaN),
 | 
				
			||||||
                                    .XSNaNE(XSNaN), .YSNaNE(YSNaN), .ZSNaNE(ZSNaN), 
 | 
					                                    .XSNaNE(XSNaN), .YSNaNE(YSNaN), .ZSNaNE(ZSNaN), 
 | 
				
			||||||
                                    .XDenormE(XDenorm), .YDenormE(YDenorm), .ZDenormE(ZDenorm), 
 | 
					                                    .XDenormE(XDenorm), .YDenormE(YDenorm), .ZDenormE(ZDenorm), 
 | 
				
			||||||
@ -809,7 +867,12 @@ module testbenchfp;
 | 
				
			|||||||
              .SumM(SumE), .NegSumM(NegSumE), .InvZM(InvZE), .NormCntM(NormCntE), .ZSgnEffM(ZSgnEffE), .PSgnM(PSgnE), .FmtM(ModFmt), .FrmM(FrmVal), 
 | 
					              .SumM(SumE), .NegSumM(NegSumE), .InvZM(InvZE), .NormCntM(NormCntE), .ZSgnEffM(ZSgnEffE), .PSgnM(PSgnE), .FmtM(ModFmt), .FrmM(FrmVal), 
 | 
				
			||||||
              .FMAFlgM(FmaFlg), .FMAResM(FmaRes), .Mult);
 | 
					              .FMAFlgM(FmaFlg), .FMAResM(FmaRes), .Mult);
 | 
				
			||||||
  // fcvtfp fcvtfp (.XExpE(XExp), .XManE(XMan), .XSgnE(XSgn), .XZeroE(XZero), .XDenormE(XDenorm), .XInfE(XInf), 
 | 
					  // fcvtfp fcvtfp (.XExpE(XExp), .XManE(XMan), .XSgnE(XSgn), .XZeroE(XZero), .XDenormE(XDenorm), .XInfE(XInf), 
 | 
				
			||||||
  //             .XNaNE(XNaN), .XSNaNE(XSNaN), .FrmE(Frmal), .FmtE(ModFmt), .CvtFpRes, .CvtFpFlgE);
 | 
					  //             .XNaNE(XNaN), .XSNaNE(XSNaN), .FrmE(FrmVal), .FmtE(ModFmt), .CvtFpResE(CvtFpRes), .CvtFpFlgE(CvtFpFlg));
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					fcvt fcvt (.XSgnE(XSgn), .XExpE(XExp), .XManE(XMan), .ForwardedSrcAE(SrcA), .FWriteIntE(WriteIntVal), 
 | 
				
			||||||
 | 
					            .XZeroE(XZero), .XOrigDenormE(XOrigDenorm), .FOpCtrlE(OpCtrlVal),
 | 
				
			||||||
 | 
					            .XInfE(XInf), .XNaNE(XNaN), .XSNaNE(XSNaN), .FrmE(FrmVal), .FmtE(ModFmt), 
 | 
				
			||||||
 | 
					            .CvtResE(CvtRes), .CvtIntResE(CvtIntRes), .CvtFlgE(CvtFlg));
 | 
				
			||||||
  fcmp fcmp   (.FmtE(ModFmt), .FOpCtrlE(OpCtrlVal), .XSgnE(XSgn), .YSgnE(YSgn), .XExpE(XExp), .YExpE(YExp), 
 | 
					  fcmp fcmp   (.FmtE(ModFmt), .FOpCtrlE(OpCtrlVal), .XSgnE(XSgn), .YSgnE(YSgn), .XExpE(XExp), .YExpE(YExp), 
 | 
				
			||||||
              .XManE(XMan), .YManE(YMan), .XZeroE(XZero), .YZeroE(YZero), 
 | 
					              .XManE(XMan), .YManE(YMan), .XZeroE(XZero), .YZeroE(YZero), 
 | 
				
			||||||
              .XNaNE(XNaN), .YNaNE(YNaN), .XSNaNE(XSNaN), .YSNaNE(YSNaN), .FSrcXE(X), .FSrcYE(Y), .CmpNVE(CmpFlg[4]), .CmpResE(CmpRes));
 | 
					              .XNaNE(XNaN), .YNaNE(YNaN), .XSNaNE(XSNaN), .YSNaNE(YSNaN), .FSrcXE(X), .FSrcYE(Y), .CmpNVE(CmpFlg[4]), .CmpResE(CmpRes));
 | 
				
			||||||
@ -901,38 +964,55 @@ module testbenchfp;
 | 
				
			|||||||
      AnsNaN = 1'b0;
 | 
					      AnsNaN = 1'b0;
 | 
				
			||||||
      ResNaN = 1'b0;
 | 
					      ResNaN = 1'b0;
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
    else begin
 | 
					    else if (UnitVal === `CVTFPUNIT) begin
 | 
				
			||||||
      case (FmtVal)
 | 
					      case (OpCtrlVal[1:0])
 | 
				
			||||||
          4'b11: begin // quad             
 | 
					          4'b11: begin // quad             
 | 
				
			||||||
            AnsNaN = &Ans[`FLEN-2:`NF]&(|Ans[`NF-1:0]);
 | 
					            AnsNaN = &Ans[`Q_LEN-2:`NF]&(|Ans[`Q_NF-1:0]);
 | 
				
			||||||
            ResNaN = &FmaRes[`FLEN-2:`NF]&(|FmaRes[`NF-1:0]);
 | 
					            ResNaN = &Res[`Q_LEN-2:`NF]&(|Res[`Q_NF-1:0]);
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
          4'b01: begin // double                 
 | 
					          4'b01: begin // double                 
 | 
				
			||||||
            AnsNaN = &Ans[`LEN1-2:`NF1]&(|Ans[`NF1-1:0]);
 | 
					            AnsNaN = &Ans[`D_LEN-2:`D_NF]&(|Ans[`D_NF-1:0]);
 | 
				
			||||||
            ResNaN = &FmaRes[`LEN1-2:`NF1]&(|FmaRes[`NF1-1:0]);
 | 
					            ResNaN = &Res[`D_LEN-2:`D_NF]&(|Res[`D_NF-1:0]);
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
          4'b00: begin // single
 | 
					          4'b00: begin // single
 | 
				
			||||||
            AnsNaN = &Ans[`LEN2-2:`NF2]&(|Ans[`NF2-1:0]);
 | 
					            AnsNaN = &Ans[`S_LEN-2:`S_NF]&(|Ans[`S_NF-1:0]);
 | 
				
			||||||
            ResNaN = &FmaRes[`LEN2-2:`NF2]&(|FmaRes[`NF2-1:0]);
 | 
					            ResNaN = &Res[`S_LEN-2:`S_NF]&(|Res[`S_NF-1:0]);
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
          4'b10: begin // half
 | 
					          4'b10: begin // half
 | 
				
			||||||
            AnsNaN = &Ans[`H_LEN-2:`H_NF]&(|Ans[`H_NF-1:0]);
 | 
					            AnsNaN = &Ans[`H_LEN-2:`H_NF]&(|Ans[`H_NF-1:0]);
 | 
				
			||||||
            ResNaN = &FmaRes[`H_LEN-2:`H_NF]&(|FmaRes[`H_NF-1:0]);
 | 
					            ResNaN = &Res[`H_LEN-2:`H_NF]&(|Res[`H_NF-1:0]);
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					      endcase
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					    else begin
 | 
				
			||||||
 | 
					      case (FmtVal)
 | 
				
			||||||
 | 
					          4'b11: begin // quad             
 | 
				
			||||||
 | 
					            AnsNaN = &Ans[`Q_LEN-2:`Q_NF]&(|Ans[`Q_NF-1:0]);
 | 
				
			||||||
 | 
					            ResNaN = &Res[`Q_LEN-2:`Q_NF]&(|Res[`Q_NF-1:0]);
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					          4'b01: begin // double                 
 | 
				
			||||||
 | 
					            AnsNaN = &Ans[`D_LEN-2:`D_NF]&(|Ans[`D_NF-1:0]);
 | 
				
			||||||
 | 
					            ResNaN = &Res[`D_LEN-2:`D_NF]&(|Res[`D_NF-1:0]);
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					          4'b00: begin // single
 | 
				
			||||||
 | 
					            AnsNaN = &Ans[`S_LEN-2:`S_NF]&(|Ans[`S_NF-1:0]);
 | 
				
			||||||
 | 
					            ResNaN = &Res[`S_LEN-2:`S_NF]&(|Res[`S_NF-1:0]);
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					          4'b10: begin // half
 | 
				
			||||||
 | 
					            AnsNaN = &Ans[`H_LEN-2:`H_NF]&(|Ans[`H_NF-1:0]);
 | 
				
			||||||
 | 
					            ResNaN = &Res[`H_LEN-2:`H_NF]&(|Res[`H_NF-1:0]);
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
      endcase
 | 
					      endcase
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					always_comb begin
 | 
				
			||||||
  // check results on falling edge of clk
 | 
					 | 
				
			||||||
  always @(negedge clk) begin
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // select the result to check
 | 
					    // select the result to check
 | 
				
			||||||
    case (UnitVal)
 | 
					    case (UnitVal)
 | 
				
			||||||
      `FMAUNIT: Res = FmaRes;
 | 
					      `FMAUNIT: Res = FmaRes;
 | 
				
			||||||
      `DIVUNIT: Res = DivRes;
 | 
					      `DIVUNIT: Res = DivRes;
 | 
				
			||||||
      `CMPUNIT: Res = CmpRes;
 | 
					      `CMPUNIT: Res = CmpRes;
 | 
				
			||||||
      `CVTINTUNIT: Res = CvtRes;
 | 
					      `CVTINTUNIT: if(WriteIntVal) Res = CvtIntRes; else Res = CvtRes;
 | 
				
			||||||
      `CVTFPUNIT: Res = CvtFpRes;
 | 
					      `CVTFPUNIT: Res = CvtRes;
 | 
				
			||||||
    endcase
 | 
					    endcase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // select the flag to check
 | 
					    // select the flag to check
 | 
				
			||||||
@ -940,9 +1020,13 @@ module testbenchfp;
 | 
				
			|||||||
      `FMAUNIT: ResFlg = FmaFlg;
 | 
					      `FMAUNIT: ResFlg = FmaFlg;
 | 
				
			||||||
      `DIVUNIT: ResFlg = DivFlg;
 | 
					      `DIVUNIT: ResFlg = DivFlg;
 | 
				
			||||||
      `CMPUNIT: ResFlg = CmpFlg;
 | 
					      `CMPUNIT: ResFlg = CmpFlg;
 | 
				
			||||||
      `CVTINTUNIT: ResFlg = CvtIntFlg;
 | 
					      `CVTINTUNIT: ResFlg = CvtFlg;
 | 
				
			||||||
      `CVTFPUNIT: ResFlg = CvtFpFlg;
 | 
					      `CVTFPUNIT: ResFlg = CvtFlg;
 | 
				
			||||||
    endcase
 | 
					    endcase
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					  // check results on falling edge of clk
 | 
				
			||||||
 | 
					  always @(negedge clk) begin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // check if the NaN value is good. IEEE754-2019 sections 6.3 and 6.2.3 specify:
 | 
					    // check if the NaN value is good. IEEE754-2019 sections 6.3 and 6.2.3 specify:
 | 
				
			||||||
    //    - the sign of the NaN does not matter for the opperations being tested
 | 
					    //    - the sign of the NaN does not matter for the opperations being tested
 | 
				
			||||||
@ -1060,15 +1144,19 @@ module testbenchfp;
 | 
				
			|||||||
    else if (UnitVal === `CVTFPUNIT) // if converting from floating point to floating point OpCtrl contains the final FP format
 | 
					    else if (UnitVal === `CVTFPUNIT) // if converting from floating point to floating point OpCtrl contains the final FP format
 | 
				
			||||||
      case (OpCtrlVal[1:0]) 
 | 
					      case (OpCtrlVal[1:0]) 
 | 
				
			||||||
        2'b11: NaNGood = ((AnsFlg[4]&(Res[`Q_LEN-2:0] === {{`Q_NE+1{1'b1}}, {`Q_NF-1{1'b0}}})) |
 | 
					        2'b11: NaNGood = ((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]})) | 
 | 
					                          (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]})));
 | 
					                          (YNaN&(Res[`Q_LEN-2:0] === {Y[`Q_LEN-2:`Q_NF],1'b1,Y[`Q_NF-2:0]})));
 | 
				
			||||||
        2'b01: NaNGood = ((AnsFlg[4]&(Res[`D_LEN-2:0] === {{`D_NE+1{1'b1}}, {`D_NF-1{1'b0}}})) |
 | 
					        2'b01: NaNGood = ((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]})) | 
 | 
					                          (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]})));
 | 
					                          (YNaN&(Res[`D_LEN-2:0] === {Y[`D_LEN-2:`D_NF],1'b1,Y[`D_NF-2:0]})));
 | 
				
			||||||
        2'b00: NaNGood = ((AnsFlg[4]&(Res[`S_LEN-2:0] === {{`S_NE+1{1'b1}}, {`S_NF-1{1'b0}}})) |
 | 
					        2'b00: NaNGood = ((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]})) | 
 | 
					                          (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]})));
 | 
					                          (YNaN&(Res[`S_LEN-2:0] === {Y[`S_LEN-2:`S_NF],1'b1,Y[`S_NF-2:0]})));
 | 
				
			||||||
        2'b10: NaNGood = ((AnsFlg[4]&(Res[`H_LEN-2:0] === {{`H_NE+1{1'b1}}, {`H_NF-1{1'b0}}})) |
 | 
					        2'b10: NaNGood = ((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]})) | 
 | 
					                          (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]})));
 | 
					                          (YNaN&(Res[`H_LEN-2:0] === {Y[`H_LEN-2:`H_NF],1'b1,Y[`H_NF-2:0]})));
 | 
				
			||||||
      endcase
 | 
					      endcase
 | 
				
			||||||
@ -1086,15 +1174,23 @@ module testbenchfp;
 | 
				
			|||||||
  ///////////////////////////////////////////////////////////////////////////////////////////////
 | 
					  ///////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // check if the non-fma test is correct
 | 
					    // check if the non-fma test is correct
 | 
				
			||||||
    if(~((Res === Ans | NaNGood | NaNGood === 1'bx) & (ResFlg === AnsFlg | AnsFlg === 5'bx))&(UnitVal !== `CMPUNIT)) begin
 | 
					    if(~((Res === Ans | NaNGood | NaNGood === 1'bx) & (ResFlg === AnsFlg | AnsFlg === 5'bx))&(UnitVal !== `CVTINTUNIT)) begin
 | 
				
			||||||
      errors += 1;
 | 
					      errors += 1;
 | 
				
			||||||
      $display("There is an error in %s", Tests[TestNum]);
 | 
					      $display("There is an error in %s", Tests[TestNum]);
 | 
				
			||||||
      $display("inputs: %h %h %h\nSrcA: %h\n Res: %h %h\n Ans: %h %h", X, Y, Z, SrcA, Res, ResFlg, Ans, AnsFlg);
 | 
					      $display("inputs: %h %h %h\nSrcA: %h\n Res: %h %h\n Ans: %h %h", X, Y, Z, SrcA, Res, ResFlg, Ans, AnsFlg);
 | 
				
			||||||
      $stop;
 | 
					      $stop;
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
    // in The RISC-V Instruction Set Manual (2019) section 11.8 specifies that
 | 
					
 | 
				
			||||||
    // if a any of the inputs to the EQ LT LE opperations then the opperation should return a 0
 | 
					    // TestFloat sets the result to all 1's when there is an invalid result, however in 
 | 
				
			||||||
    else if ((UnitVal === `CMPUNIT)&(XNaN|YNaN)&(Res !== (`FLEN)'(0))) begin
 | 
					    // http://www.jhauser.us/arithmetic/TestFloat-3/doc/TestFloat-general.html it says
 | 
				
			||||||
 | 
					    // for an unsigned integer result 0 is also okay
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Testfloat outputs 800... for both the largest integer values for both positive and negitive numbers but 
 | 
				
			||||||
 | 
					    // the riscv spec specifies 2^31-1 for positive values out of range and NaNs ie 7fff...
 | 
				
			||||||
 | 
					    else if ((UnitVal === `CVTINTUNIT) & ~(((WriteIntVal&~OpCtrlVal[0]&AnsFlg[4]&XSgn&(Res === (`FLEN)'(0))) | 
 | 
				
			||||||
 | 
					            (WriteIntVal&OpCtrlVal[0]&AnsFlg[4]&(~XSgn|XNaN)&OpCtrlVal[1]&(Res === {1'b0, {`FLEN-1{1'b1}}})) | 
 | 
				
			||||||
 | 
					            (WriteIntVal&OpCtrlVal[0]&AnsFlg[4]&(~XSgn|XNaN)&~OpCtrlVal[1]&(Res === {{`FLEN{1'b0}}, 1'b0, {31{1'b1}}})) | 
 | 
				
			||||||
 | 
					            (Res === Ans | NaNGood | NaNGood === 1'bx)) & (ResFlg === AnsFlg | AnsFlg === 5'bx))) begin
 | 
				
			||||||
      errors += 1;
 | 
					      errors += 1;
 | 
				
			||||||
      $display("There is an error in %s", Tests[TestNum]);
 | 
					      $display("There is an error in %s", Tests[TestNum]);
 | 
				
			||||||
      $display("inputs: %h %h %h\nSrcA: %h\n Res: %h %h\n Ans: %h %h", X, Y, Z, SrcA, Res, ResFlg, Ans, AnsFlg);
 | 
					      $display("inputs: %h %h %h\nSrcA: %h\n Res: %h %h\n Ans: %h %h", X, Y, Z, SrcA, Res, ResFlg, Ans, AnsFlg);
 | 
				
			||||||
@ -1147,6 +1243,8 @@ module testbenchfp;
 | 
				
			|||||||
      // increment the test
 | 
					      // increment the test
 | 
				
			||||||
      TestNum += 1;
 | 
					      TestNum += 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // clear the vectors
 | 
				
			||||||
 | 
					      for(int i=0; i<46465; i++) TestVectors[i] = {`FLEN*4+8{1'bx}};
 | 
				
			||||||
      // read next files
 | 
					      // read next files
 | 
				
			||||||
      $readmemh({`PATH, Tests[TestNum]}, TestVectors);
 | 
					      $readmemh({`PATH, Tests[TestNum]}, TestVectors);
 | 
				
			||||||
      $readmemh({`PATH, FmaRneTests[TestNum]}, FmaRneVectors);
 | 
					      $readmemh({`PATH, FmaRneTests[TestNum]}, FmaRneVectors);
 | 
				
			||||||
@ -1211,6 +1309,7 @@ module readfmavectors (
 | 
				
			|||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  logic XNormE, XExpMaxE; // signals the unpacker outputs but isn't used in FMA
 | 
					  logic XNormE, XExpMaxE; // signals the unpacker outputs but isn't used in FMA
 | 
				
			||||||
 | 
					  logic XOrigDenormE;
 | 
				
			||||||
  // apply test vectors on rising edge of clk
 | 
					  // apply test vectors on rising edge of clk
 | 
				
			||||||
  // Format of vectors Inputs(1/2/3)_AnsFlg
 | 
					  // Format of vectors Inputs(1/2/3)_AnsFlg
 | 
				
			||||||
  always @(posedge clk) begin
 | 
					  always @(posedge clk) begin
 | 
				
			||||||
@ -1244,7 +1343,7 @@ module readfmavectors (
 | 
				
			|||||||
    endcase
 | 
					    endcase
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  unpack unpack(.X, .Y, .Z, .FmtE(FmaModFmt), .XSgnE, .YSgnE, .ZSgnE, .XExpE, .YExpE, .ZExpE,
 | 
					  unpack unpack(.X, .Y, .Z, .FmtE(FmaModFmt), .XSgnE, .YSgnE, .ZSgnE, .XExpE, .YExpE, .ZExpE, .XOrigDenormE,
 | 
				
			||||||
                .XManE, .YManE, .ZManE, .XNormE, .XNaNE, .YNaNE, .ZNaNE, .XSNaNE, .YSNaNE, .ZSNaNE,
 | 
					                .XManE, .YManE, .ZManE, .XNormE, .XNaNE, .YNaNE, .ZNaNE, .XSNaNE, .YSNaNE, .ZSNaNE,
 | 
				
			||||||
                .XDenormE, .YDenormE, .ZDenormE, .XZeroE, .YZeroE, .ZZeroE, .XInfE, .YInfE, .ZInfE,
 | 
					                .XDenormE, .YDenormE, .ZDenormE, .XZeroE, .YZeroE, .ZZeroE, .XInfE, .YInfE, .ZInfE,
 | 
				
			||||||
                .XExpMaxE, .ZOrigDenormE);
 | 
					                .XExpMaxE, .ZOrigDenormE);
 | 
				
			||||||
@ -1287,7 +1386,7 @@ module readvectors (
 | 
				
			|||||||
  output logic                    XZeroE, YZeroE, ZZeroE,         // is XYZ zero
 | 
					  output logic                    XZeroE, YZeroE, ZZeroE,         // is XYZ zero
 | 
				
			||||||
  output logic                    XInfE, YInfE, ZInfE,            // is XYZ infinity
 | 
					  output logic                    XInfE, YInfE, ZInfE,            // is XYZ infinity
 | 
				
			||||||
  output logic XNormE, XExpMaxE,
 | 
					  output logic XNormE, XExpMaxE,
 | 
				
			||||||
  output logic ZOrigDenormE,
 | 
					  output logic ZOrigDenormE, XOrigDenormE,
 | 
				
			||||||
  output logic [`FLEN-1:0] X, Y, Z
 | 
					  output logic [`FLEN-1:0] X, Y, Z
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1464,89 +1563,105 @@ module readvectors (
 | 
				
			|||||||
        case (Fmt)
 | 
					        case (Fmt)
 | 
				
			||||||
          2'b11: begin       // quad
 | 
					          2'b11: begin       // quad
 | 
				
			||||||
            //     {is the integer a long,     is the opperation to an integer}
 | 
					            //     {is the integer a long,     is the opperation to an integer}
 | 
				
			||||||
            casex ({OpCtrl[2], OpCtrl[0]})
 | 
					            casex ({OpCtrl[2:1]})
 | 
				
			||||||
              2'b11: begin       // long -> quad
 | 
					              2'b11: begin       // long -> quad
 | 
				
			||||||
 | 
					                X = {`FLEN{1'bx}};
 | 
				
			||||||
                SrcA = TestVector[8+`Q_LEN+`XLEN-1:8+(`Q_LEN)];
 | 
					                SrcA = TestVector[8+`Q_LEN+`XLEN-1:8+(`Q_LEN)];
 | 
				
			||||||
                Ans = TestVector[8+(`Q_LEN-1):8];
 | 
					                Ans = TestVector[8+(`Q_LEN-1):8];
 | 
				
			||||||
              end
 | 
					              end
 | 
				
			||||||
              2'b01:	begin	  // int -> quad
 | 
					              2'b10:	begin	  // int -> quad
 | 
				
			||||||
                // correctly sign extend the integer depending on if it's a signed/unsigned test
 | 
					                // correctly sign extend the integer depending on if it's a signed/unsigned test
 | 
				
			||||||
                SrcA = {{`XLEN-32{TestVector[8+`Q_LEN+`XLEN]&~OpCtrl[1]}}, TestVector[8+`Q_LEN+`XLEN-1:8+(`Q_LEN)]};
 | 
					                X = {`FLEN{1'bx}};
 | 
				
			||||||
 | 
					                SrcA = {{`XLEN-32{TestVector[8+`Q_LEN+32-1]}}, TestVector[8+`Q_LEN+32-1:8+(`Q_LEN)]};
 | 
				
			||||||
                Ans = TestVector[8+(`Q_LEN-1):8];
 | 
					                Ans = TestVector[8+(`Q_LEN-1):8];
 | 
				
			||||||
              end
 | 
					              end
 | 
				
			||||||
              2'b10:	begin	  // quad -> long
 | 
					              2'b01:	begin	  // quad -> long
 | 
				
			||||||
                X = {{`FLEN-`Q_LEN{1'b1}}, TestVector[8+`XLEN+`Q_LEN-1:8+(`XLEN)]};
 | 
					                X = {{`FLEN-`Q_LEN{1'b1}}, TestVector[8+`XLEN+`Q_LEN-1:8+(`XLEN)]};
 | 
				
			||||||
 | 
					                SrcA = {`XLEN{1'bx}};
 | 
				
			||||||
                Ans = {TestVector[8+(`XLEN-1):8]};
 | 
					                Ans = {TestVector[8+(`XLEN-1):8]};
 | 
				
			||||||
              end
 | 
					              end
 | 
				
			||||||
              2'b00:	begin	  // double -> long
 | 
					              2'b00:	begin	  // quad -> int
 | 
				
			||||||
                X = {{`FLEN-`Q_LEN{1'b1}}, TestVector[8+`XLEN+`Q_LEN-1:8+(`XLEN)]};
 | 
					                X = {{`FLEN-`Q_LEN{1'b1}}, TestVector[8+32+`Q_LEN-1:8+(32)]};
 | 
				
			||||||
                Ans = {{`XLEN-32{TestVector[8+`XLEN]&~OpCtrl[1]}},TestVector[8+(`XLEN-1):8]};
 | 
					                SrcA = {`XLEN{1'bx}};
 | 
				
			||||||
 | 
					                Ans = {{`XLEN-32{TestVector[8+32-1]}},TestVector[8+(32-1):8]};
 | 
				
			||||||
              end
 | 
					              end
 | 
				
			||||||
            endcase
 | 
					            endcase
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
          2'b01:	begin	  // double
 | 
					          2'b01:	begin	  // double
 | 
				
			||||||
            //     {is the integer a long,     is the opperation to an integer}
 | 
					            //     {Int->Fp?, is the integer a long}
 | 
				
			||||||
            casex ({OpCtrl[2], OpCtrl[0]})
 | 
					            casex ({OpCtrl[2:1]})
 | 
				
			||||||
              2'b11: begin       // long -> double
 | 
					              2'b11: begin       // long -> double
 | 
				
			||||||
 | 
					                X = {`FLEN{1'bx}};
 | 
				
			||||||
                SrcA = TestVector[8+`D_LEN+`XLEN-1:8+(`D_LEN)];
 | 
					                SrcA = TestVector[8+`D_LEN+`XLEN-1:8+(`D_LEN)];
 | 
				
			||||||
                Ans = TestVector[8+(`D_LEN-1):8];
 | 
					                Ans = {{`FLEN-`D_LEN{1'b1}}, TestVector[8+(`D_LEN-1):8]};
 | 
				
			||||||
              end
 | 
					              end
 | 
				
			||||||
              2'b01:	begin	  // int -> double
 | 
					              2'b10:	begin	  // int -> double
 | 
				
			||||||
                // correctly sign extend the integer depending on if it's a signed/unsigned test
 | 
					                // correctly sign extend the integer depending on if it's a signed/unsigned test
 | 
				
			||||||
                SrcA = {{`XLEN-32{TestVector[8+`D_LEN+`XLEN]&~OpCtrl[1]}}, TestVector[8+`D_LEN+`XLEN-1:8+(`D_LEN)]};
 | 
					                X = {`FLEN{1'bx}};
 | 
				
			||||||
                Ans = TestVector[8+(`D_LEN-1):8];
 | 
					                SrcA = {{`XLEN-32{TestVector[8+`D_LEN+32-1]}}, TestVector[8+`D_LEN+32-1:8+(`D_LEN)]};
 | 
				
			||||||
 | 
					                Ans = {{`FLEN-`D_LEN{1'b1}}, TestVector[8+(`D_LEN-1):8]};
 | 
				
			||||||
              end
 | 
					              end
 | 
				
			||||||
              2'b10:	begin	  // double -> long
 | 
					              2'b01:	begin	  // double -> long
 | 
				
			||||||
                X = {{`FLEN-`D_LEN{1'b1}}, TestVector[8+`XLEN+`D_LEN-1:8+(`XLEN)]};
 | 
					                X = {{`FLEN-`D_LEN{1'b1}}, TestVector[8+`XLEN+`D_LEN-1:8+(`XLEN)]};
 | 
				
			||||||
 | 
					                SrcA = {`XLEN{1'bx}};
 | 
				
			||||||
                Ans = {TestVector[8+(`XLEN-1):8]};
 | 
					                Ans = {TestVector[8+(`XLEN-1):8]};
 | 
				
			||||||
              end
 | 
					              end
 | 
				
			||||||
              2'b00:	begin	  // double -> int
 | 
					              2'b00:	begin	  // double -> int
 | 
				
			||||||
                X = {{`FLEN-`D_LEN{1'b1}}, TestVector[8+`XLEN+`D_LEN-1:8+(`XLEN)]};
 | 
					                X = {{`FLEN-`D_LEN{1'b1}}, TestVector[8+32+`D_LEN-1:8+(32)]};
 | 
				
			||||||
                Ans = {{`XLEN-32{TestVector[8+`XLEN]&~OpCtrl[1]}},TestVector[8+(`XLEN-1):8]};
 | 
					                SrcA = {`XLEN{1'bx}};
 | 
				
			||||||
 | 
					                Ans = {{`XLEN-32{TestVector[8+32-1]}},TestVector[8+(32-1):8]};
 | 
				
			||||||
              end
 | 
					              end
 | 
				
			||||||
            endcase
 | 
					            endcase
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
          2'b00:	begin	  // single
 | 
					          2'b00:	begin	  // single
 | 
				
			||||||
            //     {is the integer a long,     is the opperation to an integer}
 | 
					            //     {is the integer a long,     is the opperation to an integer}
 | 
				
			||||||
            casex ({OpCtrl[2], OpCtrl[0]})
 | 
					            casex ({OpCtrl[2:1]})
 | 
				
			||||||
              2'b11: begin       // long -> single
 | 
					              2'b11: begin       // long -> single
 | 
				
			||||||
 | 
					                X = {`FLEN{1'bx}};
 | 
				
			||||||
                SrcA = TestVector[8+`S_LEN+`XLEN-1:8+(`S_LEN)];
 | 
					                SrcA = TestVector[8+`S_LEN+`XLEN-1:8+(`S_LEN)];
 | 
				
			||||||
                Ans = TestVector[8+(`S_LEN-1):8];
 | 
					                Ans = {{`FLEN-`S_LEN{1'b1}}, TestVector[8+(`S_LEN-1):8]};
 | 
				
			||||||
              end
 | 
					              end
 | 
				
			||||||
              2'b01:	begin	  // int -> single
 | 
					              2'b10:	begin	  // int -> single
 | 
				
			||||||
                // correctly sign extend the integer depending on if it's a signed/unsigned test
 | 
					                // correctly sign extend the integer depending on if it's a signed/unsigned test
 | 
				
			||||||
                SrcA = {{`XLEN-32{TestVector[8+`S_LEN+`XLEN]&~OpCtrl[1]}}, TestVector[8+`S_LEN+`XLEN-1:8+(`S_LEN)]};
 | 
					                X = {`FLEN{1'bx}};
 | 
				
			||||||
                Ans = TestVector[8+(`S_LEN-1):8];
 | 
					                SrcA = {{`XLEN-32{TestVector[8+`S_LEN+32-1]}}, TestVector[8+`S_LEN+32-1:8+(`S_LEN)]};
 | 
				
			||||||
 | 
					                Ans = {{`FLEN-`S_LEN{1'b1}}, TestVector[8+(`S_LEN-1):8]};
 | 
				
			||||||
              end
 | 
					              end
 | 
				
			||||||
              2'b10:	begin	  // single -> long
 | 
					              2'b01:	begin	  // single -> long
 | 
				
			||||||
                X = {{`FLEN-`S_LEN{1'b1}}, TestVector[8+`XLEN+`S_LEN-1:8+(`XLEN)]};
 | 
					                X = {{`FLEN-`S_LEN{1'b1}}, TestVector[8+`XLEN+`S_LEN-1:8+(`XLEN)]};
 | 
				
			||||||
 | 
					                SrcA = {`XLEN{1'bx}};
 | 
				
			||||||
                Ans = {TestVector[8+(`XLEN-1):8]};
 | 
					                Ans = {TestVector[8+(`XLEN-1):8]};
 | 
				
			||||||
              end
 | 
					              end
 | 
				
			||||||
              2'b00:	begin	  // single -> int
 | 
					              2'b00:	begin	  // single -> int
 | 
				
			||||||
                X = {{`FLEN-`S_LEN{1'b1}}, TestVector[8+`XLEN+`S_LEN-1:8+(`XLEN)]};
 | 
					                X = {{`FLEN-`S_LEN{1'b1}}, TestVector[8+32+`S_LEN-1:8+(32)]};
 | 
				
			||||||
                Ans = {{`XLEN-32{TestVector[8+`XLEN]&~OpCtrl[1]}},TestVector[8+(`XLEN-1):8]};
 | 
					                SrcA = {`XLEN{1'bx}};
 | 
				
			||||||
 | 
					                Ans = {{`XLEN-32{TestVector[8+32-1]}},TestVector[8+(32-1):8]};
 | 
				
			||||||
              end
 | 
					              end
 | 
				
			||||||
            endcase
 | 
					            endcase
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
          2'b10:	begin	  // half
 | 
					          2'b10:	begin	  // half
 | 
				
			||||||
            //     {is the integer a long,     is the opperation to an integer}
 | 
					            //     {is the integer a long,     is the opperation to an integer}
 | 
				
			||||||
            casex ({OpCtrl[2], OpCtrl[0]})
 | 
					            casex ({OpCtrl[2:1]})
 | 
				
			||||||
              2'b11: begin       // long -> half
 | 
					              2'b11: begin       // long -> half
 | 
				
			||||||
 | 
					                X = {`FLEN{1'bx}};
 | 
				
			||||||
                SrcA = TestVector[8+`H_LEN+`XLEN-1:8+(`H_LEN)];
 | 
					                SrcA = TestVector[8+`H_LEN+`XLEN-1:8+(`H_LEN)];
 | 
				
			||||||
                Ans = TestVector[8+(`H_LEN-1):8];
 | 
					                Ans = {{`FLEN-`H_LEN{1'b1}}, TestVector[8+(`H_LEN-1):8]};
 | 
				
			||||||
              end
 | 
					              end
 | 
				
			||||||
              2'b01:	begin	  // int -> half
 | 
					              2'b10:	begin	  // int -> half
 | 
				
			||||||
                // correctly sign extend the integer depending on if it's a signed/unsigned test
 | 
					                // correctly sign extend the integer depending on if it's a signed/unsigned test
 | 
				
			||||||
                SrcA = {{`XLEN-32{TestVector[8+`H_LEN+`XLEN]&~OpCtrl[1]}}, TestVector[8+`H_LEN+`XLEN-1:8+(`H_LEN)]};
 | 
					                X = {`FLEN{1'bx}};
 | 
				
			||||||
                Ans = TestVector[8+(`H_LEN-1):8];
 | 
					                SrcA = {{`XLEN-32{TestVector[8+`H_LEN+32-1]}}, TestVector[8+`H_LEN+32-1:8+(`H_LEN)]};
 | 
				
			||||||
 | 
					                Ans = {{`FLEN-`H_LEN{1'b1}}, TestVector[8+(`H_LEN-1):8]};
 | 
				
			||||||
              end
 | 
					              end
 | 
				
			||||||
              2'b10:	begin	  // half -> long
 | 
					              2'b01:	begin	  // half -> long
 | 
				
			||||||
                X = {{`FLEN-`H_LEN{1'b1}}, TestVector[8+`XLEN+`H_LEN-1:8+(`XLEN)]};
 | 
					                X = {{`FLEN-`H_LEN{1'b1}}, TestVector[8+`XLEN+`H_LEN-1:8+(`XLEN)]};
 | 
				
			||||||
 | 
					                SrcA = {`XLEN{1'bx}};
 | 
				
			||||||
                Ans = {TestVector[8+(`XLEN-1):8]};
 | 
					                Ans = {TestVector[8+(`XLEN-1):8]};
 | 
				
			||||||
              end
 | 
					              end
 | 
				
			||||||
              2'b00:	begin	  // half -> int
 | 
					              2'b00:	begin	  // half -> int
 | 
				
			||||||
                X = {{`FLEN-`H_LEN{1'b1}}, TestVector[8+`XLEN+`H_LEN-1:8+(`XLEN)]};
 | 
					                X = {{`FLEN-`H_LEN{1'b1}}, TestVector[8+32+`H_LEN-1:8+(32)]};
 | 
				
			||||||
                Ans = {{`XLEN-32{TestVector[8+`XLEN]&~OpCtrl[1]}}, TestVector[8+(`XLEN-1):8]};
 | 
					                SrcA = {`XLEN{1'bx}};
 | 
				
			||||||
 | 
					                Ans = {{`XLEN-32{TestVector[8+32-1]}}, TestVector[8+(32-1):8]};
 | 
				
			||||||
              end
 | 
					              end
 | 
				
			||||||
            endcase
 | 
					            endcase
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
@ -1557,5 +1672,5 @@ module readvectors (
 | 
				
			|||||||
  unpack unpack(.X, .Y, .Z, .FmtE(ModFmt), .XSgnE, .YSgnE, .ZSgnE, .XExpE, .YExpE, .ZExpE,
 | 
					  unpack unpack(.X, .Y, .Z, .FmtE(ModFmt), .XSgnE, .YSgnE, .ZSgnE, .XExpE, .YExpE, .ZExpE,
 | 
				
			||||||
                .XManE, .YManE, .ZManE, .XNormE, .XNaNE, .YNaNE, .ZNaNE, .XSNaNE, .YSNaNE, .ZSNaNE,
 | 
					                .XManE, .YManE, .ZManE, .XNormE, .XNaNE, .YNaNE, .ZNaNE, .XSNaNE, .YSNaNE, .ZSNaNE,
 | 
				
			||||||
                .XDenormE, .YDenormE, .ZDenormE, .XZeroE, .YZeroE, .ZZeroE, .XInfE, .YInfE, .ZInfE,
 | 
					                .XDenormE, .YDenormE, .ZDenormE, .XZeroE, .YZeroE, .ZZeroE, .XInfE, .YInfE, .ZInfE,
 | 
				
			||||||
                .XExpMaxE, .ZOrigDenormE);
 | 
					                .XExpMaxE, .ZOrigDenormE, .XOrigDenormE);
 | 
				
			||||||
endmodule
 | 
					endmodule
 | 
				
			||||||
@ -34,14 +34,14 @@
 | 
				
			|||||||
`define LE_OPCTRL 3'b011
 | 
					`define LE_OPCTRL 3'b011
 | 
				
			||||||
`define LT_OPCTRL 3'b001
 | 
					`define LT_OPCTRL 3'b001
 | 
				
			||||||
`define EQ_OPCTRL 3'b010
 | 
					`define EQ_OPCTRL 3'b010
 | 
				
			||||||
`define TO_UI_OPCTRL   3'b011
 | 
					`define TO_UI_OPCTRL   3'b000
 | 
				
			||||||
`define TO_I_OPCTRL    3'b001
 | 
					`define TO_I_OPCTRL    3'b001
 | 
				
			||||||
`define TO_UL_OPCTRL   3'b111
 | 
					`define TO_UL_OPCTRL   3'b010
 | 
				
			||||||
`define TO_L_OPCTRL    3'b101
 | 
					`define TO_L_OPCTRL    3'b011
 | 
				
			||||||
`define FROM_UI_OPCTRL 3'b010
 | 
					`define FROM_UI_OPCTRL 3'b100
 | 
				
			||||||
`define FROM_I_OPCTRL  3'b000
 | 
					`define FROM_I_OPCTRL  3'b101
 | 
				
			||||||
`define FROM_UL_OPCTRL 3'b110
 | 
					`define FROM_UL_OPCTRL 3'b110
 | 
				
			||||||
`define FROM_L_OPCTRL  3'b100
 | 
					`define FROM_L_OPCTRL  3'b111
 | 
				
			||||||
`define RNE 3'b000
 | 
					`define RNE 3'b000
 | 
				
			||||||
`define RZ  3'b001
 | 
					`define RZ  3'b001
 | 
				
			||||||
`define RU  3'b011
 | 
					`define RU  3'b011
 | 
				
			||||||
 | 
				
			|||||||
@ -98,101 +98,101 @@ $BUILD/testfloat_gen -rmax i64_to_f128 > $OUTPUT/i64_to_f128_ru.tv
 | 
				
			|||||||
$BUILD/testfloat_gen -rmin i64_to_f128 > $OUTPUT/i64_to_f128_rd.tv
 | 
					$BUILD/testfloat_gen -rmin i64_to_f128 > $OUTPUT/i64_to_f128_rd.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_maxMag i64_to_f128 > $OUTPUT/i64_to_f128_rnm.tv
 | 
					$BUILD/testfloat_gen -rnear_maxMag i64_to_f128 > $OUTPUT/i64_to_f128_rnm.tv
 | 
				
			||||||
echo "Creating f16_to_ui32 convert vectors"
 | 
					echo "Creating f16_to_ui32 convert vectors"
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_even f16_to_ui32 > $OUTPUT/f16_to_ui32_rne.tv
 | 
					$BUILD/testfloat_gen -rnear_even -exact f16_to_ui32 > $OUTPUT/f16_to_ui32_rne.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rminMag f16_to_ui32 > $OUTPUT/f16_to_ui32_rz.tv
 | 
					$BUILD/testfloat_gen -rminMag -exact f16_to_ui32 > $OUTPUT/f16_to_ui32_rz.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmax f16_to_ui32 > $OUTPUT/f16_to_ui32_ru.tv
 | 
					$BUILD/testfloat_gen -rmax -exact f16_to_ui32 > $OUTPUT/f16_to_ui32_ru.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmin f16_to_ui32 > $OUTPUT/f16_to_ui32_rd.tv
 | 
					$BUILD/testfloat_gen -rmin -exact f16_to_ui32 > $OUTPUT/f16_to_ui32_rd.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_maxMag f16_to_ui32 > $OUTPUT/f16_to_ui32_rnm.tv
 | 
					$BUILD/testfloat_gen -rnear_maxMag -exact f16_to_ui32 > $OUTPUT/f16_to_ui32_rnm.tv
 | 
				
			||||||
echo "Creating f32_to_ui32 convert vectors"
 | 
					echo "Creating f32_to_ui32 convert vectors"
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_even f32_to_ui32 > $OUTPUT/f32_to_ui32_rne.tv
 | 
					$BUILD/testfloat_gen -rnear_even -exact f32_to_ui32 > $OUTPUT/f32_to_ui32_rne.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rminMag f32_to_ui32 > $OUTPUT/f32_to_ui32_rz.tv
 | 
					$BUILD/testfloat_gen -rminMag -exact f32_to_ui32 > $OUTPUT/f32_to_ui32_rz.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmax f32_to_ui32 > $OUTPUT/f32_to_ui32_ru.tv
 | 
					$BUILD/testfloat_gen -rmax -exact f32_to_ui32 > $OUTPUT/f32_to_ui32_ru.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmin f32_to_ui32 > $OUTPUT/f32_to_ui32_rd.tv
 | 
					$BUILD/testfloat_gen -rmin -exact f32_to_ui32 > $OUTPUT/f32_to_ui32_rd.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_maxMag f32_to_ui32 > $OUTPUT/f32_to_ui32_rnm.tv
 | 
					$BUILD/testfloat_gen -rnear_maxMag -exact f32_to_ui32 > $OUTPUT/f32_to_ui32_rnm.tv
 | 
				
			||||||
echo "Creating f64_to_ui32 convert vectors"
 | 
					echo "Creating f64_to_ui32 convert vectors"
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_even f64_to_ui32 > $OUTPUT/f64_to_ui32_rne.tv
 | 
					$BUILD/testfloat_gen -rnear_even -exact f64_to_ui32 > $OUTPUT/f64_to_ui32_rne.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rminMag f64_to_ui32 > $OUTPUT/f64_to_ui32_rz.tv
 | 
					$BUILD/testfloat_gen -rminMag -exact f64_to_ui32 > $OUTPUT/f64_to_ui32_rz.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmax f64_to_ui32 > $OUTPUT/f64_to_ui32_ru.tv
 | 
					$BUILD/testfloat_gen -rmax -exact f64_to_ui32 > $OUTPUT/f64_to_ui32_ru.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmin f64_to_ui32 > $OUTPUT/f64_to_ui32_rd.tv
 | 
					$BUILD/testfloat_gen -rmin -exact f64_to_ui32 > $OUTPUT/f64_to_ui32_rd.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_maxMag f64_to_ui32 > $OUTPUT/f64_to_ui32_rnm.tv
 | 
					$BUILD/testfloat_gen -rnear_maxMag -exact f64_to_ui32 > $OUTPUT/f64_to_ui32_rnm.tv
 | 
				
			||||||
echo "Creating f128_to_ui32 convert vectors"
 | 
					echo "Creating f128_to_ui32 convert vectors"
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_even f128_to_ui32 > $OUTPUT/f128_to_ui32_rne.tv
 | 
					$BUILD/testfloat_gen -rnear_even -exact f128_to_ui32 > $OUTPUT/f128_to_ui32_rne.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rminMag f128_to_ui32 > $OUTPUT/f128_to_ui32_rz.tv
 | 
					$BUILD/testfloat_gen -rminMag -exact f128_to_ui32 > $OUTPUT/f128_to_ui32_rz.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmax f128_to_ui32 > $OUTPUT/f128_to_ui32_ru.tv
 | 
					$BUILD/testfloat_gen -rmax -exact f128_to_ui32 > $OUTPUT/f128_to_ui32_ru.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmin f128_to_ui32 > $OUTPUT/f128_to_ui32_rd.tv
 | 
					$BUILD/testfloat_gen -rmin -exact f128_to_ui32 > $OUTPUT/f128_to_ui32_rd.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_maxMag f128_to_ui32 > $OUTPUT/f128_to_ui32_rnm.tv
 | 
					$BUILD/testfloat_gen -rnear_maxMag -exact f128_to_ui32 > $OUTPUT/f128_to_ui32_rnm.tv
 | 
				
			||||||
echo "Creating f16_to_ui64 convert vectors"
 | 
					echo "Creating f16_to_ui64 convert vectors"
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_even f16_to_ui64 > $OUTPUT/f16_to_ui64_rne.tv
 | 
					$BUILD/testfloat_gen -rnear_even -exact f16_to_ui64 > $OUTPUT/f16_to_ui64_rne.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rminMag f16_to_ui64 > $OUTPUT/f16_to_ui64_rz.tv
 | 
					$BUILD/testfloat_gen -rminMag -exact f16_to_ui64 > $OUTPUT/f16_to_ui64_rz.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmax f16_to_ui64 > $OUTPUT/f16_to_ui64_ru.tv
 | 
					$BUILD/testfloat_gen -rmax -exact f16_to_ui64 > $OUTPUT/f16_to_ui64_ru.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmin f16_to_ui64 > $OUTPUT/f16_to_ui64_rd.tv
 | 
					$BUILD/testfloat_gen -rmin -exact f16_to_ui64 > $OUTPUT/f16_to_ui64_rd.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_maxMag f16_to_ui64 > $OUTPUT/f16_to_ui64_rnm.tv
 | 
					$BUILD/testfloat_gen -rnear_maxMag -exact f16_to_ui64 > $OUTPUT/f16_to_ui64_rnm.tv
 | 
				
			||||||
echo "Creating f32_to_ui64 convert vectors"
 | 
					echo "Creating f32_to_ui64 convert vectors"
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_even f32_to_ui64 > $OUTPUT/f32_to_ui64_rne.tv
 | 
					$BUILD/testfloat_gen -rnear_even -exact f32_to_ui64 > $OUTPUT/f32_to_ui64_rne.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rminMag f32_to_ui64 > $OUTPUT/f32_to_ui64_rz.tv
 | 
					$BUILD/testfloat_gen -rminMag -exact f32_to_ui64 > $OUTPUT/f32_to_ui64_rz.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmax f32_to_ui64 > $OUTPUT/f32_to_ui64_ru.tv
 | 
					$BUILD/testfloat_gen -rmax -exact f32_to_ui64 > $OUTPUT/f32_to_ui64_ru.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmin f32_to_ui64 > $OUTPUT/f32_to_ui64_rd.tv
 | 
					$BUILD/testfloat_gen -rmin -exact f32_to_ui64 > $OUTPUT/f32_to_ui64_rd.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_maxMag f32_to_ui64 > $OUTPUT/f32_to_ui64_rnm.tv
 | 
					$BUILD/testfloat_gen -rnear_maxMag -exact f32_to_ui64 > $OUTPUT/f32_to_ui64_rnm.tv
 | 
				
			||||||
echo "Creating f64_to_ui64 convert vectors"
 | 
					echo "Creating f64_to_ui64 convert vectors"
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_even f64_to_ui64 > $OUTPUT/f64_to_ui64_rne.tv
 | 
					$BUILD/testfloat_gen -rnear_even -exact f64_to_ui64 > $OUTPUT/f64_to_ui64_rne.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rminMag f64_to_ui64 > $OUTPUT/f64_to_ui64_rz.tv
 | 
					$BUILD/testfloat_gen -rminMag -exact f64_to_ui64 > $OUTPUT/f64_to_ui64_rz.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmax f64_to_ui64 > $OUTPUT/f64_to_ui64_ru.tv
 | 
					$BUILD/testfloat_gen -rmax -exact f64_to_ui64 > $OUTPUT/f64_to_ui64_ru.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmin f64_to_ui64 > $OUTPUT/f64_to_ui64_rd.tv
 | 
					$BUILD/testfloat_gen -rmin -exact f64_to_ui64 > $OUTPUT/f64_to_ui64_rd.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_maxMag f64_to_ui64 > $OUTPUT/f64_to_ui64_rnm.tv
 | 
					$BUILD/testfloat_gen -rnear_maxMag -exact f64_to_ui64 > $OUTPUT/f64_to_ui64_rnm.tv
 | 
				
			||||||
echo "Creating f128_to_ui64 convert vectors"
 | 
					echo "Creating f128_to_ui64 convert vectors"
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_even f128_to_ui64 > $OUTPUT/f128_to_ui64_rne.tv
 | 
					$BUILD/testfloat_gen -rnear_even -exact f128_to_ui64 > $OUTPUT/f128_to_ui64_rne.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rminMag f128_to_ui64 > $OUTPUT/f128_to_ui64_rz.tv
 | 
					$BUILD/testfloat_gen -rminMag -exact f128_to_ui64 > $OUTPUT/f128_to_ui64_rz.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmax f128_to_ui64 > $OUTPUT/f128_to_ui64_ru.tv
 | 
					$BUILD/testfloat_gen -rmax -exact f128_to_ui64 > $OUTPUT/f128_to_ui64_ru.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmin f128_to_ui64 > $OUTPUT/f128_to_ui64_rd.tv
 | 
					$BUILD/testfloat_gen -rmin -exact f128_to_ui64 > $OUTPUT/f128_to_ui64_rd.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_maxMag f128_to_ui64 > $OUTPUT/f128_to_ui64_rnm.tv
 | 
					$BUILD/testfloat_gen -rnear_maxMag -exact f128_to_ui64 > $OUTPUT/f128_to_ui64_rnm.tv
 | 
				
			||||||
echo "Creating f16_to_i32 convert vectors"
 | 
					echo "Creating f16_to_i32 convert vectors"
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_even f16_to_i32 > $OUTPUT/f16_to_i32_rne.tv
 | 
					$BUILD/testfloat_gen -rnear_even -exact f16_to_i32 > $OUTPUT/f16_to_i32_rne.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rminMag f16_to_i32 > $OUTPUT/f16_to_i32_rz.tv
 | 
					$BUILD/testfloat_gen -rminMag -exact f16_to_i32 > $OUTPUT/f16_to_i32_rz.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmax f16_to_i32 > $OUTPUT/f16_to_i32_ru.tv
 | 
					$BUILD/testfloat_gen -rmax -exact f16_to_i32 > $OUTPUT/f16_to_i32_ru.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmin f16_to_i32 > $OUTPUT/f16_to_i32_rd.tv
 | 
					$BUILD/testfloat_gen -rmin -exact f16_to_i32 > $OUTPUT/f16_to_i32_rd.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_maxMag f16_to_i32 > $OUTPUT/f16_to_i32_rnm.tv
 | 
					$BUILD/testfloat_gen -rnear_maxMag -exact f16_to_i32 > $OUTPUT/f16_to_i32_rnm.tv
 | 
				
			||||||
echo "Creating f32_to_i32 convert vectors"
 | 
					echo "Creating f32_to_i32 convert vectors"
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_even f32_to_i32 > $OUTPUT/f32_to_i32_rne.tv
 | 
					$BUILD/testfloat_gen -rnear_even -exact f32_to_i32 > $OUTPUT/f32_to_i32_rne.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rminMag f32_to_i32 > $OUTPUT/f32_to_i32_rz.tv
 | 
					$BUILD/testfloat_gen -rminMag -exact f32_to_i32 > $OUTPUT/f32_to_i32_rz.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmax f32_to_i32 > $OUTPUT/f32_to_i32_ru.tv
 | 
					$BUILD/testfloat_gen -rmax -exact f32_to_i32 > $OUTPUT/f32_to_i32_ru.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmin f32_to_i32 > $OUTPUT/f32_to_i32_rd.tv
 | 
					$BUILD/testfloat_gen -rmin -exact f32_to_i32 > $OUTPUT/f32_to_i32_rd.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_maxMag f32_to_i32 > $OUTPUT/f32_to_i32_rnm.tv
 | 
					$BUILD/testfloat_gen -rnear_maxMag -exact f32_to_i32 > $OUTPUT/f32_to_i32_rnm.tv
 | 
				
			||||||
echo "Creating f64_to_i32 convert vectors"
 | 
					echo "Creating f64_to_i32 convert vectors"
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_even f64_to_i32 > $OUTPUT/f64_to_i32_rne.tv
 | 
					$BUILD/testfloat_gen -rnear_even -exact f64_to_i32 > $OUTPUT/f64_to_i32_rne.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rminMag f64_to_i32 > $OUTPUT/f64_to_i32_rz.tv
 | 
					$BUILD/testfloat_gen -rminMag -exact f64_to_i32 > $OUTPUT/f64_to_i32_rz.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmax f64_to_i32 > $OUTPUT/f64_to_i32_ru.tv
 | 
					$BUILD/testfloat_gen -rmax -exact f64_to_i32 > $OUTPUT/f64_to_i32_ru.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmin f64_to_i32 > $OUTPUT/f64_to_i32_rd.tv
 | 
					$BUILD/testfloat_gen -rmin -exact f64_to_i32 > $OUTPUT/f64_to_i32_rd.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_maxMag f64_to_i32 > $OUTPUT/f64_to_i32_rnm.tv
 | 
					$BUILD/testfloat_gen -rnear_maxMag -exact f64_to_i32 > $OUTPUT/f64_to_i32_rnm.tv
 | 
				
			||||||
echo "Creating f128_to_i32 convert vectors"
 | 
					echo "Creating f128_to_i32 convert vectors"
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_even f128_to_i32 > $OUTPUT/f128_to_i32_rne.tv
 | 
					$BUILD/testfloat_gen -rnear_even -exact f128_to_i32 > $OUTPUT/f128_to_i32_rne.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rminMag f128_to_i32 > $OUTPUT/f128_to_i32_rz.tv
 | 
					$BUILD/testfloat_gen -rminMag -exact f128_to_i32 > $OUTPUT/f128_to_i32_rz.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmax f128_to_i32 > $OUTPUT/f128_to_i32_ru.tv
 | 
					$BUILD/testfloat_gen -rmax -exact f128_to_i32 > $OUTPUT/f128_to_i32_ru.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmin f128_to_i32 > $OUTPUT/f128_to_i32_rd.tv
 | 
					$BUILD/testfloat_gen -rmin -exact f128_to_i32 > $OUTPUT/f128_to_i32_rd.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_maxMag f128_to_i32 > $OUTPUT/f128_to_i32_rnm.tv
 | 
					$BUILD/testfloat_gen -rnear_maxMag -exact f128_to_i32 > $OUTPUT/f128_to_i32_rnm.tv
 | 
				
			||||||
echo "Creating f16_to_i64 convert vectors"
 | 
					echo "Creating f16_to_i64 convert vectors"
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_even f16_to_i64 > $OUTPUT/f16_to_i64_rne.tv
 | 
					$BUILD/testfloat_gen -rnear_even -exact f16_to_i64 > $OUTPUT/f16_to_i64_rne.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rminMag f16_to_i64 > $OUTPUT/f16_to_i64_rz.tv
 | 
					$BUILD/testfloat_gen -rminMag -exact f16_to_i64 > $OUTPUT/f16_to_i64_rz.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmax f16_to_i64 > $OUTPUT/f16_to_i64_ru.tv
 | 
					$BUILD/testfloat_gen -rmax -exact f16_to_i64 > $OUTPUT/f16_to_i64_ru.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmin f16_to_i64 > $OUTPUT/f16_to_i64_rd.tv
 | 
					$BUILD/testfloat_gen -rmin -exact f16_to_i64 > $OUTPUT/f16_to_i64_rd.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_maxMag f16_to_i64 > $OUTPUT/f16_to_i64_rnm.tv
 | 
					$BUILD/testfloat_gen -rnear_maxMag -exact f16_to_i64 > $OUTPUT/f16_to_i64_rnm.tv
 | 
				
			||||||
echo "Creating f32_to_i64 convert vectors"
 | 
					echo "Creating f32_to_i64 convert vectors"
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_even f32_to_i64 > $OUTPUT/f32_to_i64_rne.tv
 | 
					$BUILD/testfloat_gen -rnear_even -exact f32_to_i64 > $OUTPUT/f32_to_i64_rne.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rminMag f32_to_i64 > $OUTPUT/f32_to_i64_rz.tv
 | 
					$BUILD/testfloat_gen -rminMag -exact f32_to_i64 > $OUTPUT/f32_to_i64_rz.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmax f32_to_i64 > $OUTPUT/f32_to_i64_ru.tv
 | 
					$BUILD/testfloat_gen -rmax -exact f32_to_i64 > $OUTPUT/f32_to_i64_ru.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmin f32_to_i64 > $OUTPUT/f32_to_i64_rd.tv
 | 
					$BUILD/testfloat_gen -rmin -exact f32_to_i64 > $OUTPUT/f32_to_i64_rd.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_maxMag f32_to_i64 > $OUTPUT/f32_to_i64_rnm.tv
 | 
					$BUILD/testfloat_gen -rnear_maxMag -exact f32_to_i64 > $OUTPUT/f32_to_i64_rnm.tv
 | 
				
			||||||
echo "Creating f64_to_i64 convert vectors"
 | 
					echo "Creating f64_to_i64 convert vectors"
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_even f64_to_i64 > $OUTPUT/f64_to_i64_rne.tv
 | 
					$BUILD/testfloat_gen -rnear_even -exact f64_to_i64 > $OUTPUT/f64_to_i64_rne.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rminMag f64_to_i64 > $OUTPUT/f64_to_i64_rz.tv
 | 
					$BUILD/testfloat_gen -rminMag -exact f64_to_i64 > $OUTPUT/f64_to_i64_rz.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmax f64_to_i64 > $OUTPUT/f64_to_i64_ru.tv
 | 
					$BUILD/testfloat_gen -rmax -exact f64_to_i64 > $OUTPUT/f64_to_i64_ru.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmin f64_to_i64 > $OUTPUT/f64_to_i64_rd.tv
 | 
					$BUILD/testfloat_gen -rmin -exact f64_to_i64 > $OUTPUT/f64_to_i64_rd.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_maxMag f64_to_i64 > $OUTPUT/f64_to_i64_rnm.tv
 | 
					$BUILD/testfloat_gen -rnear_maxMag -exact f64_to_i64 > $OUTPUT/f64_to_i64_rnm.tv
 | 
				
			||||||
echo "Creating f128_to_i64 convert vectors"
 | 
					echo "Creating f128_to_i64 convert vectors"
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_even f128_to_i64 > $OUTPUT/f128_to_i64_rne.tv
 | 
					$BUILD/testfloat_gen -rnear_even -exact f128_to_i64 > $OUTPUT/f128_to_i64_rne.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rminMag f128_to_i64 > $OUTPUT/f128_to_i64_rz.tv
 | 
					$BUILD/testfloat_gen -rminMag -exact f128_to_i64 > $OUTPUT/f128_to_i64_rz.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmax f128_to_i64 > $OUTPUT/f128_to_i64_ru.tv
 | 
					$BUILD/testfloat_gen -rmax -exact f128_to_i64 > $OUTPUT/f128_to_i64_ru.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rmin f128_to_i64 > $OUTPUT/f128_to_i64_rd.tv
 | 
					$BUILD/testfloat_gen -rmin -exact f128_to_i64 > $OUTPUT/f128_to_i64_rd.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_maxMag f128_to_i64 > $OUTPUT/f128_to_i64_rnm.tv
 | 
					$BUILD/testfloat_gen -rnear_maxMag -exact f128_to_i64 > $OUTPUT/f128_to_i64_rnm.tv
 | 
				
			||||||
echo "Creating f16_to_f32 convert vectors"
 | 
					echo "Creating f16_to_f32 convert vectors"
 | 
				
			||||||
$BUILD/testfloat_gen -rnear_even f16_to_f32 > $OUTPUT/f16_to_f32_rne.tv
 | 
					$BUILD/testfloat_gen -rnear_even f16_to_f32 > $OUTPUT/f16_to_f32_rne.tv
 | 
				
			||||||
$BUILD/testfloat_gen -rminMag f16_to_f32 > $OUTPUT/f16_to_f32_rz.tv
 | 
					$BUILD/testfloat_gen -rminMag f16_to_f32 > $OUTPUT/f16_to_f32_rz.tv
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user