Line 1... |
Line 1... |
// $Id: aeMB_ctrl.v,v 1.9 2007-11-15 09:26:43 sybreon Exp $
|
// $Id: aeMB_ctrl.v,v 1.10 2007-11-30 16:44:40 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... |
//
|
//
|
// You should have received a copy of the GNU Lesser General Public
|
// You should have received a copy of the GNU Lesser General Public
|
// License along with AEMB. If not, see <http://www.gnu.org/licenses/>.
|
// License along with AEMB. If not, see <http://www.gnu.org/licenses/>.
|
//
|
//
|
// $Log: not supported by cvs2svn $
|
// $Log: not supported by cvs2svn $
|
|
// Revision 1.9 2007/11/15 09:26:43 sybreon
|
|
// Fixed minor typo causing synthesis failure.
|
|
//
|
// Revision 1.8 2007/11/14 23:19:24 sybreon
|
// Revision 1.8 2007/11/14 23:19:24 sybreon
|
// Fixed minor typo.
|
// Fixed minor typo.
|
//
|
//
|
// Revision 1.7 2007/11/14 22:14:34 sybreon
|
// Revision 1.7 2007/11/14 22:14:34 sybreon
|
// Changed interrupt handling system (reported by M. Ettus).
|
// Changed interrupt handling system (reported by M. Ettus).
|
Line 61... |
Line 64... |
//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 rFSLSTB;
|
|
|
|
//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 159... |
Line 159... |
reg [1:0] rMXALT, xMXALT;
|
reg [1:0] rMXALT, xMXALT;
|
|
|
|
|
// --- OPERAND SELECTOR ---------------------------------
|
// --- OPERAND SELECTOR ---------------------------------
|
|
|
/*
|
|
wire fRDWE = |rRW;
|
|
wire fAFWD_M = (rRW == rRA) & (rMXDST == 2'o2) & fRDWE;
|
|
wire fBFWD_M = (rRW == rRB) & (rMXDST == 2'o2) & fRDWE;
|
|
wire fAFWD_R = (rRW == rRA) & (rMXDST == 2'o0) & fRDWE;
|
|
wire fBFWD_R = (rRW == rRB) & (rMXDST == 2'o0) & fRDWE;
|
|
|
|
assign rMXSRC = (fBRU | fBCC) ? 2'o3 : // PC
|
|
(fAFWD_M) ? 2'o2: // RAM
|
|
(fAFWD_R) ? 2'o1: // FWD
|
|
2'o0; // REG
|
|
|
|
assign rMXTGT = (rOPC[3]) ? 2'o3 : // IMM
|
|
(fBFWD_M) ? 2'o2 : // RAM
|
|
(fBFWD_R) ? 2'o1 : // FWD
|
|
2'o0; // REG
|
|
|
|
assign rMXALT = (fAFWD_M) ? 2'o2 : // RAM
|
|
(fAFWD_R) ? 2'o1 : // FWD
|
|
2'o0; // REG
|
|
*/
|
|
|
|
wire wRDWE = |xRW;
|
wire wRDWE = |xRW;
|
wire wAFWD_M = (xRW == wRA) & (xMXDST == 2'o2) & wRDWE;
|
wire wAFWD_M = (xRW == wRA) & (xMXDST == 2'o2) & wRDWE;
|
wire wBFWD_M = (xRW == wRB) & (xMXDST == 2'o2) & wRDWE;
|
wire wBFWD_M = (xRW == wRB) & (xMXDST == 2'o2) & wRDWE;
|
wire wAFWD_R = (xRW == wRA) & (xMXDST == 2'o0) & wRDWE;
|
wire wAFWD_R = (xRW == wRA) & (xMXDST == 2'o0) & wRDWE;
|
wire wBFWD_R = (xRW == wRB) & (xMXDST == 2'o0) & wRDWE;
|
wire wBFWD_R = (xRW == wRB) & (xMXDST == 2'o0) & wRDWE;
|
Line 209... |
Line 187... |
(wBFWD_R) ? 2'o1 : // FWD
|
(wBFWD_R) ? 2'o1 : // FWD
|
2'o0; // REG
|
2'o0; // REG
|
xMXALT <= (wAFWD_M) ? 2'o2 : // RAM
|
xMXALT <= (wAFWD_M) ? 2'o2 : // RAM
|
(wAFWD_R) ? 2'o1 : // FWD
|
(wAFWD_R) ? 2'o1 : // FWD
|
2'o0; // REG
|
2'o0; // REG
|
end
|
end // else: !if(rBRA)
|
|
|
// --- ALU CONTROL ---------------------------------------
|
// --- ALU CONTROL ---------------------------------------
|
|
|
/*
|
|
reg [2:0] rMXALU;
|
|
always @(fBRA or fBSF or fDIV or fLOG or fMOV or fMUL
|
|
or fSFT) begin
|
|
rMXALU <= (fBRA | fMOV) ? 3'o3 :
|
|
(fSFT) ? 3'o2 :
|
|
(fLOG) ? 3'o1 :
|
|
(fMUL) ? 3'o4 :
|
|
(fBSF) ? 3'o5 :
|
|
(fDIV) ? 3'o6 :
|
|
3'o0;
|
|
end
|
|
*/
|
|
|
|
reg [2:0] rMXALU, xMXALU;
|
reg [2:0] rMXALU, xMXALU;
|
|
|
always @(/*AUTOSENSE*/rBRA or wBRA or wBSF or wDIV or wLOG or wMOV
|
always @(/*AUTOSENSE*/rBRA or wBRA or wBSF or wDIV or wLOG or wMOV
|
or wMUL or wSFT)
|
or wMUL or wSFT)
|
//if (rBRA | |rXCE) begin
|
//if (rBRA | |rXCE) begin
|
Line 245... |
Line 209... |
(wLOG) ? 3'o1 :
|
(wLOG) ? 3'o1 :
|
(wMUL) ? 3'o4 :
|
(wMUL) ? 3'o4 :
|
(wBSF) ? 3'o5 :
|
(wBSF) ? 3'o5 :
|
(wDIV) ? 3'o6 :
|
(wDIV) ? 3'o6 :
|
3'o0;
|
3'o0;
|
end
|
end // else: !if(rBRA)
|
|
|
// --- DELAY SLOT REGISTERS ------------------------------
|
// --- DELAY SLOT REGISTERS ------------------------------
|
|
|
wire fSKIP = (rBRA & !rDLY);
|
wire fSKIP = (rBRA & !rDLY);
|
|
|
Line 260... |
Line 224... |
// 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)
|
|
2'o2: xMXDST <= 2'o1;
|
|
default: xMXDST <= (fSTR | fRTD | fBCC) ? 2'o3 :
|
|
(fLOD | fGET) ? 2'o2 :
|
|
(fBRU) ? 2'o1 :
|
|
2'o0;
|
|
endcase
|
|
|
|
case (rXCE)
|
|
2'o2: xRW <= 5'd14;
|
|
default: xRW <= rRD;
|
|
endcase
|
|
*/
|
|
xMXDST <= (fSTR | fRTD | fBCC) ? 2'o3 :
|
xMXDST <= (fSTR | fRTD | fBCC) ? 2'o3 :
|
(fLOD | fGET) ? 2'o2 :
|
(fLOD | fGET) ? 2'o2 :
|
(fBRU) ? 2'o1 :
|
(fBRU) ? 2'o1 :
|
2'o0;
|
2'o0;
|
xRW <= rRD;
|
xRW <= rRD;
|
Line 367... |
Line 317... |
rMXDST <= 2'h0;
|
rMXDST <= 2'h0;
|
rMXSRC <= 2'h0;
|
rMXSRC <= 2'h0;
|
rMXTGT <= 2'h0;
|
rMXTGT <= 2'h0;
|
rRW <= 5'h0;
|
rRW <= 5'h0;
|
// End of automatics
|
// End of automatics
|
end else if (gena) begin
|
end else if (gena) begin // if (grst)
|
//rPCLNK <= #1 xPCLNK;
|
//rPCLNK <= #1 xPCLNK;
|
rMXDST <= #1 xMXDST;
|
rMXDST <= #1 xMXDST;
|
rRW <= #1 xRW;
|
rRW <= #1 xRW;
|
rMXSRC <= #1 xMXSRC;
|
rMXSRC <= #1 xMXSRC;
|
rMXTGT <= #1 xMXTGT;
|
rMXTGT <= #1 xMXTGT;
|