forked from Github_Repos/cvw
		
	forgot some files
This commit is contained in:
		
							parent
							
								
									e498d87c5c
								
							
						
					
					
						commit
						a4cd157f00
					
				
							
								
								
									
										112
									
								
								pipelined/src/fpu/otfc.sv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								pipelined/src/fpu/otfc.sv
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,112 @@
 | 
			
		||||
///////////////////////////////////////////
 | 
			
		||||
// otfc.sv
 | 
			
		||||
//
 | 
			
		||||
// Written: me@KatherineParry.com, cturek@hmc.edu 
 | 
			
		||||
// Modified:7/14/2022
 | 
			
		||||
//
 | 
			
		||||
// Purpose: On the fly conversion
 | 
			
		||||
// 
 | 
			
		||||
// A component of the Wally configurable RISC-V project.
 | 
			
		||||
// 
 | 
			
		||||
// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
 | 
			
		||||
//
 | 
			
		||||
// MIT LICENSE
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of this 
 | 
			
		||||
// software and associated documentation files (the "Software"), to deal in the Software 
 | 
			
		||||
// without restriction, including without limitation the rights to use, copy, modify, merge, 
 | 
			
		||||
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons 
 | 
			
		||||
// to whom the Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
//   The above copyright notice and this permission notice shall be included in all copies or 
 | 
			
		||||
//   substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
//   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
 | 
			
		||||
//   INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
 | 
			
		||||
//   PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 
 | 
			
		||||
//   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
 | 
			
		||||
//   TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 
 | 
			
		||||
