Line 1... |
Line 1... |
// $Id: aeMB_ctrl.v,v 1.4 2007-11-08 17:48:14 sybreon Exp $
|
// $Id: aeMB_ctrl.v,v 1.5 2007-11-09 20:51:52 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.4 2007/11/08 17:48:14 sybreon
|
|
// Fixed data WISHBONE arbitration problem (reported by J Lee).
|
|
//
|
// Revision 1.3 2007/11/08 14:17:47 sybreon
|
// Revision 1.3 2007/11/08 14:17:47 sybreon
|
// Parameterised optional components.
|
// Parameterised optional components.
|
//
|
//
|
// Revision 1.2 2007/11/02 19:20:58 sybreon
|
// Revision 1.2 2007/11/02 19:20:58 sybreon
|
// Added better (beta) interrupt support.
|
// Added better (beta) interrupt support.
|
Line 33... |
Line 36... |
// Code compatible with -O0/1/2/3/s generated code.
|
// 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, dwb_stb_o,
|
rMXDST, rMXSRC, rMXTGT, rMXALT, rMXALU, rRW, rDWBSTB, rFSLSTB,
|
dwb_wre_o,
|
dwb_stb_o, dwb_wre_o, fsl_stb_o, fsl_wre_o,
|
// Inputs
|
// Inputs
|
rXCE, rDLY, rIMM, rALT, rOPC, rRD, rRA, rRB, rPC, rBRA, rMSR_IE,
|
rXCE, rDLY, rIMM, rALT, rOPC, rRD, rRA, rRB, rPC, rBRA, rMSR_IE,
|
dwb_ack_i, iwb_ack_i, gclk, grst, gena
|
dwb_ack_i, iwb_ack_i, fsl_ack_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 rFSLSTB;
|
|
|
input [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;
|
Line 64... |
Line 69... |
input dwb_ack_i;
|
input dwb_ack_i;
|
|
|
// INST WISHBONE
|
// INST WISHBONE
|
input iwb_ack_i;
|
input iwb_ack_i;
|
|
|
|
// FSL WISHBONE
|
|
output fsl_stb_o;
|
|
output fsl_wre_o;
|
|
input fsl_ack_i;
|
|
|
// SYSTEM
|
// SYSTEM
|
input gclk, grst, gena;
|
input gclk, grst, gena;
|
|
|
// --- DECODE INSTRUCTIONS
|
// --- DECODE INSTRUCTIONS
|
// TODO: Simplify
|
// TODO: Simplify
|
Line 89... |
Line 99... |
|
|
wire fLOD = ({rOPC[5:4],rOPC[2]} == 3'o6);
|
wire fLOD = ({rOPC[5:4],rOPC[2]} == 3'o6);
|
wire fSTR = ({rOPC[5:4],rOPC[2]} == 3'o7);
|
wire fSTR = ({rOPC[5:4],rOPC[2]} == 3'o7);
|
wire fLDST = (&rOPC[5:4]);
|
wire fLDST = (&rOPC[5:4]);
|
|
|
|
wire fPUT = (rOPC == 6'o33) & rRB[4];
|
|
wire fGET = (rOPC == 6'o33) & !rRB[4];
|
|
|
// --- OPERAND SELECTOR ---------------------------------
|
// --- OPERAND SELECTOR ---------------------------------
|
|
|
wire fRDWE = |rRW;
|
wire fRDWE = |rRW;
|
wire fAFWD_M = (rRW == rRA) & (rMXDST == 2'o2) & fRDWE;
|
wire fAFWD_M = (rRW == rRA) & (rMXDST == 2'o2) & fRDWE;
|
Line 128... |
Line 140... |
(fDIV) ? 3'o6 :
|
(fDIV) ? 3'o6 :
|
3'o0;
|
3'o0;
|
end
|
end
|
|
|
|
|
// --- RAM CONTROL ---------------------------------------
|
|
|
|
reg rDWBSTB, xDWBSTB;
|
|
reg rDWBWRE, xDWBWRE;
|
|
|
|
assign dwb_stb_o = rDWBSTB;
|
|
assign dwb_wre_o = rDWBWRE;
|
|
|
|
// --- DELAY SLOT REGISTERS ------------------------------
|
// --- DELAY SLOT REGISTERS ------------------------------
|
|
|
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);
|
wire fDACK = !(rDWBSTB ^ dwb_ack_i);
|
|
|
|
always @(/*AUTOSENSE*/fLOD or fSKIP or fSTR or iwb_ack_i or rXCE)
|
always @(/*AUTOSENSE*/fBCC or fBRU or fGET or fLOD or fRTD or fSKIP
|
if (fSKIP | |rXCE) begin
|
or fSTR or rRD or rXCE)
|
/*AUTORESET*/
|
|
// Beginning of autoreset for uninitialized flops
|
|
xDWBSTB <= 1'h0;
|
|
xDWBWRE <= 1'h0;
|
|
// End of automatics
|
|
end else begin
|
|
xDWBSTB <= (fLOD | fSTR) & iwb_ack_i;
|
|
xDWBWRE <= fSTR & iwb_ack_i;
|
|
end
|
|
|
|
always @(/*AUTOSENSE*/fBCC or fBRU or fLOD or fRTD or fSKIP or fSTR
|
|
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)
|
case (rXCE)
|
2'o2: xMXDST <= 2'o1;
|
2'o2: xMXDST <= 2'o1;
|
default: xMXDST <= (fSTR | fRTD | fBCC) ? 2'o3 :
|
default: xMXDST <= (fSTR | fRTD | fBCC) ? 2'o3 :
|
(fLOD) ? 2'o2 :
|
(fLOD | fGET) ? 2'o2 :
|
(fBRU) ? 2'o1 :
|
(fBRU) ? 2'o1 :
|
2'o0;
|
2'o0;
|
endcase
|
endcase
|
|
|
case (rXCE)
|
case (rXCE)
|
Line 182... |
Line 173... |
endcase
|
endcase
|
|
|
end // else: !if(fSKIP)
|
end // else: !if(fSKIP)
|
|
|
|
|
// --- PIPELINE CONTROL DELAY ----------------------------
|
// --- DATA WISHBONE ----------------------------------
|
|
|
always @(posedge gclk)
|
wire fDACK = !(rDWBSTB ^ dwb_ack_i);
|
if (grst) begin
|
|
|
reg rDWBSTB, xDWBSTB;
|
|
reg rDWBWRE, xDWBWRE;
|
|
|
|
assign dwb_stb_o = rDWBSTB;
|
|
assign dwb_wre_o = rDWBWRE;
|
|
|
|
|
|
always @(/*AUTOSENSE*/fLOD or fSKIP or fSTR or iwb_ack_i or rXCE)
|
|
if (fSKIP | |rXCE) begin
|
/*AUTORESET*/
|
/*AUTORESET*/
|
// Beginning of autoreset for uninitialized flops
|
// Beginning of autoreset for uninitialized flops
|
rMXDST <= 2'h0;
|
xDWBSTB <= 1'h0;
|
rRW <= 5'h0;
|
xDWBWRE <= 1'h0;
|
// End of automatics
|
// End of automatics
|
end else if (gena) begin
|
end else begin
|
//rPCLNK <= #1 xPCLNK;
|
xDWBSTB <= (fLOD | fSTR) & iwb_ack_i;
|
rMXDST <= #1 xMXDST;
|
xDWBWRE <= fSTR & iwb_ack_i;
|
rRW <= #1 xRW;
|
|
end
|
end
|
|
|
always @(posedge gclk)
|
always @(posedge gclk)
|
if (grst) begin
|
if (grst) begin
|
/*AUTORESET*/
|
/*AUTORESET*/
|
Line 210... |
Line 209... |
rDWBSTB <= #1 xDWBSTB;
|
rDWBSTB <= #1 xDWBSTB;
|
rDWBWRE <= #1 xDWBWRE;
|
rDWBWRE <= #1 xDWBWRE;
|
end
|
end
|
|
|
|
|
|
// --- FSL WISHBONE -----------------------------------
|
|
|
|
wire fFACK = !(rFSLSTB ^ fsl_ack_i);
|
|
|
|
reg rFSLSTB, xFSLSTB;
|
|
reg rFSLWRE, xFSLWRE;
|
|
|
|
assign fsl_stb_o = rFSLSTB;
|
|
assign fsl_wre_o = rFSLWRE;
|
|
|
|
always @(/*AUTOSENSE*/fGET or fPUT or fSKIP or iwb_ack_i or rXCE)
|
|
if (fSKIP | |rXCE) begin
|
|
/*AUTORESET*/
|
|
// Beginning of autoreset for uninitialized flops
|
|
xFSLSTB <= 1'h0;
|
|
xFSLWRE <= 1'h0;
|
|
// End of automatics
|
|
end else begin
|
|
xFSLSTB <= (fPUT | fGET) & iwb_ack_i;
|
|
xFSLWRE <= fPUT & iwb_ack_i;
|
|
end
|
|
|
|
always @(posedge gclk)
|
|
if (grst) begin
|
|
/*AUTORESET*/
|
|
// Beginning of autoreset for uninitialized flops
|
|
rFSLSTB <= 1'h0;
|
|
rFSLWRE <= 1'h0;
|
|
// End of automatics
|
|
end else if (fFACK) begin
|
|
rFSLSTB <= #1 xFSLSTB;
|
|
rFSLWRE <= #1 xFSLWRE;
|
|
end
|
|
|
|
// --- PIPELINE CONTROL DELAY ----------------------------
|
|
|
|
always @(posedge gclk)
|
|
if (grst) begin
|
|
/*AUTORESET*/
|
|
// Beginning of autoreset for uninitialized flops
|
|
rMXDST <= 2'h0;
|
|
rRW <= 5'h0;
|
|
// End of automatics
|
|
end else if (gena) begin
|
|
//rPCLNK <= #1 xPCLNK;
|
|
rMXDST <= #1 xMXDST;
|
|
rRW <= #1 xRW;
|
|
end
|
|
|
|
|
endmodule // aeMB_ctrl
|
endmodule // aeMB_ctrl
|
|
|
No newline at end of file
|
No newline at end of file
|