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

Subversion Repositories aemb

[/] [aemb/] [trunk/] [rtl/] [verilog/] [aeMB_ctrl.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_ctrl.v,v 1.1 2007-11-02 03:25:40 sybreon Exp $
// $Id: aeMB_ctrl.v,v 1.2 2007-11-02 19:20:58 sybreon Exp $
//
//
// AEMB CONTROL UNIT
// AEMB CONTROL 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:40  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_ctrl (/*AUTOARG*/
module aeMB_ctrl (/*AUTOARG*/
   // Outputs
   // Outputs
   rMXDST, rMXSRC, rMXTGT, rMXALT, rMXALU, rRW, rDWBSTB, rXCE,
   rMXDST, rMXSRC, rMXTGT, rMXALT, rMXALU, rRW, rDWBSTB, dwb_stb_o,
   dwb_stb_o, dwb_wre_o,
   dwb_wre_o,
   // Inputs
   // Inputs
   rDLY, rIMM, rALT, rOPC, rRD, rRA, rRB, rPC, rBRA, rMSR_IE, gclk,
   rXCE, rDLY, rIMM, rALT, rOPC, rRD, rRA, rRB, rPC, rBRA, rMSR_IE,
   grst, gena, sys_int_i
   gclk, grst, gena
   );
   );
   // INTERNAL   
   // INTERNAL   
   //output [31:2] rPCLNK;
   //output [31:2] rPCLNK;
   output [1:0]  rMXDST;
   output [1:0]  rMXDST;
   output [1:0]  rMXSRC, rMXTGT, rMXALT;
   output [1:0]  rMXSRC, rMXTGT, rMXALT;
   output [2:0]  rMXALU;
   output [2:0]  rMXALU;
   output [4:0]  rRW;
   output [4:0]  rRW;
   output        rDWBSTB;
   output        rDWBSTB;
   output [1:0]  rXCE;
   input [1:0]    rXCE;
   input         rDLY;
   input         rDLY;
   input [15:0]  rIMM;
   input [15:0]  rIMM;
   input [10:0]  rALT;
   input [10:0]  rALT;
   input [5:0]    rOPC;
   input [5:0]    rOPC;
   input [4:0]    rRD, rRA, rRB;
   input [4:0]    rRD, rRA, rRB;
