OpenCores
URL https://opencores.org/ocsvn/aemb/aemb/trunk

Subversion Repositories aemb

[/] [aemb/] [branches/] [DEV_SYBREON/] [rtl/] [verilog/] [aeMB2_aslu.v] - Diff between revs 80 and 81

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 80 Rev 81
Line 1... Line 1...
/* $Id: aeMB2_aslu.v,v 1.2 2007-12-12 19:16:59 sybreon Exp $
/* $Id: aeMB2_aslu.v,v 1.3 2007-12-13 20:12:11 sybreon Exp $
**
**
** AEMB2 INTEGER ARITHMETIC SHIFT LOGIC UNIT
** AEMB2 INTEGER ARITHMETIC SHIFT LOGIC UNIT
**
**
** Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
** Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
**
**
Line 21... Line 21...
*/
*/
 
 
module aeMB2_aslu (/*AUTOARG*/
module aeMB2_aslu (/*AUTOARG*/
   // Outputs
   // Outputs
   dwb_adr_o, dwb_sel_o, rSEL_MA, cwb_adr_o, cwb_tga_o, cwb_sel_o,
   dwb_adr_o, dwb_sel_o, rSEL_MA, cwb_adr_o, cwb_tga_o, cwb_sel_o,
   rMUL_MA, rRES_MA, rRES_EX, rMSR_IE, rMSR_BE, rMSR_TXE, rMSR_BIP,
   iwb_tga_o, dwb_tga_o, rMUL_MA, rRES_MA, rRES_EX, rMSR_IE, rMSR_BE,
 
   rMSR_BIP,
   // Inputs
   // Inputs
   rIMM_OF, rALU_OF, rOPC_OF, rOPC_IF, rRA_OF, rRD_OF, rOPA_OF,
   rIMM_OF, rALU_OF, rOPC_OF, rOPC_IF, rRA_OF, rRD_OF, rOPA_OF,
   rOPB_OF, pha_i, clk_i, rst_i, ena_i
   rOPB_OF, pha_i, clk_i, rst_i, ena_i
   );
   );
 
 
Line 44... Line 45...
   // FSL
   // FSL
   output [6:2]     cwb_adr_o;
   output [6:2]     cwb_adr_o;
   output [1:0]     cwb_tga_o;
   output [1:0]     cwb_tga_o;
   output [3:0]     cwb_sel_o;
   output [3:0]     cwb_sel_o;
 
 
 
   // CACHE ENABLE
 
   output           iwb_tga_o,
 
                    dwb_tga_o;
 
 
   // PIPELINE
   // PIPELINE
   output [31:0]    rMUL_MA;
   output [31:0]    rMUL_MA;
   output [31:0]    rRES_MA,
   output [31:0]    rRES_MA,
                    rRES_EX;
                    rRES_EX;
 
 
   output           rMSR_IE,
   output           rMSR_IE,
                    rMSR_BE,
                    rMSR_BE,
                    rMSR_TXE,
                    //rMSR_TXE,
 
                    //rMSR_DCE,
 
                    //rMSR_ICE,             
                    rMSR_BIP;
                    rMSR_BIP;
 
 
   input [15:0]     rIMM_OF;
   input [15:0]     rIMM_OF;
   input [2:0]       rALU_OF;
   input [2:0]       rALU_OF;
   input [5:0]       rOPC_OF,
   input [5:0]       rOPC_OF,
Line 78... Line 85...
   reg [6:2]            cwb_adr_o;
   reg [6:2]            cwb_adr_o;
   reg [3:0]             cwb_sel_o;
   reg [3:0]             cwb_sel_o;
   reg [1:0]             cwb_tga_o;
   reg [1:0]             cwb_tga_o;
   reg [DWB-1:2]        dwb_adr_o;
   reg [DWB-1:2]        dwb_adr_o;
   reg [3:0]             dwb_sel_o;
   reg [3:0]             dwb_sel_o;
 
   reg                  dwb_tga_o;
 
   reg                  iwb_tga_o;
   reg                  rMSR_BE;
   reg                  rMSR_BE;
   reg                  rMSR_BIP;
   reg                  rMSR_BIP;
   reg                  rMSR_IE;
   reg                  rMSR_IE;
   reg                  rMSR_TXE;
 
   reg [31:0]            rMUL_MA;
   reg [31:0]            rMUL_MA;
   reg [31:0]            rRES_EX;
   reg [31:0]            rRES_EX;
   reg [31:0]            rRES_MA;
   reg [31:0]            rRES_MA;
   reg [3:0]             rSEL_MA;
   reg [3:0]             rSEL_MA;
   // End of automatics
   // End of automatics
 
 
   reg                  rMSR_C0,
   reg                  rMSR_C0,
                        rMSR_C1,
                        rMSR_C1,
 
                        rMSR_C,
                        rMSR_CL[0:1];
                        rMSR_CL[0:1];
 
 
 
 
   wire [4:0]            rRD = rRD_OF;
   wire [4:0]            rRD = rRD_OF;
   wire [31:0]           rOPA = rOPA_OF;
   wire [31:0]           rOPA = rOPA_OF;
