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

Subversion Repositories aemb

[/] [aemb/] [branches/] [AEMB2_712/] [rtl/] [verilog/] [aeMB_bpcu.v] - Diff between revs 41 and 44

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

Rev 41 Rev 44
Line 1... Line 1...
// $Id: aeMB_bpcu.v,v 1.1 2007-11-02 03:25:39 sybreon Exp $
// $Id: aeMB_bpcu.v,v 1.2 2007-11-02 19:20:58 sybreon Exp $
//
//
// AEMB BRANCH PROGRAMME COUNTER UNIT
// AEMB BRANCH PROGRAMME COUNTER 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 18... Line 18...
// License along with this library; if not, write to the Free Software
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA
// USA
//
//
// $Log: not supported by cvs2svn $
// $Log: not supported by cvs2svn $
 
// Revision 1.1  2007/11/02 03:25:39  sybreon
 
// New EDK 3.2 compatible design with optional barrel-shifter and multiplier.
 
// Fixed various minor data hazard bugs.
 
// Code compatible with -O0/1/2/3/s generated code.
 
//
 
 
module aeMB_bpcu (/*AUTOARG*/
module aeMB_bpcu (/*AUTOARG*/
   // Outputs
   // Outputs
   iwb_adr_o, rPC, rPCLNK, rBRA, rDLY,
   iwb_adr_o, rPC, rPCLNK, rBRA, rDLY, rATOM,
   // Inputs
   // Inputs
   rMXALT, rOPC, rRD, rRA, rRESULT, rDWBDI, rREGA, rXCE, gclk, grst,
   rMXALT, rOPC, rRD, rRA, rRESULT, rDWBDI, rREGA, rXCE, gclk, grst,
   gena
   gena
   );
   );
   parameter IW = 24;
   parameter IW = 24;
Line 35... Line 40...
 
 
   // INTERNAL
   // INTERNAL
   output [31:2]   rPC, rPCLNK;
   output [31:2]   rPC, rPCLNK;
   output          rBRA;
   output          rBRA;
   output          rDLY;
   output          rDLY;
 
   output [1:0]    rATOM;
   input [1:0]      rMXALT;
   input [1:0]      rMXALT;
   input [5:0]      rOPC;
   input [5:0]      rOPC;
   input [4:0]      rRD, rRA;
   input [4:0]      rRD, rRA;
   input [31:0]    rRESULT; // ALU
   input [31:0]    rRESULT; // ALU
   input [31:0]    rDWBDI; // RAM
   input [31:0]    rDWBDI; // RAM