Line 50... Line 55...
   output        dwb_stb_o;
   output        dwb_stb_o;
   output        dwb_wre_o;
   output        dwb_wre_o;
 
 
   // SYSTEM
   // SYSTEM
   input         gclk, grst, gena;
   input         gclk, grst, gena;
   input         sys_int_i;
 
 
 
   // --- DECODE INSTRUCTIONS
   // --- DECODE INSTRUCTIONS
   // TODO: Simplify
   // TODO: Simplify
 
 
   wire          fSFT = (rOPC == 6'o44);
   wire          fSFT = (rOPC == 6'o44);
Line 127... Line 131...
 
 
   reg [31:2]    rPCLNK, xPCLNK;
   reg [31:2]    rPCLNK, xPCLNK;
   reg [1:0]      rMXDST, xMXDST;
   reg [1:0]      rMXDST, xMXDST;
   reg [4:0]      rRW, xRW;
   reg [4:0]      rRW, xRW;
 
 
   wire          fSKIP = rBRA & !rDLY;
   wire          fSKIP = (rBRA & !rDLY);
 
 
   always @(/*AUTOSENSE*/fLOD or fSKIP or fSTR)
   always @(/*AUTOSENSE*/fLOD or fSKIP or fSTR or rXCE)
     if (fSKIP) begin
     if (fSKIP | |rXCE) begin
        /*AUTORESET*/
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
        // Beginning of autoreset for uninitialized flops
        xDWBSTB <= 1'h0;
        xDWBSTB <= 1'h0;
        xDWBWRE <= 1'h0;
        xDWBWRE <= 1'h0;
        // End of automatics
        // End of automatics
     end else begin
     end else begin
 
 
        xDWBSTB <= fLOD | fSTR;
        xDWBSTB <= fLOD | fSTR;
        xDWBWRE <= fSTR;
        xDWBWRE <= fSTR;
 
 
     end
     end
 
 
   always @(/*AUTOSENSE*/fBCC or fBRU or fLOD or fRTD or fSKIP or fSTR
   always @(/*AUTOSENSE*/fBCC or fBRU or fLOD or fRTD or fSKIP or fSTR
            or rRD)
            or rRD or rXCE)
     if (fSKIP) begin
     if (fSKIP) begin
        /*AUTORESET*/
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
        // Beginning of autoreset for uninitialized flops
        xMXDST <= 2'h0;
        xMXDST <= 2'h0;
        xRW <= 5'h0;
        xRW <= 5'h0;
        // End of automatics
        // End of automatics
     end else begin
     end else begin
 
        case (rXCE)
        //xPCLNK <= rPC;
          2'o2: xMXDST <= 2'o1;
 
          default: xMXDST <= (fSTR | fRTD | fBCC) ? 2'o3 :
        /*
 
        case (rXCE)
 
          2'o1: xMXDST <= 2'o1;
 
          default: xMXDST <= (fSTR | fRTD | fBCC) ? 2'o3 :
 
                             (fLOD) ? 2'o2 :
 
                             (fBRU) ? 2'o1 :
 
                             2'o0;
 
        endcase // case (rXCE)
 
 
 
        case (rXCE)
 
          2'o1: xRW <= 5'd14;
 
          default: xRW <= rRD;
 
        endcase // case (rXCE)
 
        */
 
 
 
        xMXDST <= (fSTR | fRTD | fBCC) ? 2'o3 :
 
                  (fLOD) ? 2'o2 :
                  (fLOD) ? 2'o2 :
                  (fBRU) ? 2'o1 :
                  (fBRU) ? 2'o1 :
                  2'o0;
                  2'o0;
 
        endcase
 
 
        xRW <= rRD;
 
 
 
     end
 
 
 
   // --- INTERRUPT CONTROL ---------------------------------
 
   wire         fNCLR;
 
   assign       fNCLR = (rOPC == 6'o46) | (rOPC == 6'o56) | // BRU
 
                        (rOPC == 6'o47) | (rOPC == 6'o57) | // BCC
 
                        (rOPC == 6'o55) | // RTD
 
                        (rOPC == 6'o54); // IMM
 
   reg [2:0]     rINT;
 
   reg [1:0]     rXCE, xXCE;
 
   //wire       fINT = rINT[0] & rINT[1] & !rINT[2] & rMSR_IE; // +Edge
 
   wire         fINT = rINT[2] & rMSR_IE;
 
 
 
   always @(/*AUTOSENSE*/fINT or fNCLR or rXCE)
 
     case (rXCE)
     case (rXCE)
       2'o0: xXCE <= (fINT & !fNCLR) ? 2'o1 : 2'o0;
          2'o2: xRW <= 5'd14;
       default: xXCE <= 2'o0;
          default: xRW <= rRD;
     endcase // case (rXCE)
        endcase
 
 
 
     end // else: !if(fSKIP)
 
 
   always @(posedge gclk)
 
     if (grst) begin
 
        /*AUTORESET*/
 
        // Beginning of autoreset for uninitialized flops
 
        rINT <= 3'h0;
 
        // End of automatics
 
     end else if (gena) begin
 
        rINT <= #1 {rINT[1:0], sys_int_i & rMSR_IE};
 
     end
 
 
 
   // --- PIPELINE CONTROL DELAY ----------------------------
   // --- PIPELINE CONTROL DELAY ----------------------------
 
 
   always @(posedge gclk)
   always @(posedge gclk)
     if (grst) begin
     if (grst) begin
Line 216... Line 180...
        // Beginning of autoreset for uninitialized flops
        // Beginning of autoreset for uninitialized flops
        rDWBSTB <= 1'h0;
        rDWBSTB <= 1'h0;
        rDWBWRE <= 1'h0;
        rDWBWRE <= 1'h0;
        rMXDST <= 2'h0;
        rMXDST <= 2'h0;
        rRW <= 5'h0;
        rRW <= 5'h0;
        rXCE <= 2'h0;
 
        // End of automatics
        // End of automatics
     end else if (gena) begin
     end else if (gena) begin
        //rPCLNK <= #1 xPCLNK;
        //rPCLNK <= #1 xPCLNK;
        rMXDST <= #1 xMXDST;
        rMXDST <= #1 xMXDST;
        rRW <= #1 xRW;
        rRW <= #1 xRW;
        rDWBSTB <= #1 xDWBSTB;
        rDWBSTB <= #1 xDWBSTB;
        rDWBWRE <= #1 xDWBWRE;
        rDWBWRE <= #1 xDWBWRE;
        rXCE <= #1 xXCE;
 
     end
     end
 
 
 
 
 
 
endmodule // aeMB_ctrl
endmodule // aeMB_ctrl
 
 
 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.