HierarchyFilesModulesSignalsTasksFunctionsHelp

/******************************************************************************/ 
/*                                                                            */ 
/* Copyright (c) 1999 Sun Microsystems, Inc. All rights reserved.             */ 
/*                                                                            */ 
/* The contents of this file are subject to the current version of the Sun    */ 
/* Community Source License, microSPARCII ("the License"). You may not use    */ 
/* this file except in compliance with the License.  You may obtain a copy    */ 
/* of the License by searching for "Sun Community Source License" on the      */ 
/* World Wide Web at http://www.sun.com. See the License for the rights,      */ 
/* obligations, and limitations governing use of the contents of this file.   */ 
/*                                                                            */ 
/* Sun Microsystems, Inc. has intellectual property rights relating to the    */ 
/* technology embodied in these files. In particular, and without limitation, */ 
/* these intellectual property rights may include one or more U.S. patents,   */ 
/* foreign patents, or pending applications.                                  */ 
/*                                                                            */ 
/* Sun, Sun Microsystems, the Sun logo, all Sun-based trademarks and logos,   */ 
/* Solaris, Java and all Java-based trademarks and logos are trademarks or    */ 
/* registered trademarks of Sun Microsystems, Inc. in the United States and   */ 
/* other countries. microSPARC is a trademark or registered trademark of      */ 
/* SPARC International, Inc. All SPARC trademarks are used under license and  */ 
/* are trademarks or registered trademarks of SPARC International, Inc. in    */ 
/* the United States and other countries. Products bearing SPARC trademarks   */ 
/* are based upon an architecture developed by Sun Microsystems, Inc.         */ 
/*                                                                            */ 
/******************************************************************************/ 
/***************************************************************************
****************************************************************************
***
***  Program File:  @(#)fpm_frac.v
***
****************************************************************************
****************************************************************************/

//  @(#)fpm_frac.v	1.5  11/13/92
//
// **************************************************************
//  fpm_frac -- structural description of mantissa portion of floating
//		point multiplier.
//
// **************************************************************

[Up: fp_fpm fpmfrac]
module fpm_frac (
            ss_scan_mode,
            fpm_frac_scan_in,
            fpm_frac_scan_out,
	    fpm_frac,
	    fpm_sign,
	    fpm_inx,
	    frac_ovf,
	    rs1_s,
	    rs1_m,
	    rs2_s,
	    rs2_m,
	    fpm_inst,
	    rnd_mode,
	    fpm_start,
	    fpm_clk
	    );


    input ss_scan_mode;
    input fpm_frac_scan_in;
    output fpm_frac_scan_out;

    output [51:0] fpm_frac;	// 52-bit fraction (no sign, no implicit).
				// Registered output, valid in W stage.
    output fpm_sign;		// Product sign bit.  Registered output.
    output fpm_inx;		// Inexact flag.
				// 52-bit add + 4 gate delays into X3 stage
    output frac_ovf;		// fraction overflow (fpm_f >= 2.0)
				// 52-bit add + 3 gate delays into X3 stage

    input  rs1_s;		// multiplicand sign
				// Registered in X1 stage
    input  [54:0] rs1_m;	// 55-bit operand: multiplicand (X mantissa) 
				// Registered in X1 stage
    input  rs2_s;		// multiplier sign
				// Registered in X1 stage
    input  [54:0] rs2_m;	// 55-bit operand: multiplier   (Y mantissa)
				// Registered in X1 stage
    input  [1:0] fpm_inst;	// FMULs=00, FMULd=01, FsMULd=10
				// Expected valid same time as fpm_start
    input  [1:0]  rnd_mode;	// rounding mode (same as FSR[31:30])
				// Expected valid in X3 stage
    input  fpm_start;		// go-ahead signal
				// Should be active for 1 cycle only.
    input  fpm_clk;		// single phase master clock

    wire rs1_s;
    wire [54:0] rs1_m;
    wire rs2_s;
    wire [54:0] rs2_m;
    wire [1:0]  rnd_mode;
    wire fpm_start;
    wire fpm_clk;

    wire [52:0] rs1_mX12;	// registered rs1 (multiplicand) mantissa
    wire [52:0] rs2_mX12;	// registered rs2 (multiplier) mantissa
    wire rs1_sX12;		// registered rs1 sign
    wire rs2_sX12;		// registered rs1 sign

    wire [79:0] sum;		// half array redundant sum
    wire [79:1] carry;		// half array redundant carry
    wire [79:23] sumX12;	// registered redundant sum
    wire [79:23] carryX12;	// registered redundant carry
    wire [105:51] sumX3;	// recoded sum
    wire [105:52] carryX3;	// recoded carry
    wire passX1;		// fpm_start asserted in X1
    wire passX2;		// fpm_start asserted in X2
    wire passX3;		// fpm_start asserted in X3

    wire signX3;		// registered mantissa sign

    wire stickyX3;		// registered sticky bit

    wire c51X3;			// registered carry into result 51

    wire [52:0] mantissa;	// final adder output


    ME_TIEOFF t1 (VDD, GND) ;

    assign fpm_sign = signX3 ;

    //
    // controller
    //
    ME_FD1 rgstrX1 (
		    .q(passX1),
		    .d(fpm_start),
		    .cp(fpm_clk)
		    );

    ME_FD1 rgstrX2 (
		    .q(passX2),
		    .d(passX1),
		    .cp(fpm_clk)
		    );

    ME_FD1 rgstrX3 (
		    .q(passX3),
		    .d(passX2),
		    .cp(fpm_clk)
		    );