Line 46... Line 52...
   input [1:0]      rXCE;
   input [1:0]      rXCE;
 
 
   // SYSTEM
   // SYSTEM
   input           gclk, grst, gena;
   input           gclk, grst, gena;
 
 
   // BRANCH
   // --- BRANCH CONTROL --------------------------------------------
 
   // Controls the branch and delay flags
 
 
   wire            fRTD = (rOPC == 6'o55);
   wire            fRTD = (rOPC == 6'o55);
   wire            fBCC = (rOPC == 6'o47) | (rOPC == 6'o57);
   wire            fBCC = (rOPC == 6'o47) | (rOPC == 6'o57);
   wire            fBRU = (rOPC == 6'o46) | (rOPC == 6'o56);
   wire            fBRU = (rOPC == 6'o46) | (rOPC == 6'o56);
 
 
   wire [31:0]      wREGA;
   wire [31:0]      wREGA;
Line 76... Line 84...
       3'o4: xXCC <= wBGT;
       3'o4: xXCC <= wBGT;
       3'o5: xXCC <= wBGE;
       3'o5: xXCC <= wBGE;
       default: xXCC <= 1'bX;
       default: xXCC <= 1'bX;
     endcase // case (rRD[2:0])
     endcase // case (rRD[2:0])
 
 
   // DELAY SLOT
 
   reg             rBRA, xBRA;
   reg             rBRA, xBRA;
   reg             rDLY, xDLY;
   reg             rDLY, xDLY;
   wire            fSKIP = rBRA & !rDLY;
   wire            fSKIP = rBRA & !rDLY;
 
 
   always @(/*AUTOSENSE*/fBCC or fBRU or fRTD or rBRA or rRA or rRD
   always @(/*AUTOSENSE*/fBCC or fBRU or fRTD or rBRA or rRA or rRD
            or xXCC)
            or rXCE or xXCC)
     if (rBRA) begin
     if (rBRA | |rXCE) begin
        /*AUTORESET*/
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
        // Beginning of autoreset for uninitialized flops
        xBRA <= 1'h0;
        xBRA <= 1'h0;
        xDLY <= 1'h0;
        xDLY <= 1'h0;
        // End of automatics
        // End of automatics
     end else begin
     end else begin
        xDLY <= (fBRU & rRA[4]) | (fBCC & rRD[4]) | fRTD;
        xDLY <= (fBRU & rRA[4]) | (fBCC & rRD[4]) | fRTD;
        xBRA <= (fRTD | fBRU) ? 1'b1 :
        xBRA <= (fRTD | fBRU) ? 1'b1 :
                (fBCC) ? xXCC :
                (fBCC) ? xXCC :
                1'b0;
                1'b0;
        /*
 
        case (rXCE)
 
          2'o1: xBRA <= 1'b0;
 
          default: xBRA <= (fRTD | fBRU) ? 1'b1 :
 
                           (fBCC) ? xXCC :
 
                           1'b0;
 
        endcase // case (rXCE)
 
         */
 
     end
     end
 
 
   reg [31:2] rPCLNK, xPCLNK;
   // --- PC PIPELINE ------------------------------------------------
   always @(/*AUTOSENSE*/fSKIP or rBRA or rPC or rRESULT)
   // PC and related changes
     if (fSKIP) begin
 
        /*AUTORESET*/
 
        // Beginning of autoreset for uninitialized flops
 
        xPCLNK <= 30'h0;
 
        // End of automatics
 
     end else begin
 
        xPCLNK <= (rBRA) ? rRESULT[31:2] : rPC;
 
     end
 
 
 
   // PC Changes - (NXT, BRA, INT)
 
   reg [31:2]      rIPC, xIPC;
   reg [31:2]      rIPC, xIPC;
   reg [31:2]      rPC, xPC;
   reg [31:2]      rPC, xPC;
 
   reg [31:2]      rPCLNK, xPCLNK;
 
 
   assign          iwb_adr_o = rIPC[IW-1:2];
   assign          iwb_adr_o = rIPC[IW-1:2];
   always @(/*AUTOSENSE*/rBRA or rIPC or rRESULT) begin
 
      xIPC <= (rBRA) ? rRESULT[31:2] : (rIPC + 1);
   always @(/*AUTOSENSE*/rATOM or rBRA or rIPC or rPC or rRESULT
      /*
            or rXCE) begin
      case (rXCE)
      xPCLNK <= (^rATOM) ? rPC : rPC;
        2'o1: xIPC <= 32'h04;
      //xPCLNK <= rPC;
        default: xIPC <= (rBRA) ? rRESULT[31:2] : (rIPC + 1);
      //xPC <= (^rATOM) ? rIPC : rRESULT[31:2]; 
      endcase // case (rXCE)
 
       */
 
      xPC <= rIPC;
      xPC <= rIPC;
 
      //xIPC <= (rBRA) ? rRESULT[31:2] : (rIPC + 1);
 
     case (rXCE)
 
       2'o1: xIPC <= 30'h2;
 
       2'o2: xIPC <= 30'h4;
 
       2'o3: xIPC <= 30'h6;
 
       default: xIPC <= (rBRA) ? rRESULT[31:2] : (rIPC + 1);
 
     endcase // case (rXCE)      
   end
   end
 
 
 
   // --- ATOMIC CONTROL ---------------------------------------------
 
   // This is used to indicate 'safe' instruction borders.
 
 
 
   wire         wIMM = (rOPC == 6'o54) & !fSKIP;
 
   wire         wRTD = (rOPC == 6'o55) & !fSKIP;
 
   wire         wBCC = xXCC & ((rOPC == 6'o47) | (rOPC == 6'o57)) & !fSKIP;
 
   wire         wBRU = ((rOPC == 6'o46) | (rOPC == 6'o56)) & !fSKIP;
 
 
 
   wire         fATOM = ~(wIMM | wRTD | wBCC | wBRU | rBRA);
 
   reg [1:0]     rATOM, xATOM;
 
 
 
   always @(/*AUTOSENSE*/fATOM or rATOM)
 
     xATOM <= {rATOM[0], (rATOM[0] ^ fATOM)};
 
 
 
 
 
   // --- SYNC PIPELINE ----------------------------------------------
 
 
   // SYNC
 
   always @(posedge gclk)
   always @(posedge gclk)
     if (grst) begin
     if (grst) begin
        /*AUTORESET*/
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
        // Beginning of autoreset for uninitialized flops
 
        rATOM <= 2'h0;
        rBRA <= 1'h0;
        rBRA <= 1'h0;
        rDLY <= 1'h0;
        rDLY <= 1'h0;
        rIPC <= 30'h0;
        rIPC <= 30'h0;
        rPC <= 30'h0;
        rPC <= 30'h0;
        rPCLNK <= 30'h0;
        rPCLNK <= 30'h0;
Line 149... Line 161...
        rIPC <= #1 xIPC;
        rIPC <= #1 xIPC;
        rBRA <= #1 xBRA;
        rBRA <= #1 xBRA;
        rPC <= #1 xPC;
        rPC <= #1 xPC;
        rPCLNK <= #1 xPCLNK;
        rPCLNK <= #1 xPCLNK;
        rDLY <= #1 xDLY;
        rDLY <= #1 xDLY;
 
        rATOM <= #1 xATOM;
     end
     end
 
 
   // synopsys translate_off
 
 
 
 
 
   // synopsys translate_on
 
 
 
endmodule // aeMB_bpcu
endmodule // aeMB_bpcu
 
 
 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.