mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Updated radix 2 divider to work with integers and floats in new structure. Integers still might not work.
This commit is contained in:
		
							parent
							
								
									54938c7abf
								
							
						
					
					
						commit
						3a40c68549
					
				@ -1 +1 @@
 | 
				
			|||||||
Subproject commit be67c99bd461742aa1c100bcc0732657faae2230
 | 
					Subproject commit 307c77b26e070ae85ffea665ad9b642b40e33c86
 | 
				
			||||||
@ -94,9 +94,9 @@
 | 
				
			|||||||
`define BIAS2 ((`F_SUPPORTED & (`LEN1 != `S_LEN)) ? `S_BIAS : `H_BIAS)
 | 
					`define BIAS2 ((`F_SUPPORTED & (`LEN1 != `S_LEN)) ? `S_BIAS : `H_BIAS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// largest length in IEU/FPU
 | 
					// largest length in IEU/FPU
 | 
				
			||||||
`define CVTLEN ((`NF<`XLEN) ? `XLEN : `NF)
 | 
					`define CVTLEN ((`NF<`XLEN) ? (`XLEN) : (`NF))
 | 
				
			||||||
`define DIVLEN ((`NF < `XLEN) ? `XLEN : `NF)
 | 
					`define DIVLEN ((`NF < `XLEN) ? (`XLEN) : (`NF))
 | 
				
			||||||
`define LLEN ((`FLEN<`XLEN) ? `XLEN : `FLEN)
 | 
					`define LLEN ((`FLEN<`XLEN) ? (`XLEN) : (`FLEN))
 | 
				
			||||||
`define LOGCVTLEN $unsigned($clog2(`CVTLEN+1))
 | 
					`define LOGCVTLEN $unsigned($clog2(`CVTLEN+1))
 | 
				
			||||||
`define NORMSHIFTSZ ((`DIVLEN+`NF+3) > (3*`NF+8) ? (`DIVLEN+`NF+3) : (3*`NF+9))
 | 
					`define NORMSHIFTSZ ((`DIVLEN+`NF+3) > (3*`NF+8) ? (`DIVLEN+`NF+3) : (3*`NF+9))
 | 
				
			||||||
`define CORRSHIFTSZ ((`DIVLEN+`NF+3) > (3*`NF+8) ? (`DIVLEN+`NF+3) : (3*`NF+6))
 | 
					`define CORRSHIFTSZ ((`DIVLEN+`NF+3) > (3*`NF+8) ? (`DIVLEN+`NF+3) : (3*`NF+6))
 | 
				
			||||||
 | 
				
			|||||||
@ -2,7 +2,7 @@
 | 
				
			|||||||
// srt.sv
 | 
					// srt.sv
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Written: David_Harris@hmc.edu 13 January 2022
 | 
					// Written: David_Harris@hmc.edu 13 January 2022
 | 
				
			||||||
// Modified: 
 | 
					// Modified: cturek@hmc.edu June 2022
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Purpose: Combined Divide and Square Root Floating Point and Integer Unit
 | 
					// Purpose: Combined Divide and Square Root Floating Point and Integer Unit
 | 
				
			||||||
// 
 | 
					// 
 | 
				
			||||||
@ -29,10 +29,8 @@
 | 
				
			|||||||
////////////////////////////////////////////////////////////////////////////////////////////////
 | 
					////////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`include "wally-config.vh"
 | 
					`include "wally-config.vh"
 | 
				
			||||||
 | 
					`define EXTRAFRACBITS ((`NF<(`XLEN)) ? (`XLEN - `NF) : 0)
 | 
				
			||||||
`define DIVLEN ((`NF<(`XLEN+1)) ? (`XLEN + 1) : `NF)
 | 
					`define EXTRAINTBITS ((`NF<(`XLEN)) ? 0 : (`NF - `XLEN))
 | 
				
			||||||