wire [52:0] opx_m, opy_m ;

    //
    // Operand select (single/double) muxes
    //

		// single precision operand X has 15 trailing pad zeros
    ME_MUX3_53 opxmux (
			opx_m[52:0],
			fpm_inst[0], fpm_inst[1],

			{GND, GND, GND, GND, GND, GND, GND, GND,  // FMULs
			 GND, GND, GND, GND, GND, GND,
			 VDD, rs1_m[54:32],
			 GND, GND, GND, GND, GND, GND, GND, GND,
			 GND, GND, GND, GND, GND, GND, GND},

			{VDD, rs1_m[51:0]},			  // FMULd

			{VDD, rs1_m[54:32],  GND, GND, GND, GND,  // FsMULd
			 GND, GND, GND, GND, GND, GND, GND, GND,
			 GND, GND, GND, GND, GND, GND, GND, GND,
			 GND, GND, GND, GND, GND, GND, GND, GND,
			 GND}
		      );
    

		// single precision operand Y has 14 trailing pad zeros
		// opymux_lo muxes in the high 25-bits for passX2 in array
    ME_MUX3_25  opymux_hi ( opy_m[52:28],
			    fpm_inst[0], fpm_inst[1],
			    {GND, GND, GND, GND, GND, GND, GND, GND,  // FMULs
			     GND, GND, GND, GND, GND, GND, GND,
			     VDD, rs2_m[54:46] },

			    {VDD, rs2_m[51:28] },		      // FMULd

			    {VDD, rs2_m[54:32], GND }	  	      // FsMULd
			  );

    wire [1:0] opymux_lo_ctl ;
    assign opymux_lo_ctl[0] = fpm_inst[0] | passX1 ;
    assign opymux_lo_ctl[1] = fpm_inst[1] | passX1 ;

    ME_MUX41H28 opymux_lo ( opy_m[27:0],
			    {rs2_m[45:32],			      // FMULs
			     GND, GND, GND, GND, GND, GND, GND, GND,
			     GND, GND, GND, GND, GND, GND },

			    rs2_m[27:0],			      // FMULd

			    {GND, GND, GND, GND, GND, GND, GND, GND,  // FsMULd
			     GND, GND, GND, GND, GND, GND, GND, GND,
			     GND, GND, GND, GND, GND, GND, GND, GND,
			     GND, GND, GND, GND },

			    {GND, GND, GND, rs2_mX12[52:28] },	      // passX2

			    opymux_lo_ctl[0], opymux_lo_ctl[1]
			  );


						// FMULd or FsMULd
    wire res_dbl = fpm_inst[0] | fpm_inst[1] ;

    //
    // stage X1, X2
    //

    ME_FD1E dblReg (
		  .q(res_dblX123),
		  .d(res_dbl),
		  .te(fpm_start),
		  .cp(fpm_clk)
		  );

    ME_FREGA_1_54 xReg (
		  .Q( {rs1_sX12, rs1_mX12[52:0]} ),
		  .D( {rs1_s, opx_m[52:0]} ),
		  .enable(fpm_start),
		  .clk(fpm_clk)
		  );

    ME_FREGA_1_26 yReg_hi (					// yReg[53:28]
		  .Q( {rs2_sX12, rs2_mX12[52:28]} ),
		  .D( {rs2_s, opy_m[52:28]} ),
		  .enable(fpm_start),
		  .clk(fpm_clk)
		  );

    wire yReg_lo_en = fpm_start | passX1 ;

    ME_FREGA_1_28 yReg_lo (					// yReg[27:0]
		  .Q( rs2_mX12[27:0] ),
		  .D( opy_m[27:0] ),
		  .enable(yReg_lo_en),
		  .clk(fpm_clk)
		  );

    array array (
		 sum[79:0],
		 carry[79:1],
		 rs1_mX12[52:0],
		 rs2_mX12[27:0],
		 passX2,
		 sumX12[79:28],
		 carryX12[79:28]
		 );


    ME_FDREG_1_57 sumReg (
		    .Q( sumX12[79:23] ),
		    .D( sum[79:23] ),
		    .clk(fpm_clk)
		    );

    ME_FDREG_1_57 carryReg (
		      .Q( carryX12[79:23] ),
		      .D( carry[79:23] ),
		      .clk(fpm_clk)
		      );

    //
    // sign generation
    //
    sign signLogic (
	       signX3,
	       rs1_sX12,
	       rs2_sX12,
	       passX2,
	       fpm_clk
	       );


    //
    // sticky bit
    //
    sticky stickyLogic (
			stickyX3,
			sum[27:0],
			passX1,
			fpm_clk
			);

    //
    // carry 51
    //
    carry51 carry51Logic (
			  c51X3,
			  sum[27:0],
			  carry[27:1],
			  passX1,
			  fpm_clk
			  );

    //
    // stage X3
    //

    //
    // recode using half-adders
    //
    half_adder55 half_adder55 (
	       sumX3[105:51],
	       carryX3[105:52],
	       sumX12[77:23],
	       carryX12[77:23]
	       );

    final_adder
	final_adder (
		     mantissa[52:0],
		     man_inx,
		     frac_ovf,		// fraction overflow (mantissa >= 2.0)
		     sumX3[105:51],
		     carryX3[105:52],
		     rnd_mode[1:0],
		     signX3,
		     stickyX3,
		     c51X3,
		     res_dblX123
		     );

    ME_FREGA_1_52 ZReg (
		  .Q( fpm_frac[51:0] ),
		  .D( mantissa[51:0] ),	// mantissa[52] is the implicit 1
		  .enable(passX3),
		  .clk(fpm_clk)
		  );

    ME_FD1E inxReg (			// register the inexact status bit
		  .q(fpm_inx),
		  .d(man_inx),
		  .te(passX3),
		  .cp(fpm_clk)
		  );

endmodule
HierarchyFilesModulesSignalsTasksFunctionsHelp

This page: Created:Thu Aug 19 12:00:33 1999
From: ../../../sparc_v8/ssparc/fpu/fp_fpm/rtl/fpm_frac.v

Verilog converted to html by v2html 5.0 (written by Costas Calamvokis).Help