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.         */ 
/*                                                                            */ 
/******************************************************************************/ 
//  @(#)divlog.v	1.1  4/7/92
//
/* ############################################################
   divlog.v   1.0 6th September 1989
   DivLog Generation


   ############################################################ */


/* Divlog requires generation of DivMultiple From RemBits.
   The RemBits are signed.

                   Pos                Neg
   Div Multiple    0 1 2 2 3 3 3 3    3 3 3 3 2 2 1 0  Divisor 1.1
                   0 1 2 3 3 3 3 3    3 3 3 3 3 2 1 0  Divisor 1.0

   RemBits         0 0 0 0 0 0 0 0    1 1 1 1 1 1 1 1  RemBits[3]
                   0 0 0 0 1 1 1 1    0 0 0 0 1 1 1 1  RemBits[2]
                   0 0 1 1 0 0 1 1    0 0 1 1 0 0 1 1  RemBits[1]
                   0 1 0 1 0 1 0 1    0 1 0 1 0 1 0 1  RemBits[0]

   Therfore

   DivMultiple [3] 0 0 0 0 1 1 1 1    1 1 1 1 0 0 0 0
   Divisor=1   [2] 0 0 1 1 0 0 0 0    0 0 0 0 1 1 0 0
               [1] 0 1 0 0 0 0 0 0    0 0 0 0 0 0 1 0

   DivMultiple [3] 0 0 0 1 1 1 1 1    1 1 1 1 1 0 0 0
   Divisor=0   [2] 0 0 1 0 0 0 0 0    0 0 0 0 0 1 0 0
               [1] 0 1 0 0 0 0 0 0    0 0 0 0 0 0 1 0

   Which can be expressed

   DivMultiple [1] = ~RemBit[3].~RemBit[2].~RemBit[1].RemBit[0] +
                       RemBit[3].RemBit[2].RemBit[1].~RemBit[0];
   DivMultiple [2] = ~RemBit[3].~RemBit[2].RemBit[1].~RemBit[0] +
                     ~RemBit[3].~RemBit[2].RemBit[1].DivisorBit +
                      RemBit[3]. RemBit[2].~RemBit[1].RemBit[0] +
                      RemBit[3]. RemBit[2].~RemBit[1].DivisorBit;
   DivMultiple [3] = ~RemBit[3]. RemBit[2] +
                     ~RemBit[2]. RemBit[1]. RemBit[0].~DivisorBit +
                      RemBit[3].~RemBit[2] +
                      RemBit[2].~RemBit[1].~RemBit[0].~DivisorBit;

   The Quotient selection is made based on the previous trial multiple and the sign of the result of the trial
   The div multiple is recreated from the notDivMultiple[3:1] lines

   Div Multiple            -3    -2    -1    -0     0     1     2     3
   Sign of trial result    + -   + -   + -   + -   + -   + -   + -   + -
   Quotient bits generated 1 0   2 1   3 2   x 3   0 x   1 0   2 1   3 2

   Which can be expressed

   QuotientBit[1] = OldSign.DivMultiple[1].~DivMultiple[0].~NewSign +
                    OldSign.~DivMultiple[1] +
                    ~OldSign.DivMultiple[1].DivMultiple[0] +
                    ~OldSign.DivMultiple[1].~DivMultiple[0].~NewSign;
   QuotientBit[0] = DivMultiple[0] XOR NewSign;

   By multiplexing on the new sign

   QuotientBit0[1] = OldSign.DivMultiple[1].~DivMultiple[0] +
                    OldSign.~DivMultiple[1] +
                    ~OldSign.DivMultiple[1].DivMultiple[0] +
                    ~OldSign.DivMultiple[1].~DivMultiple[0].~NewSign;
   QuotientBit0[0] = DivMultiple[0];
   QuotientBit1[1] = OldSign.~DivMultiple +
                    ~OldSign.DivMultiple[1].DivMultiple[0];
   QuotientBit[0] = ~DivMultiple[0];

*/

[Up: frac_ctl divl]
module DivLog (Phi,
               AregFPMSBM1,        // Divisor Bit
               BregFPMSBM1,        // On first step divisor is in B
               StepRemBits,        // RemBits used during step
               InitialRemBits,     // RemBits used on first step
               SelectInitial,      // Select First step
               FracSign,           // Sign of result after operation
               DivMultiple,        // Latched version of Divide Step Multiple
               QuotientBits);      // Quotient bits, valid on cycle after
				   // operation
//   notFracSign);       // inv FracSign  -- generate inside fdp (dhn 03/27/91)

input Phi;                   // System Clock
input AregFPMSBM1, BregFPMSBM1, FracSign;
input [3:0] StepRemBits, InitialRemBits;
input SelectInitial;
output [3:1] DivMultiple;
output [1:0] QuotientBits;
// output notFracSign;		// -- generate inside fdp (dhn 03/27/91)

// ME_INVA ifs (FracSign, notFracSign); // --generate inside fdp (dhn 03/27/91)

wire [3:1] notDivMultiple, DivMultipleU;
wire [3:0] notRemBits;
wire [3:0] RemBits;

ME_NMUX2B msld (SelectInitial, AregFPMSBM1, BregFPMSBM1, notDivisorBit);
ME_NMUX2B msl0 (SelectInitial, StepRemBits[0], InitialRemBits[0], notRemBits[0]);
ME_NMUX2B msl1 (SelectInitial, StepRemBits[1], InitialRemBits[1], notRemBits[1]);
ME_NMUX2B msl2 (SelectInitial, StepRemBits[2], InitialRemBits[2], notRemBits[2]);
ME_NMUX2B msl3 (SelectInitial, StepRemBits[3], InitialRemBits[3], notRemBits[3]);