`define EXTRAFRACBITS ((`NF<(`XLEN+1)) ? (`XLEN - `NF + 1) : 0)
 | 
					 | 
				
			||||||
`define EXTRAINTBITS ((`NF<(`XLEN+1)) ? 0 : (`NF - `XLEN))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
module srt (
 | 
					module srt (
 | 
				
			||||||
  input  logic clk,
 | 
					  input  logic clk,
 | 
				
			||||||
@ -131,11 +129,11 @@ module srtpreproc (
 | 
				
			|||||||
  lzc #(`XLEN) lzcA (PosA, zeroCntA);
 | 
					  lzc #(`XLEN) lzcA (PosA, zeroCntA);
 | 
				
			||||||
  lzc #(`XLEN) lzcB (PosB, zeroCntB);
 | 
					  lzc #(`XLEN) lzcB (PosB, zeroCntB);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  assign ExtraA = {1'b0, PosA, {`EXTRAINTBITS{1'b0}}};
 | 
					  assign ExtraA = {PosA, {`EXTRAINTBITS{1'b0}}};
 | 
				
			||||||
  assign ExtraB = {1'b0, PosB, {`EXTRAINTBITS{1'b0}}};
 | 
					  assign ExtraB = {PosB, {`EXTRAINTBITS{1'b0}}};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  assign PreprocA = ExtraA << zeroCntA;
 | 
					  assign PreprocA = ExtraA << zeroCntA;
 | 
				
			||||||
  assign PreprocB = ExtraB << (zeroCntB + 1);
 | 
					  assign PreprocB = ExtraB << zeroCntB;
 | 
				
			||||||
  assign PreprocX = {SrcXFrac, {`EXTRAFRACBITS{1'b0}}};
 | 
					  assign PreprocX = {SrcXFrac, {`EXTRAFRACBITS{1'b0}}};
 | 
				
			||||||
  assign PreprocY = {SrcYFrac, {`EXTRAFRACBITS{1'b0}}};
 | 
					  assign PreprocY = {SrcYFrac, {`EXTRAFRACBITS{1'b0}}};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -228,14 +226,15 @@ module otfc2 #(parameter N=65) (
 | 
				
			|||||||
  //
 | 
					  //
 | 
				
			||||||
  //  QM is Q-1. It allows us to write negative bits 
 | 
					  //  QM is Q-1. It allows us to write negative bits 
 | 
				
			||||||
  //  without using a costly CPA. 
 | 
					  //  without using a costly CPA. 
 | 
				
			||||||
  logic [N+2:0] Q, QM, QNext, QMNext;
 | 
					  logic [N+2:0] Q, QM, QNext, QMNext, QMMux;
 | 
				
			||||||
  //  QR and QMR are the shifted versions of Q and QM.
 | 
					  //  QR and QMR are the shifted versions of Q and QM.
 | 
				
			||||||
  //  They are treated as [N-1:r] size signals, and 
 | 
					  //  They are treated as [N-1:r] size signals, and 
 | 
				
			||||||
  //  discard the r most significant bits of Q and QM. 
 | 
					  //  discard the r most significant bits of Q and QM. 
 | 
				
			||||||
  logic [N+1:0] QR, QMR;
 | 
					  logic [N+1:0] QR, QMR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  flopr #(N+3) Qreg(clk, Start, QNext, Q);
 | 
					  flopr #(N+3) Qreg(clk, Start, QNext, Q);
 | 
				
			||||||
  flopr #(N+3) QMreg(clk, Start, QMNext, QM);
 | 
					  mux2 #(`DIVLEN+3) QMmux(QMNext, {`DIVLEN+3{1'b1}}, Start, QMMux);
 | 
				
			||||||
 | 
					  flop #(`DIVLEN+3) QMreg(clk, QMMux, QM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  always_comb begin
 | 
					  always_comb begin
 | 
				
			||||||
    QR  = Q[N+1:0];
 | 
					    QR  = Q[N+1:0];
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
`define DIVLEN 65
 | 
					`define DIVLEN 64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/////////////
 | 
					/////////////
 | 
				
			||||||
// counter //
 | 
					// counter //
 | 
				
			||||||
@ -17,7 +17,7 @@ module counter(input  logic clk,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  always @(posedge clk)
 | 
					  always @(posedge clk)
 | 
				
			||||||
    begin
 | 
					    begin
 | 
				
			||||||
      if      (count == `DIVLEN+1) done <= #1 1;
 | 
					      if      (count == `DIVLEN + 2) done <= #1 1;
 | 
				
			||||||
      else if (done | req) done <= #1 0;	
 | 
					      else if (done | req) done <= #1 0;	
 | 
				
			||||||
      if (req) count <= #1 0;
 | 
					      if (req) count <= #1 0;
 | 
				
			||||||
      else     count <= #1 count+1;
 | 
					      else     count <= #1 count+1;
 | 
				
			||||||
@ -101,8 +101,8 @@ module testbench;
 | 
				
			|||||||
      b = Vec[`memb];
 | 
					      b = Vec[`memb];
 | 
				
			||||||
      {bsign, bExp, bfrac} = b;
 | 
					      {bsign, bExp, bfrac} = b;
 | 
				
			||||||
      nextr = Vec[`memr];
 | 
					      nextr = Vec[`memr];
 | 
				
			||||||
      r = Quot[`DIVLEN:`DIVLEN - 52];
 | 
					      r = Quot[(`DIVLEN - 1):(`DIVLEN - 52)];
 | 
				
			||||||
      rOTFC = QuotOTFC[`DIVLEN:`DIVLEN - 52];
 | 
					      rOTFC = QuotOTFC[(`DIVLEN - 1):(`DIVLEN - 52)];
 | 
				
			||||||
      req <= #5 1;
 | 
					      req <= #5 1;
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
@ -110,8 +110,8 @@ module testbench;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  always @(posedge clk)
 | 
					  always @(posedge clk)
 | 
				
			||||||
    begin
 | 
					    begin
 | 
				
			||||||
      r = Quot[`DIVLEN:`DIVLEN - 52];
 | 
					      r = Quot[(`DIVLEN - 1):(`DIVLEN - 52)];
 | 
				
			||||||
      rOTFC = QuotOTFC[`DIVLEN:`DIVLEN - 52];
 | 
					      rOTFC = QuotOTFC[(`DIVLEN - 1):(`DIVLEN - 52)];
 | 
				
			||||||
      if (done) 
 | 
					      if (done) 
 | 
				
			||||||
	begin
 | 
						begin
 | 
				
			||||||
	  req <= #5 1;
 | 
						  req <= #5 1;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user