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
|