Line 102... Line 111...
   wire [4:0]            rRA = rRA_OF;
   wire [4:0]            rRA = rRA_OF;
   wire [15:0]           rIMM = rIMM_OF;
   wire [15:0]           rIMM = rIMM_OF;
   wire [10:0]           rALT = rIMM_OF[10:0];
   wire [10:0]           rALT = rIMM_OF[10:0];
 
 
   /*
   /*
 
    MSR REGISTER
 
 
 
    We should keep common configuration bits in the lower 16-bits of
 
    the MSR in order to avoid using the IMMI instruction.
 
 
 
    MSR bits
 
    31 - CC (carry copy)
 
 
 
    10 - HTE (hardware thread enabled)
 
     9 - PHA (current phase)
 
     8 - TXE (enable threads)
 
 
 
     7 - DCE (data cache enable)
 
     5 - ICE (instruction cache enable)
 
     4 - FSL (FSL available)
 
 
 
     3 - BIP (break in progress)
 
     2 - C (carry flag)
 
     1 - IE (interrupt enable)
 
     0 - BE (bus-lock enable)
 
 
 
    */
 
 
 
   wire [31:0]           wMSR = {rMSR_C, // MSR_CC
 
 
 
                                20'd0, // Reserved
 
 
 
                                TXE[0], // (PVR)
 
                                pha_i, // (EIP)
 
                                TXE[0], // (EE)
 
 
 
                                dwb_tga_o, // MSR_DCE
 
                                1'b0, // reserved for DZ
 
                                iwb_tga_o, // MSR_ICE
 
                                FSL[0], // GET/PUT available
 
 
 
                                rMSR_BIP, // MSR_BIP
 
                                rMSR_C, // MSR_C
 
                                rMSR_IE, // MSR_IE
 
                                rMSR_BE}; // MSR_BE
 
 
 
 
 
   /*
    C SELECTOR
    C SELECTOR
 
 
    Preselects the C in the OF stage to speed things up.  */
    Preselects the C to speed things up.  */
 
 
   // TODO: Optimise
   // TODO: Optimise
 
 
   wire                 wMSR_CX, wMSR_C;
   wire                 wMSR_CX, wMSR_C;
   assign               wMSR_CX = (pha_i) ? rMSR_C0 :
   assign               wMSR_CX = (pha_i) ? rMSR_C0 : rMSR_C1;
                                  (TXE) ? rMSR_C1 : 1'bX;
 
 
 
   assign               wMSR_C = (rOPC_IF == 6'o44) & wMSR_CX | // SRX
   assign               wMSR_C = (rOPC_IF == 6'o44) & wMSR_CX | // SRX
                                 (rOPC_IF[5:4] == 2'o0) & rOPC_IF[1] & wMSR_CX | // ADDC/RSUBC
                                 (rOPC_IF[5:4] == 2'o0) & rOPC_IF[1] & wMSR_CX | // ADDC/RSUBC
                                 (rOPC_IF[5:4] == 2'o0) & (rOPC_IF[1:0] == 2'o1); // RSUB
                                 (rOPC_IF[5:4] == 2'o0) & (rOPC_IF[1:0] == 2'o1); // RSUB
 
 
   reg                  rMSR_C;
 
 
 
   always @(posedge clk_i)
   always @(posedge clk_i)
     if (rst_i) begin
     if (rst_i) begin
        /*AUTORESET*/
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
        // Beginning of autoreset for uninitialized flops
        rMSR_C <= 1'h0;
        rMSR_C <= 1'h0;
Line 200... Line 248...
 
 
   always @(/*AUTOSENSE*/rIMM or rMSR_C or rOPA)
   always @(/*AUTOSENSE*/rIMM or rMSR_C or rOPA)
     rRES_SFTC <= (&rIMM[6:5]) ? rMSR_C : rOPA[0];
     rRES_SFTC <= (&rIMM[6:5]) ? rMSR_C : rOPA[0];
 
 
   /*
   /*
    MOVE FROM SPECIAL
    MOVER
 
 
    MSR bits
 
    31 - CC (carry copy)
 
    30 - PHA (current phase)
 
    29 - TXE (enable second thread)
 
 
 
     3 - BIP (break in progress)
 
     2 - C (carry flag)
 
     1 - IE (interrupt enable)
 
     0 - BE (bus-lock enable)
 
    */
    */
 
 
   wire                 wTXE = (TXE) ? 1'b1 : 1'b0;
 
   wire [31:0]           wMSR = {rMSR_C, // MSR_CC               
 
                                pha_i, // Current phase
 
                                rMSR_TXE, // Thread Execution Enabled
 
                                wTXE,
 
                                4'h0, // Reserved
 
                                8'hAE, // Vendor
 
                                8'h32, // Version
 
                                4'h0, // Reserved
 
                                rMSR_BIP, // MSR_BIP
 
                                rMSR_C, // MSR_C
 
                                rMSR_IE, // MSR_IE
 
                                rMSR_BE}; // MSR_BE
 
 
 
   wire                 fMFSR = (rOPC == 6'o45) & !rIMM[14] & rIMM[0];
   wire                 fMFSR = (rOPC == 6'o45) & !rIMM[14] & rIMM[0];
   wire                 fMFPC = (rOPC == 6'o45) & !rIMM[14] & !rIMM[0];
   wire                 fMFPC = (rOPC == 6'o45) & !rIMM[14] & !rIMM[0];
   reg [31:0]            rRES_MOV;
   reg [31:0]            rRES_MOV;
 
 
   always @(/*AUTOSENSE*/fMFSR or rOPA or rOPB or rRA or wMSR)
   always @(/*AUTOSENSE*/fMFSR or rOPA or rOPB or rRA or wMSR)
     rRES_MOV <= (fMFSR) ? wMSR :
     case ({fMFSR, rRA[3]})
                 //(fMFPC) ? rOPA :
       2'o0: rRES_MOV <= rOPA; // MFS rpc
                 (rRA[3]) ? rOPB :
       2'o1: rRES_MOV <= rOPB; // BRA       
                 rOPA;
       2'o2: rRES_MOV <= wMSR; // MFS rmsr
 
       default: rRES_MOV <= 32'hX;
 
     endcase // case ({fMFSR, rRA[3]})
 
   //rRES_MOV <= (fMFSR) ? wMSR : //(fMFPC) ? rOPA : (rRA[3]) ? rOPB :  rOPA;   
 
 
   /*
   /*
    MULTIPLIER
    MULTIPLIER
 
 
    Implemented as a 2-stage multiplier in order to increase clock
    Implemented as a 2-stage multiplier in order to increase clock
    speed. */
    speed. */
 
 
   reg [31:0]        rRES_MUL;
   reg [31:0]        rRES_MUL;
   always @(posedge clk_i) begin
   always @(posedge clk_i) begin
      rMUL_MA <= (MUL) ? rRES_MUL : 32'hX;
      rMUL_MA <= #1 rRES_MUL;
      rRES_MUL <= (MUL) ? (rOPA * rOPB) : 32'hX;
      rRES_MUL <= #1 (rOPA * rOPB);
   end
   end
 
 
   /*
   /*
    BARREL SHIFTER
    BARREL SHIFTER
 
 
    This can be potentially made 2-stage to increase clock
    This can be potentially made 2-stage if it is a
    speed. Doesn't seem necessary at the moment as the critical path
    bottleneck. Doesn't seem necessary at the moment as the critical
    runs through the adder. */
    path runs through the adder. */
 
 
   reg [31:0]     rRES_BSF;
   reg [31:0]     rRES_BSF;
   reg [31:0]     xBSRL, xBSRA, xBSLL;
   reg [31:0]     xBSRL, xBSRA, xBSLL;
 
 
   /* logical left barrel shifter */
   /* logical left barrel shifter */
Line 312... Line 340...
       2'd1: rRES_BSF <= xBSRA;
       2'd1: rRES_BSF <= xBSRA;
       2'd2: rRES_BSF <= xBSLL;
       2'd2: rRES_BSF <= xBSLL;
       default: rRES_BSF <= 32'hX;
       default: rRES_BSF <= 32'hX;
     endcase // case (rALT[10:9])
     endcase // case (rALT[10:9])
 
 
 
 
   /*
   /*
    MSR REGISTER
    MSR REGISTER
 
 
    Move data to the MSR or change due to break/returns. */
    Move data to the MSR or change due to break/returns. */
 
 
Line 343... Line 370...
        /*AUTORESET*/
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
        // Beginning of autoreset for uninitialized flops
        rMSR_C0 <= 1'h0;
        rMSR_C0 <= 1'h0;
        rMSR_C1 <= 1'h0;
        rMSR_C1 <= 1'h0;
        // End of automatics
        // End of automatics
     end else begin
     end else if (ena_i) begin
        if (pha_i & ena_i & rMSR_TXE)
        if (pha_i)
          rMSR_C1 <= #1 xMSR_C;
          rMSR_C1 <= #1 xMSR_C;
 
        else
        if (!pha_i & ena_i)
 
          rMSR_C0 <= #1 xMSR_C;
          rMSR_C0 <= #1 xMSR_C;
     end // else: !if(rst_i)
     end // else: !if(rst_i)
 
 
   // IE/BIP/BE
   // IE/BIP/BE
   wire             fRTID = (rOPC == 6'o55) & rRD[0];
   wire             fRTID = (rOPC == 6'o55) & rRD[0];
Line 361... Line 387...
 
 
   always @(posedge clk_i)
   always @(posedge clk_i)
     if (rst_i) begin
     if (rst_i) begin
        /*AUTORESET*/
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
        // Beginning of autoreset for uninitialized flops
 
        dwb_tga_o <= 1'h0;
 
        iwb_tga_o <= 1'h0;
        rMSR_BE <= 1'h0;
        rMSR_BE <= 1'h0;
        rMSR_BIP <= 1'h0;
        rMSR_BIP <= 1'h0;
        rMSR_IE <= 1'h0;
        rMSR_IE <= 1'h0;
        rMSR_TXE <= 1'h0;
 
        // End of automatics
        // End of automatics
     end else if (ena_i) begin
     end else if (ena_i) begin
 
 
        // Interrupt enable (compatible)
        // Interrupt enable (compatible)
        rMSR_IE <= #1
        rMSR_IE <= #1
Line 387... Line 414...
        // Forcibly assert dwb_cyc_o signal     
        // Forcibly assert dwb_cyc_o signal     
        rMSR_BE <= #1
        rMSR_BE <= #1
                   (fMTS) ? rOPA[0] : rMSR_BE;
                   (fMTS) ? rOPA[0] : rMSR_BE;
 
 
        // Enable the thread extension
        // Enable the thread extension
        rMSR_TXE <= #1
        //rMSR_TXE <= #1 TXE[0];        
                    (fMTS) ? rOPA[28] & TXE : rMSR_TXE;
 
 
        // Enable the caches
 
        dwb_tga_o <= #1 (fMTS) ?
 
                     rOPA[7] :
 
                     dwb_tga_o;
 
        iwb_tga_o <= #1 (fMTS) ?
 
                     rOPA[5] :
 
                     iwb_tga_o;
 
 
     end // if (ena_i)
     end // if (ena_i)
 
 
   /*
   /*
    RESULTS
    RESULTS
Line 458... Line 492...
        {cwb_adr_o, cwb_tga_o} <= #1 {rIMM_OF[4:0], rIMM_OF[15:14]};
        {cwb_adr_o, cwb_tga_o} <= #1 {rIMM_OF[4:0], rIMM_OF[15:14]};
        cwb_sel_o <= #1 {(4){ &rOPC[1:0]}};
        cwb_sel_o <= #1 {(4){ &rOPC[1:0]}};
 
 
     end // if (ena_i)
     end // if (ena_i)
 
 
 
 
   // synopsys translate_off
 
   integer r;
 
   initial begin
 
      for (r=0; r<TXE; r=r+1) begin
 
         rMSR_CL[r] <= $random;
 
      end
 
   end
 
   // synopsys translate_on
 
 
 
endmodule // aeMB2_aslu
endmodule // aeMB2_aslu
 
 
/* $Log: not supported by cvs2svn $
/* $Log: not supported by cvs2svn $
 
/* Revision 1.2  2007/12/12 19:16:59  sybreon
 
/* Minor optimisations (~10% faster)
 
/*
/* Revision 1.1  2007/12/11 00:43:17  sybreon
/* Revision 1.1  2007/12/11 00:43:17  sybreon
/* initial import
/* initial import
/* */
/* */
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.