ME_INV_B ir3 (notRemBits[3], RemBits[3]);
ME_INV_B ir2 (notRemBits[2], RemBits[2]);
ME_INV_B ir1 (notRemBits[1], RemBits[1]);
ME_INV_B ir0 (notRemBits[0], RemBits[0]);
ME_INV_B id0 (notDivisorBit, DivisorBit);
  
//   DivMultiple [1] = ~RemBit[3].~RemBit[2].~RemBit[1].RemBit[0] +
//                       RemBit[3].RemBit[2].RemBit[1].~RemBit[0];

ME_NAND4 ds10 (notRemBits[3], notRemBits[2], notRemBits[1], RemBits[0],   dm1t0);
ME_NAND4 ds11 (RemBits[3], RemBits[2], RemBits[1], notRemBits[0],         dm1t1);
ME_NAND2 ds1m (dm1t1, dm1t0, DivMultipleU[1]);

//   DivMultiple [2] = ~RemBit[3].~RemBit[2].RemBit[1].~RemBit[0] +
//                     ~RemBit[3].~RemBit[2].RemBit[1].DivisorBit +
//                      RemBit[3]. RemBit[2].~RemBit[1].RemBit[0] +
//                      RemBit[3]. RemBit[2].~RemBit[1].DivisorBit;

ME_NAND4 ds20 (notRemBits[3], notRemBits[2], RemBits[1], notRemBits[0],   dm2t0);
ME_NAND4 ds21 (notRemBits[3], notRemBits[2], RemBits[1], DivisorBit,      dm2t1);
ME_NAND4 ds22 (RemBits[3], RemBits[2], notRemBits[1], RemBits[0],         dm2t2);
ME_NAND4 ds23 (RemBits[3], RemBits[2], notRemBits[1], DivisorBit,         dm2t3);
ME_NAND4 ds2m (dm2t1, dm2t0, dm2t2, dm2t3, DivMultipleU[2]);

//   DivMultiple [3] = ~RemBit[3]. RemBit[2] +
//                     ~RemBit[2]. RemBit[1]. RemBit[0].~DivisorBit +
//                      RemBit[3].~RemBit[2] +
//                      RemBit[2].~RemBit[1].~RemBit[0].~DivisorBit;

ME_NAND2 ds30 (notRemBits[3], RemBits[2],                               dm3t0);
ME_NAND4 ds31 (notRemBits[2], RemBits[1], RemBits[0], notDivisorBit,    dm3t1);
ME_NAND2 ds32 (RemBits[3], notRemBits[2],                               dm3t2);
ME_NAND4 ds33 (RemBits[2], notRemBits[1], notRemBits[0], notDivisorBit, dm3t3);
ME_NAND4 ds3m (dm3t1, dm3t0, dm3t2, dm3t3, DivMultipleU[3]);

/* ************************************************

   Latch next Div Multiple

   ************************************************ */

ME_FD1_B dv1 (Phi, DivMultipleU[1], DivMultiple[1], notDivMultiple[1]);
ME_FD1_B dv2 (Phi, DivMultipleU[2], DivMultiple[2], notDivMultiple[2]);
ME_FD1_B dv3 (Phi, DivMultipleU[3], DivMultiple[3], notDivMultiple[3]);
ME_FD1_B dv0 (Phi, notRemBits[3],      notOldSign,        OldSign);

/* ************************************************

   Quotient bit generation
   End of Result QuoBit Generation calculation

   ************************************************ */

/* Not time critical so use buffered DivMultiple */
/* Also use the encoded version of DivMultiple ie DivMultipleC */

wire [1:0] DivMultipleC, notDivMultipleC;

ME_NAND2 dedv0 (notDivMultiple[1], notDivMultiple[3], DivMultipleC[0]);
ME_NAND2 dedv1 (notDivMultiple[2], notDivMultiple[3], DivMultipleC[1]);
ME_INV_A dmb0 (DivMultipleC[0], notDivMultipleC[0]);
ME_INV_A dmb1 (DivMultipleC[1], notDivMultipleC[1]);

//   QuotientBit0[1] = OldSign.DivMultiple[1].~DivMultiple[0] +
//                    OldSign.~DivMultiple[1] +
//                    ~OldSign.DivMultiple[1];
//   QuotientBit1[1] = OldSign.~DivMultiple[1] +
//                    ~OldSign.DivMultiple[1].DivMultiple[0];

//   QuotientBit0[0] = DivMultiple[0];
//   QuotientBit1[0] = ~DivMultiple[0];

ME_NAND3 qb1t0 (OldSign, DivMultipleC[1], notDivMultipleC[0], t0);
ME_NAND2 qb1t1 (OldSign, notDivMultipleC[1],                  t1);
ME_NAND2 qb1t2 (notOldSign, DivMultipleC[1],                  t2);
ME_NAND3 qb1t3 (t0, t1, t2,                                   t3);
ME_NAND3 qb1t4 (notOldSign, DivMultipleC[1], DivMultipleC[0], t4);
ME_NAND2 qb1t5 (t4, t1,                                       t5);
ME_MUX2B qb1m (FracSign, t3, t5,                              QuotientBits[1]);

ME_NMUX2B qb0m (FracSign, notDivMultipleC[0], DivMultipleC[0], QuotientBits[0]);

endmodule
HierarchyFilesModulesSignalsTasksFunctionsHelp

This page: Created:Thu Aug 19 11:59:15 1999
From: ../../../sparc_v8/ssparc/fpu/fp_ctl/rtl/divlog.v

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