//   OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
`include "wally-config.vh"
 | 
			
		||||
 | 
			
		||||
module otfc2 (
 | 
			
		||||
  input  logic         qp, qz,
 | 
			
		||||
  input  logic [`QLEN-1:0] Q, QM,
 | 
			
		||||
  output logic [`QLEN-1:0] QNext, QMNext
 | 
			
		||||
);
 | 
			
		||||
  //  The on-the-fly converter transfers the quotient 
 | 
			
		||||
  //  bits to the quotient as they come.
 | 
			
		||||
  //  Use this otfc for division only.
 | 
			
		||||
  logic [`QLEN-2:0] QR, QMR;
 | 
			
		||||
 | 
			
		||||
  assign QR  = Q[`QLEN-2:0];
 | 
			
		||||
  assign QMR = QM[`QLEN-2:0];     // Shifted Q and QM
 | 
			
		||||
 | 
			
		||||
  always_comb begin
 | 
			
		||||
    if (qp) begin
 | 
			
		||||
      QNext  = {QR,  1'b1};
 | 
			
		||||
      QMNext = {QR,  1'b0};
 | 
			
		||||
    end else if (qz) begin
 | 
			
		||||
      QNext  = {QR,  1'b0};
 | 
			
		||||
      QMNext = {QMR, 1'b1};
 | 
			
		||||
    end else begin        // If qp and qz are not true, then qn is
 | 
			
		||||
      QNext  = {QMR, 1'b1};
 | 
			
		||||
      QMNext = {QMR, 1'b0};
 | 
			
		||||
    end 
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
module otfc4 (
 | 
			
		||||
  input  logic [3:0]   q,
 | 
			
		||||
  input  logic [`QLEN-1:0] Q, QM,
 | 
			
		||||
  output logic [`QLEN-1:0] QNext, QMNext
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
  //  The on-the-fly converter transfers the quotient 
 | 
			
		||||
  //  bits to the quotient as they come. 
 | 
			
		||||
  //
 | 
			
		||||
  //  This code follows the psuedocode presented in the 
 | 
			
		||||
  //  floating point chapter of the book. Right now, 
 | 
			
		||||
  //  it is written for Radix-4 division.
 | 
			
		||||
  //
 | 
			
		||||
  //  QM is Q-1. It allows us to write negative bits 
 | 
			
		||||
  //  without using a costly CPA. 
 | 
			
		||||
 | 
			
		||||
  //  QR and QMR are the shifted versions of Q and QM.
 | 
			
		||||
  //  They are treated as [N-1:r] size signals, and 
 | 
			
		||||
  //  discard the r most significant bits of Q and QM. 
 | 
			
		||||
  logic [`QLEN-3:0] QR, QMR;
 | 
			
		||||
 | 
			
		||||
  // shift Q (quotent) and QM (quotent-1)
 | 
			
		||||
		// if 	q = 2  	    Q = {Q, 10} 	QM = {Q, 01}		
 | 
			
		||||
		// else if 	q = 1   Q = {Q, 01} 	QM = {Q, 00}	
 | 
			
		||||
		// else if 	q = 0   Q = {Q, 00} 	QM = {QM, 11}	
 | 
			
		||||
		// else if 	q = -1	Q = {QM, 11} 	QM = {QM, 10}
 | 
			
		||||
		// else if 	q = -2	Q = {QM, 10} 	QM = {QM, 01}
 | 
			
		||||
 | 
			
		||||
  assign QR  = Q[`QLEN-3:0];
 | 
			
		||||
  assign QMR = QM[`QLEN-3:0];     // Shifted Q and QM
 | 
			
		||||
  always_comb begin
 | 
			
		||||
    if (q[3]) begin // +2
 | 
			
		||||
      QNext  = {QR,  2'b10};
 | 
			
		||||
      QMNext = {QR,  2'b01};
 | 
			
		||||
    end else if (q[2]) begin // +1
 | 
			
		||||
      QNext  = {QR,  2'b01};
 | 
			
		||||
      QMNext = {QR,  2'b00};
 | 
			
		||||
    end else if (q[1]) begin // -1
 | 
			
		||||
      QNext  = {QMR,  2'b11};
 | 
			
		||||
      QMNext = {QMR,  2'b10};
 | 
			
		||||
    end else if (q[0]) begin // -2
 | 
			
		||||
      QNext  = {QMR,  2'b10};
 | 
			
		||||
      QMNext = {QMR,  2'b01};
 | 
			
		||||
    end else begin           // 0
 | 
			
		||||
      QNext  = {QR,  2'b00};
 | 
			
		||||
      QMNext = {QMR, 2'b11};
 | 
			
		||||
    end 
 | 
			
		||||
  end
 | 
			
		||||
  // Final Quoteint is in the range [.5, 2)
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
							
								
								
									
										135
									
								
								pipelined/src/fpu/qsel.sv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								pipelined/src/fpu/qsel.sv
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,135 @@
 | 
			
		||||
///////////////////////////////////////////
 | 
			
		||||
// srt.sv
 | 
			
		||||
//
 | 
			
		||||
// Written: David_Harris@hmc.edu, me@KatherineParry.com, cturek@hmc.edu 
 | 
			
		||||
// Modified:13 January 2022
 | 
			
		||||
//
 | 
			
		||||
// Purpose: Combined Divide and Square Root Floating Point and Integer Unit
 | 
			
		||||
// 
 | 
			
		||||
// A component of the Wally configurable RISC-V project.
 | 
			
		||||
// 
 | 
			
		||||
// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
 | 
			
		||||
//
 | 
			
		||||
// MIT LICENSE
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of this 
 | 
			
		||||
// software and associated documentation files (the "Software"), to deal in the Software 
 | 
			
		||||
// without restriction, including without limitation the rights to use, copy, modify, merge, 
 | 
			
		||||
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons 
 | 
			
		||||
// to whom the Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
//   The above copyright notice and this permission notice shall be included in all copies or 
 | 
			
		||||
//   substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
//   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
 | 
			
		||||
//   INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
 | 
			
		||||
//   PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 
 | 
			
		||||
//   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
 | 
			
		||||
//   TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 
 | 
			
		||||
//   OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
`include "wally-config.vh"
 | 
			
		||||
 | 
			
		||||
module qsel2 ( // *** eventually just change to 4 bits
 | 
			
		||||
  input  logic [`DIVLEN+3:`DIVLEN] ps, pc, 
 | 
			
		||||
  output logic         qp, qz//, qn
 | 
			
		||||
);
 | 
			
		||||
 
 | 
			
		||||
  logic [`DIVLEN+3:`DIVLEN]  p, g;
 | 
			
		||||
  logic          magnitude, sign, cout;
 | 
			
		||||
 | 
			
		||||
  // The quotient selection logic is presented for simplicity, not
 | 
			
		||||
  // for efficiency.  You can probably optimize your logic to
 | 
			
		||||
  // select the proper divisor with less delay.
 | 
			
		||||
 | 
			
		||||
  // Quotient equations from EE371 lecture notes 13-20
 | 
			
		||||
  assign p = ps ^ pc;
 | 
			
		||||
  assign g = ps & pc;
 | 
			
		||||
 | 
			
		||||
  assign magnitude = ~(&p[`DIVLEN+2:`DIVLEN]);
 | 
			
		||||
  assign cout = g[`DIVLEN+2] | (p[`DIVLEN+2] & (g[`DIVLEN+1] | p[`DIVLEN+1] & g[`DIVLEN]));
 | 
			
		||||
  assign sign = p[`DIVLEN+3] ^ cout;
 | 
			
		||||
/*  assign #1 magnitude = ~((ps[54]^pc[54]) & (ps[53]^pc[53]) & 
 | 
			
		||||
			  (ps[52]^pc[52]));
 | 
			
		||||
  assign #1 sign = (ps[55]^pc[55])^
 | 
			
		||||
      (ps[54] & pc[54] | ((ps[54]^pc[54]) &
 | 
			
		||||
			    (ps[53]&pc[53] | ((ps[53]^pc[53]) &
 | 
			
		||||
						(ps[52]&pc[52]))))); */
 | 
			
		||||
 | 
			
		||||
  // Produce quotient = +1, 0, or -1
 | 
			
		||||
  assign qp = magnitude & ~sign;
 | 
			
		||||
  assign qz = ~magnitude;
 | 
			
		||||
//   assign #1 qn = magnitude & sign;
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
module qsel4 (
 | 
			
		||||
	input logic [`DIVLEN+3:0] D,
 | 
			
		||||
	input logic [`DIVLEN+3:0] WS, WC,
 | 
			
		||||
	output logic [3:0] q
 | 
			
		||||
);
 | 
			
		||||
	logic [6:0] Wmsbs;
 | 
			
		||||
	logic [7:0] PreWmsbs;
 | 
			
		||||
	logic [2:0] Dmsbs;
 | 
			
		||||
	assign PreWmsbs = WC[`DIVLEN+3:`DIVLEN-4] + WS[`DIVLEN+3:`DIVLEN-4];
 | 
			
		||||
	assign Wmsbs = PreWmsbs[7:1];
 | 
			
		||||
	assign Dmsbs = D[`DIVLEN-1:`DIVLEN-3];
 | 
			
		||||
	// D = 0001.xxx...
 | 
			
		||||
	// Dmsbs = |   |
 | 
			
		||||
  // W =      xxxx.xxx...
 | 
			
		||||
	// Wmsbs = |        |
 | 
			
		||||
 | 
			
		||||
	logic [3:0] QSel4[1023:0];
 | 
			
		||||
 | 
			
		||||
  always_comb begin 
 | 
			
		||||
    integer d, w, i, w2;
 | 
			
		||||
    for(d=0; d<8; d++)
 | 
			
		||||
      for(w=0; w<128; w++)begin
 | 
			
		||||
        i = d*128+w;
 | 
			
		||||
        w2 = w-128*(w>=64); // convert to two's complement
 | 
			
		||||
        case(d)
 | 
			
		||||
          0: if($signed(w2)>=$signed(12))      QSel4[i] = 4'b1000;
 | 
			
		||||
            else if(w2>=4)   QSel4[i] = 4'b0100; 
 | 
			
		||||
            else if(w2>=-4)  QSel4[i] = 4'b0000; 
 | 
			
		||||
            else if(w2>=-13) QSel4[i] = 4'b0010; 
 | 
			
		||||
            else            QSel4[i] = 4'b0001; 
 | 
			
		||||
          1: if(w2>=14)      QSel4[i] = 4'b1000;
 | 
			
		||||
            else if(w2>=4)   QSel4[i] = 4'b0100; 
 | 
			
		||||
            else if(w2>=-6)  QSel4[i] = 4'b0000; 
 | 
			
		||||
            else if(w2>=-15) QSel4[i] = 4'b0010; 
 | 
			
		||||
            else            QSel4[i] = 4'b0001; 
 | 
			
		||||
          2: if(w2>=15)      QSel4[i] = 4'b1000;
 | 
			
		||||
            else if(w2>=4)   QSel4[i] = 4'b0100; 
 | 
			
		||||
            else if(w2>=-6)  QSel4[i] = 4'b0000; 
 | 
			
		||||
            else if(w2>=-16) QSel4[i] = 4'b0010; 
 | 
			
		||||
            else            QSel4[i] = 4'b0001; 
 | 
			
		||||
          3: if(w2>=16)      QSel4[i] = 4'b1000;
 | 
			
		||||
            else if(w2>=4)   QSel4[i] = 4'b0100; 
 | 
			
		||||
            else if(w2>=-6)  QSel4[i] = 4'b0000; 
 | 
			
		||||
            else if(w2>=-18) QSel4[i] = 4'b0010; 
 | 
			
		||||
            else            QSel4[i] = 4'b0001; 
 | 
			
		||||
          4: if(w2>=18)      QSel4[i] = 4'b1000;
 | 
			
		||||
            else if(w2>=6)   QSel4[i] = 4'b0100; 
 | 
			
		||||
            else if(w2>=-8)  QSel4[i] = 4'b0000; 
 | 
			
		||||
            else if(w2>=-20) QSel4[i] = 4'b0010; 
 | 
			
		||||
            else            QSel4[i] = 4'b0001; 
 | 
			
		||||
          5: if(w2>=20)      QSel4[i] = 4'b1000;
 | 
			
		||||
            else if(w2>=6)   QSel4[i] = 4'b0100; 
 | 
			
		||||
            else if(w2>=-8)  QSel4[i] = 4'b0000; 
 | 
			
		||||
            else if(w2>=-20) QSel4[i] = 4'b0010; 
 | 
			
		||||
            else            QSel4[i] = 4'b0001; 
 | 
			
		||||
          6: if(w2>=20)      QSel4[i] = 4'b1000;
 | 
			
		||||
            else if(w2>=8)   QSel4[i] = 4'b0100; 
 | 
			
		||||
            else if(w2>=-8)  QSel4[i] = 4'b0000; 
 | 
			
		||||
            else if(w2>=-22) QSel4[i] = 4'b0010; 
 | 
			
		||||
            else            QSel4[i] = 4'b0001; 
 | 
			
		||||
          7: if(w2>=24)      QSel4[i] = 4'b1000;
 | 
			
		||||
            else if(w2>=8)   QSel4[i] = 4'b0100; 
 | 
			
		||||
            else if(w2>=-8)  QSel4[i] = 4'b0000; 
 | 
			
		||||
            else if(w2>=-24) QSel4[i] = 4'b0010; 
 | 
			
		||||
            else            QSel4[i] = 4'b0001; 
 | 
			
		||||
        endcase
 | 
			
		||||
      end
 | 
			
		||||
  end
 | 
			
		||||
	assign q = QSel4[{Dmsbs,Wmsbs}];
 | 
			
		||||
	
 | 
			
		||||
endmodule
 | 
			
		||||
							
								
								
									
										259
									
								
								pipelined/src/fpu/srt.sv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										259
									
								
								pipelined/src/fpu/srt.sv
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,259 @@
 | 
			
		||||
///////////////////////////////////////////
 | 
			
		||||
// srt.sv
 | 
			
		||||
//
 | 
			
		||||
// Written: David_Harris@hmc.edu, me@KatherineParry.com, cturek@hmc.edu 
 | 
			
		||||
// Modified:13 January 2022
 | 
			
		||||
//
 | 
			
		||||
// Purpose: Combined Divide and Square Root Floating Point and Integer Unit
 | 
			
		||||
// 
 | 
			
		||||
// A component of the Wally configurable RISC-V project.
 | 
			
		||||
// 
 | 
			
		||||
// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
 | 
			
		||||
//
 | 
			
		||||
// MIT LICENSE
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of this 
 | 
			
		||||
// software and associated documentation files (the "Software"), to deal in the Software 
 | 
			
		||||
// without restriction, including without limitation the rights to use, copy, modify, merge, 
 | 
			
		||||
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons 
 | 
			
		||||
// to whom the Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
//   The above copyright notice and this permission notice shall be included in all copies or 
 | 
			
		||||
//   substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
//   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
 | 
			
		||||
//   INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
 | 
			
		||||
//   PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 
 | 
			
		||||
//   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
 | 
			
		||||
//   TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 
 | 
			
		||||
//   OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
`include "wally-config.vh"
 | 
			
		||||
 | 
			
		||||
module srt(
 | 
			
		||||
  input  logic clk,
 | 
			
		||||
  input  logic DivStart, 
 | 
			
		||||
  input  logic DivBusy, 
 | 
			
		||||
  input logic  [`FMTBITS-1:0] FmtE,
 | 
			
		||||
  input  logic [`NE-1:0] Xe, Ye,
 | 
			
		||||
  input  logic XZeroE, YZeroE, 
 | 
			
		||||
  input logic [`DIVLEN-1:0] X,
 | 
			
		||||
  input logic [`DIVLEN-1:0] Dpreproc,
 | 
			
		||||
  input logic [$clog2(`NF+2)-1:0] XZeroCnt, YZeroCnt,
 | 
			
		||||
  input logic NegSticky,
 | 
			
		||||
  output logic [`QLEN-1-(`RADIX/4):0] Quot,
 | 
			
		||||
  output logic [`DIVLEN+3:0]  NextWSN, NextWCN,
 | 
			
		||||
  output logic [`DIVLEN+3:0]  StickyWSA,
 | 
			
		||||
  output logic [`DIVLEN+3:0]  FirstWS, FirstWC,
 | 
			
		||||
  output logic  [`NE+1:0] DivCalcExpM,
 | 
			
		||||
  output logic [`XLEN-1:0] Rem
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 /* verilator lint_off UNOPTFLAT */
 | 
			
		||||
  logic [`DIVLEN+3:0]  WSA[`DIVCOPIES-1:0];
 | 
			
		||||
  logic [`DIVLEN+3:0]  WCA[`DIVCOPIES-1:0];
 | 
			
		||||
  logic [`DIVLEN+3:0]  WS[`DIVCOPIES-1:0];
 | 
			
		||||
  logic [`DIVLEN+3:0]  WC[`DIVCOPIES-1:0];
 | 
			
		||||
  logic [`QLEN-1:0] Q[`DIVCOPIES-1:0];
 | 
			
		||||
  logic [`QLEN-1:0] QM[`DIVCOPIES-1:0];
 | 
			
		||||
  logic [`QLEN-1:0] QNext[`DIVCOPIES-1:0];
 | 
			
		||||
  logic [`QLEN-1:0] QMNext[`DIVCOPIES-1:0];
 | 
			
		||||
 /* verilator lint_on UNOPTFLAT */
 | 
			
		||||
  logic [`DIVLEN+3:0]  WSN, WCN;
 | 
			
		||||
  logic [`DIVLEN+3:0]  D, DBar, D2, DBar2;
 | 
			
		||||
  logic [`NE+1:0] DivCalcExp;
 | 
			
		||||
  logic [$clog2(`XLEN+1)-1:0] intExp;
 | 
			
		||||
  logic           intSign;
 | 
			
		||||
  logic [`QLEN-1:0] QMMux;
 | 
			
		||||
 | 
			
		||||
  // Top Muxes and Registers
 | 
			
		||||
  // When start is asserted, the inputs are loaded into the divider.
 | 
			
		||||
  // Otherwise, the divisor is retained and the partial remainder
 | 
			
		||||
  // is fed back for the next iteration.
 | 
			
		||||
  //  - when the start signal is asserted X and 0 are loaded into WS and WC
 | 
			
		||||
  //  - otherwise load WSA into the flipflop
 | 
			
		||||
  //  - the assumed one is added to D since it's always normalized (and X/0 is a special case handeled by result selection)
 | 
			
		||||
  //  - XZeroE is used as the assumed one to avoid creating a sticky bit - all other numbers are normalized
 | 
			
		||||
  if (`RADIX == 2) begin : nextw
 | 
			
		||||
    assign NextWSN = {WSA[`DIVCOPIES-1][`DIVLEN+2:0], 1'b0};
 | 
			
		||||
    assign NextWCN = {WCA[`DIVCOPIES-1][`DIVLEN+2:0], 1'b0};
 | 
			
		||||
  end else begin
 | 
			
		||||
    assign NextWSN = {WSA[`DIVCOPIES-1][`DIVLEN+1:0], 2'b0};
 | 
			
		||||
    assign NextWCN = {WCA[`DIVCOPIES-1][`DIVLEN+1:0], 2'b0};
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  mux2   #(`DIVLEN+4) wsmux(NextWSN, {3'b000, ~XZeroE, X}, DivStart, WSN);
 | 
			
		||||
  flopen   #(`DIVLEN+4) wsflop(clk, DivStart|DivBusy, WSN, WS[0]);
 | 
			
		||||
  mux2   #(`DIVLEN+4) wcmux(NextWCN, {`DIVLEN+4{1'b0}}, DivStart, WCN);
 | 
			
		||||
  flopen   #(`DIVLEN+4) wcflop(clk, DivStart|DivBusy, WCN, WC[0]);
 | 
			
		||||
  flopen #(`DIVLEN+4) dflop(clk, DivStart, {4'b0001, Dpreproc}, D);
 | 
			
		||||
  flopen #(`NE+2) expflop(clk, DivStart, DivCalcExp, DivCalcExpM);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  // Divisor Selections
 | 
			
		||||
  // - choose the negitive version of what's being selected
 | 
			
		||||
  assign DBar = ~D;
 | 
			
		||||
  if(`RADIX == 4) begin : d2
 | 
			
		||||
    assign DBar2 = {~D[`DIVLEN+2:0], 1'b1};
 | 
			
		||||
    assign D2 = {D[`DIVLEN+2:0], 1'b0};
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  genvar i;
 | 
			
		||||
  generate
 | 
			
		||||
    for(i=0; $unsigned(i)<`DIVCOPIES; i++) begin : interations
 | 
			
		||||
      divinteration divinteration(.D, .DBar, .D2, .DBar2, 
 | 
			
		||||
      .WS(WS[i]), .WC(WC[i]), .WSA(WSA[i]), .WCA(WCA[i]), .Q(Q[i]), .QM(QM[i]), .QNext(QNext[i]), .QMNext(QMNext[i]));
 | 
			
		||||
      if(i<(`DIVCOPIES-1)) begin 
 | 
			
		||||
        if (`RADIX==2)begin 
 | 
			
		||||
          assign WS[i+1] = {WSA[i][`DIVLEN+1:0], 1'b0};
 | 
			
		||||
          assign WC[i+1] = {WCA[i][`DIVLEN+1:0], 1'b0};
 | 
			
		||||
        end else begin
 | 
			
		||||
          assign WS[i+1] = {WSA[i][`DIVLEN+1:0], 2'b0};
 | 
			
		||||
          assign WC[i+1] = {WCA[i][`DIVLEN+1:0], 2'b0};
 | 
			
		||||
        end
 | 
			
		||||
        assign Q[i+1] = QNext[i];
 | 
			
		||||
        assign QM[i+1] = QMNext[i];
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  endgenerate
 | 
			
		||||
 | 
			
		||||
  // if starting a new divison set Q to 0 and QM to -1
 | 
			
		||||
  mux2 #(`QLEN) QMmux(QMNext[`DIVCOPIES-1], {`QLEN{1'b1}}, DivStart, QMMux);
 | 
			
		||||
  flopenr #(`QLEN) Qreg(clk, DivStart, DivBusy, QNext[`DIVCOPIES-1], Q[0]);
 | 
			
		||||
  flopen #(`QLEN) QMreg(clk, DivBusy, QMMux, QM[0]);
 | 
			
		||||
 | 
			
		||||
  assign Quot = NegSticky ? QM[0][`QLEN-1-(`RADIX/4):0] : Q[0][`QLEN-1-(`RADIX/4):0];
 | 
			
		||||
  assign FirstWS = WS[0];
 | 
			
		||||
  assign FirstWC = WC[0];
 | 
			
		||||
  if(`RADIX==2)
 | 
			
		||||
    if (`DIVCOPIES == 1)
 | 
			
		||||
      assign StickyWSA = {WSA[0][`DIVLEN+2:0], 1'b0};
 | 
			
		||||
    else
 | 
			
		||||
      assign StickyWSA = {WSA[1][`DIVLEN+2:0], 1'b0};
 | 
			
		||||
 | 
			
		||||
  expcalc expcalc(.FmtE, .Xe, .Ye, .XZeroE, .XZeroCnt, .YZeroCnt, .DivCalcExp);
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
////////////////
 | 
			
		||||
// Submodules //
 | 
			
		||||
////////////////
 | 
			
		||||
 | 
			
		||||
 /* verilator lint_off UNOPTFLAT */
 | 
			
		||||
module divinteration (
 | 
			
		||||
  input logic [`DIVLEN+3:0] D,
 | 
			
		||||
  input logic [`DIVLEN+3:0]  DBar, D2, DBar2,
 | 
			
		||||
  input logic [`QLEN-1:0] Q, QM,
 | 
			
		||||
  input logic [`DIVLEN+3:0]  WS, WC,
 | 
			
		||||
  output logic [`QLEN-1:0] QNext, QMNext, 
 | 
			
		||||
  output logic [`DIVLEN+3:0]  WSA, WCA
 | 
			
		||||
);
 | 
			
		||||
 /* verilator lint_on UNOPTFLAT */
 | 
			
		||||
 | 
			
		||||
  logic [`DIVLEN+3:0]  Dsel;
 | 
			
		||||
  logic [3:0]     q;
 | 
			
		||||
  logic qp, qz;//, qn;
 | 
			
		||||
 | 
			
		||||
  // Quotient Selection logic
 | 
			
		||||
  // Given partial remainder, select quotient of +1, 0, or -1 (qp, qz, pm)
 | 
			
		||||
  // q encoding:
 | 
			
		||||
	// 1000 = +2
 | 
			
		||||
	// 0100 = +1
 | 
			
		||||
	// 0000 =  0
 | 
			
		||||
	// 0010 = -1
 | 
			
		||||
	// 0001 = -2
 | 
			
		||||
  if(`RADIX == 2) begin : qsel
 | 
			
		||||
    qsel2 qsel2(WS[`DIVLEN+3:`DIVLEN], WC[`DIVLEN+3:`DIVLEN], qp, qz);//, qn);
 | 
			
		||||
  end else begin
 | 
			
		||||
    qsel4 qsel4(.D, .WS, .WC, .q);
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  if(`RADIX == 2) begin : dsel
 | 
			
		||||
    assign Dsel = {`DIVLEN+4{~qz}}&(qp ? DBar : D);
 | 
			
		||||
  end else begin
 | 
			
		||||
    always_comb
 | 
			
		||||
      case (q)
 | 
			
		||||
        4'b1000: Dsel = DBar2;
 | 
			
		||||
        4'b0100: Dsel = DBar;
 | 
			
		||||
        4'b0000: Dsel = '0;
 | 
			
		||||
        4'b0010: Dsel = D;
 | 
			
		||||
        4'b0001: Dsel = D2;
 | 
			
		||||
        default: Dsel = 'x;
 | 
			
		||||
      endcase
 | 
			
		||||
  end
 | 
			
		||||
  // Partial Product Generation
 | 
			
		||||
  //  WSA, WCA = WS + WC - qD
 | 
			
		||||
  if (`RADIX == 2) begin : csa
 | 
			
		||||
    csa #(`DIVLEN+4) csa(WS, WC, Dsel, qp, WSA, WCA);
 | 
			
		||||
  end else begin
 | 
			
		||||
    csa #(`DIVLEN+4) csa(WS, WC, Dsel, |q[3:2], WSA, WCA);
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  if (`RADIX == 2) begin : otfc
 | 
			
		||||
    otfc2 otfc2(.qp, .qz, .Q, .QM, .QNext, .QMNext);
 | 
			
		||||
  end else begin
 | 
			
		||||
    otfc4 otfc4(.q, .Q, .QM, .QNext, .QMNext);
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/////////
 | 
			
		||||
// csa //
 | 
			
		||||
/////////
 | 
			
		||||
module csa #(parameter N=69) (
 | 
			
		||||
  input  logic [N-1:0] in1, in2, in3, 
 | 
			
		||||
  input  logic         cin, 
 | 
			
		||||
  output logic [N-1:0] out1, out2
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
  // This block adds in1, in2, in3, and cin to produce 
 | 
			
		||||
  // a result out1 / out2 in carry-save redundant form.
 | 
			
		||||
  // cin is just added to the least significant bit and
 | 
			
		||||
  // is Startuired to handle adding a negative divisor.
 | 
			
		||||
  // Fortunately, the carry (out2) is shifted left by one
 | 
			
		||||
  // bit, leaving room in the least significant bit to 
 | 
			
		||||
  // insert cin.
 | 
			
		||||
 | 
			
		||||
  assign out1 = in1 ^ in2 ^ in3;
 | 
			
		||||
  assign out2 = {in1[N-2:0] & (in2[N-2:0] | in3[N-2:0]) | 
 | 
			
		||||
		    (in2[N-2:0] & in3[N-2:0]), cin};
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
module expcalc(
 | 
			
		||||
  input logic  [`FMTBITS-1:0] FmtE,
 | 
			
		||||
  input  logic [`NE-1:0] Xe, Ye,
 | 
			
		||||
  input logic XZeroE, 
 | 
			
		||||
  input logic [$clog2(`NF+2)-1:0] XZeroCnt, YZeroCnt,
 | 
			
		||||
  output logic  [`NE+1:0] DivCalcExp
 | 
			
		||||
  );
 | 
			
		||||
    logic [`NE-2:0] Bias;
 | 
			
		||||
    
 | 
			
		||||
    if (`FPSIZES == 1) begin
 | 
			
		||||
        assign Bias = (`NE-1)'(`BIAS); 
 | 
			
		||||
 | 
			
		||||
    end else if (`FPSIZES == 2) begin
 | 
			
		||||
        assign Bias = FmtE ? (`NE-1)'(`BIAS) : (`NE-1)'(`BIAS1); 
 | 
			
		||||
 | 
			
		||||
    end else if (`FPSIZES == 3) begin
 | 
			
		||||
        always_comb
 | 
			
		||||
            case (FmtE)
 | 
			
		||||
                `FMT: Bias  =  (`NE-1)'(`BIAS);
 | 
			
		||||
                `FMT1: Bias = (`NE-1)'(`BIAS1);
 | 
			
		||||
                `FMT2: Bias = (`NE-1)'(`BIAS2);
 | 
			
		||||
                default: Bias = 'x;
 | 
			
		||||
            endcase
 | 
			
		||||
 | 
			
		||||
    end else if (`FPSIZES == 4) begin        
 | 
			
		||||
        always_comb
 | 
			
		||||
            case (FmtE)
 | 
			
		||||
                2'h3: Bias =  (`NE-1)'(`Q_BIAS);
 | 
			
		||||
                2'h1: Bias =  (`NE-1)'(`D_BIAS);
 | 
			
		||||
                2'h0: Bias =  (`NE-1)'(`S_BIAS);
 | 
			
		||||
                2'h2: Bias =  (`NE-1)'(`H_BIAS);
 | 
			
		||||
            endcase
 | 
			
		||||
    end
 | 
			
		||||
    // correct exponent for denormalized input's normalization shifts
 | 
			
		||||
    assign DivCalcExp = ({2'b0, Xe} - {{`NE+1-$unsigned($clog2(`NF+2)){1'b0}}, XZeroCnt} - {2'b0, Ye} + {{`NE+1-$unsigned($clog2(`NF+2)){1'b0}}, YZeroCnt} + {3'b0, Bias})&{`NE+2{~XZeroE}};
 | 
			
		||||
    endmodule
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user