/* $Id: aeMB2_aslu.v,v 1.10 2008-04-11 15:53:43 sybreon Exp $
|
/* $Id: aeMB2_aslu.v,v 1.10 2008-04-11 15:53:43 sybreon Exp $
|
**
|
**
|
** AEMB2 INTEGER ARITHMETIC SHIFT LOGIC UNIT
|
** AEMB2 INTEGER ARITHMETIC SHIFT LOGIC 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>
|
**
|
**
|
** This file is part of AEMB.
|
** This file is part of AEMB.
|
**
|
**
|
** AEMB is free software: you can redistribute it and/or modify it
|
** AEMB is free software: you can redistribute it and/or modify it
|
** under the terms of the GNU Lesser General Public License as
|
** under the terms of the GNU Lesser General Public License as
|
** published by the Free Software Foundation, either version 3 of the
|
** published by the Free Software Foundation, either version 3 of the
|
** License, or (at your option) any later version.
|
** License, or (at your option) any later version.
|
**
|
**
|
** AEMB is distributed in the hope that it will be useful, but WITHOUT
|
** AEMB is distributed in the hope that it will be useful, but WITHOUT
|
** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
** or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
|
** or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
|
** Public License for more details.
|
** Public License for more details.
|
**
|
**
|
** 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/>.
|
*/
|
*/
|
|
|
module aeMB2_aslu (/*AUTOARG*/
|
module aeMB2_aslu (/*AUTOARG*/
|
// Outputs
|
// Outputs
|
dwb_adr_o, dwb_sel_o, rSEL_MA, cwb_adr_o, cwb_tga_o, cwb_sel_o,
|
dwb_adr_o, dwb_sel_o, rSEL_MA, cwb_adr_o, cwb_tga_o, cwb_sel_o,
|
iwb_tga_o, dwb_tga_o, rMUL_MA, rRES_MA, rRES_EX, rMSR_IE, rMSR_BE,
|
iwb_tga_o, dwb_tga_o, rMUL_MA, rRES_MA, rRES_EX, rMSR_IE, rMSR_BE,
|
rMSR_BIP,
|
rMSR_BIP,
|
// Inputs
|
// Inputs
|
rIMM_OF, rALU_OF, rOPC_OF, rOPC_IF, rRA_OF, rRD_OF, rOPA_OF,
|
rIMM_OF, rALU_OF, rOPC_OF, rOPC_IF, rRA_OF, rRD_OF, rOPA_OF,
|
rOPB_OF, pha_i, clk_i, rst_i, ena_i
|
rOPB_OF, pha_i, clk_i, rst_i, ena_i
|
);
|
);
|
|
|
parameter DWB = 32;
|
parameter DWB = 32;
|
parameter TXE = 1;
|
parameter TXE = 1;
|
|
|
parameter MUL = 0;
|
parameter MUL = 0;
|
parameter BSF = 1;
|
parameter BSF = 1;
|
parameter FSL = 1;
|
parameter FSL = 1;
|
|
|
// DWB
|
// DWB
|
output [DWB-1:2] dwb_adr_o;
|
output [DWB-1:2] dwb_adr_o;
|
output [3:0] dwb_sel_o;
|
output [3:0] dwb_sel_o;
|
output [3:0] rSEL_MA;
|
output [3:0] rSEL_MA;
|
|
|
// FSL
|
// FSL
|
output [6:2] cwb_adr_o;
|
output [6:2] cwb_adr_o;
|
output [1:0] cwb_tga_o;
|
output [1:0] cwb_tga_o;
|
output [3:0] cwb_sel_o;
|
output [3:0] cwb_sel_o;
|
|
|
// CACHE ENABLE
|
// CACHE ENABLE
|
output iwb_tga_o,
|
output iwb_tga_o,
|
dwb_tga_o;
|
dwb_tga_o;
|
|
|
// PIPELINE
|
// PIPELINE
|
output [31:0] rMUL_MA;
|
output [31:0] rMUL_MA;
|
output [31:0] rRES_MA,
|
output [31:0] rRES_MA,
|
rRES_EX;
|
rRES_EX;
|
|
|
output rMSR_IE,
|
output rMSR_IE,
|
rMSR_BE,
|
rMSR_BE,
|
//rMSR_TXE,
|
//rMSR_TXE,
|
//rMSR_DCE,
|
//rMSR_DCE,
|
//rMSR_ICE,
|
//rMSR_ICE,
|
rMSR_BIP;
|
rMSR_BIP;
|
|
|
input [15:0] rIMM_OF;
|
input [15:0] rIMM_OF;
|
input [2:0] rALU_OF;
|
input [2:0] rALU_OF;
|
input [5:0] rOPC_OF,
|
input [5:0] rOPC_OF,
|
rOPC_IF;
|
rOPC_IF;
|
|
|
input [4:0] rRA_OF,
|
input [4:0] rRA_OF,
|
rRD_OF;
|
rRD_OF;
|
|
|
input [31:0] rOPA_OF, // RA, PC
|
input [31:0] rOPA_OF, // RA, PC
|
rOPB_OF; // RB, IMM
|
rOPB_OF; // RB, IMM
|
|
|
// SYSTEM
|
// SYSTEM
|
input pha_i,
|
input pha_i,
|
clk_i,
|
clk_i,
|
rst_i,
|
rst_i,
|
ena_i;
|
ena_i;
|
|
|
/*AUTOREG*/
|
/*AUTOREG*/
|
// Beginning of automatic regs (for this module's undeclared outputs)
|
// Beginning of automatic regs (for this module's undeclared outputs)
|
reg [6:2] cwb_adr_o;
|
reg [6:2] cwb_adr_o;
|
reg [3:0] cwb_sel_o;
|
reg [3:0] cwb_sel_o;
|
reg [1:0] cwb_tga_o;
|
reg [1:0] cwb_tga_o;
|
reg [DWB-1:2] dwb_adr_o;
|
reg [DWB-1:2] dwb_adr_o;
|
reg [3:0] dwb_sel_o;
|
reg [3:0] dwb_sel_o;
|
reg dwb_tga_o;
|
reg dwb_tga_o;
|
reg iwb_tga_o;
|
reg iwb_tga_o;
|
reg rMSR_BE;
|
reg rMSR_BE;
|
reg rMSR_BIP;
|
reg rMSR_BIP;
|
reg rMSR_IE;
|
reg rMSR_IE;
|
reg [31:0] rMUL_MA;
|
reg [31:0] rMUL_MA;
|
reg [31:0] rRES_EX;
|
reg [31:0] rRES_EX;
|
reg [31:0] rRES_MA;
|
reg [31:0] rRES_MA;
|
reg [3:0] rSEL_MA;
|
reg [3:0] rSEL_MA;
|
// End of automatics
|
// End of automatics
|
|
|
reg rMSR_C0,
|
reg rMSR_C0,
|
rMSR_C1,
|
rMSR_C1,
|
rMSR_C,
|
rMSR_C,
|
rMSR_CC,
|
rMSR_CC,
|
rMSR_CL[0:1];
|
rMSR_CL[0:1];
|
|
|
|
|
wire [4:0] rRD = rRD_OF;
|
wire [4:0] rRD = rRD_OF;
|
wire [31:0] rOPA = rOPA_OF;
|
wire [31:0] rOPA = rOPA_OF;
|
wire [31:0] rOPB = rOPB_OF;
|
wire [31:0] rOPB = rOPB_OF;
|
wire [5:0] rOPC = rOPC_OF;
|
wire [5:0] rOPC = rOPC_OF;
|
wire [4:0] rRA = rRA_OF;
|
wire [4:0] rRA = rRA_OF;
|
wire [15:0] rIMM = rIMM_OF;
|
wire [15:0] rIMM = rIMM_OF;
|
wire [10:0] rALT = rIMM_OF[10:0];
|
wire [10:0] rALT = rIMM_OF[10:0];
|
|
|
/*
|
/*
|
MSR REGISTER
|
MSR REGISTER
|
|
|
We should keep common configuration bits in the lower 16-bits of
|
We should keep common configuration bits in the lower 16-bits of
|
the MSR in order to avoid using the IMMI instruction.
|
the MSR in order to avoid using the IMMI instruction.
|
|
|
MSR bits
|
MSR bits
|
31 - CC (carry copy)
|
31 - CC (carry copy)
|
|
|
30 - HTE (hardware thread enabled)
|
30 - HTE (hardware thread enabled)
|
29 - PHA (current phase)
|
29 - PHA (current phase)
|
28 - TXE (enable threads)
|
28 - TXE (enable threads)
|
|
|
7 - DCE (data cache enable)
|
7 - DCE (data cache enable)
|
5 - ICE (instruction cache enable)
|
5 - ICE (instruction cache enable)
|
4 - FSL (FSL available)
|
4 - FSL (FSL available)
|
|
|
3 - BIP (break in progress)
|
3 - BIP (break in progress)
|
2 - C (carry flag)
|
2 - C (carry flag)
|
1 - IE (interrupt enable)
|
1 - IE (interrupt enable)
|
0 - BE (bus-lock enable)
|
0 - BE (bus-lock enable)
|
|
|
*/
|
*/
|
|
|
wire [31:0] wMSR = {rMSR_C, // MSR_CC
|
wire [31:0] wMSR = {rMSR_C, // MSR_CC
|
TXE[0], // (PVR)
|
TXE[0], // (PVR)
|
pha_i, // (EIP)
|
pha_i, // (EIP)
|
TXE[0], // (EE)
|
TXE[0], // (EE)
|
|
|
20'd0, // Reserved
|
20'd0, // Reserved
|
|
|
dwb_tga_o, // MSR_DCE
|
dwb_tga_o, // MSR_DCE
|
1'b0, // reserved for DZ
|
1'b0, // reserved for DZ
|
iwb_tga_o, // MSR_ICE
|
iwb_tga_o, // MSR_ICE
|
FSL[0], // GET/PUT available
|
FSL[0], // GET/PUT available
|
|
|
rMSR_BIP, // MSR_BIP
|
rMSR_BIP, // MSR_BIP
|
rMSR_C, // MSR_C
|
rMSR_C, // MSR_C
|
rMSR_IE, // MSR_IE
|
rMSR_IE, // MSR_IE
|
rMSR_BE}; // MSR_BE
|
rMSR_BE}; // MSR_BE
|
|
|
|
|
/*
|
/*
|
C SELECTOR
|
C SELECTOR
|
|
|
Preselects the C to speed things up. */
|
Preselects the C to speed things up. */
|
|
|
// TODO: Optimise
|
// TODO: Optimise
|
|
|
wire wMSR_CX, wMSR_C;
|
wire wMSR_CX, wMSR_C;
|
assign wMSR_CX = (pha_i) ? rMSR_C0 : rMSR_C1;
|
assign wMSR_CX = (pha_i) ? rMSR_C0 : rMSR_C1;
|
|
|
assign wMSR_C = (rOPC_IF == 6'o44) & wMSR_CX | // SRX
|
assign wMSR_C = (rOPC_IF == 6'o44) & wMSR_CX | // SRX
|
(rOPC_IF[5:4] == 2'o0) & rOPC_IF[1] & wMSR_CX | // ADDC/RSUBC
|
(rOPC_IF[5:4] == 2'o0) & rOPC_IF[1] & wMSR_CX | // ADDC/RSUBC
|
(rOPC_IF[5:4] == 2'o0) & (rOPC_IF[1:0] == 2'o1); // RSUB
|
(rOPC_IF[5:4] == 2'o0) & (rOPC_IF[1:0] == 2'o1); // RSUB
|
/*
|
/*
|
assign wMSR_C = ((rOPC_IF[5:4] == 2'o0) & (rOPC_OF[1:0] == 2'o1)) ? 1'b1 : // RSUB = 1
|
assign wMSR_C = ((rOPC_IF[5:4] == 2'o0) & (rOPC_OF[1:0] == 2'o1)) ? 1'b1 : // RSUB = 1
|
((rOPC_IF[5:4] == 2'o0) & (rOPC_OF[1:0] == 2'o0)) ? 1'b0 : // ADD = 0
|
((rOPC_IF[5:4] == 2'o0) & (rOPC_OF[1:0] == 2'o0)) ? 1'b0 : // ADD = 0
|
wMSR_CX;
|
wMSR_CX;
|
*/
|
*/
|
|
|
always @(posedge clk_i)
|
always @(posedge clk_i)
|
if (rst_i) begin
|
if (rst_i) begin
|
/*AUTORESET*/
|
/*AUTORESET*/
|
// Beginning of autoreset for uninitialized flops
|
// Beginning of autoreset for uninitialized flops
|
rMSR_C <= 1'h0;
|
rMSR_C <= 1'h0;
|
rMSR_CC <= 1'h0;
|
rMSR_CC <= 1'h0;
|
// End of automatics
|
// End of automatics
|
end else if (ena_i) begin
|
end else if (ena_i) begin
|
rMSR_C <= #1 wMSR_CX;
|
rMSR_C <= #1 wMSR_CX;
|
rMSR_CC <= #1 wMSR_C;
|
rMSR_CC <= #1 wMSR_C;
|
end
|
end
|
|
|
/*
|
/*
|
ADD/SUB SELECTOR
|
ADD/SUB SELECTOR
|
|
|
Current implementation is a clutz. It needs to be
|
Current implementation is a clutz. It needs to be
|
re-implemented. It is also in the critical path. */
|
re-implemented. It is also in the critical path. */
|
|
|
// FIXME: Redesign
|
// FIXME: Redesign
|
// TODO: Verify signed compare
|
// TODO: Verify signed compare
|
|
|
wire wADDC, wSUBC, wRES_AC, wCMPC, wOPC;
|
wire wADDC, wSUBC, wRES_AC, wCMPC, wOPC;
|
wire [31:0] wADD, wSUB, wRES_A, wCMP, wOPX;
|
wire [31:0] wADD, wSUB, wRES_A, wCMP, wOPX;
|
|
|
wire wCMPU = (rOPA > rOPB);
|
wire wCMPU = (rOPA > rOPB);
|
wire wCMPF = (rIMM[1]) ? wCMPU :
|
wire wCMPF = (rIMM[1]) ? wCMPU :
|
((wCMPU & ~(rOPB[31] ^ rOPA[31])) | (rOPB[31] & ~rOPA[31]));
|
((wCMPU & ~(rOPB[31] ^ rOPA[31])) | (rOPB[31] & ~rOPA[31]));
|
|
|
assign {wCMPC,wCMP} = {wSUBC,wCMPF,wSUB[30:0]};
|
assign {wCMPC,wCMP} = {wSUBC,wCMPF,wSUB[30:0]};
|
assign wOPX = (rOPC[0] & !rOPC[5]) ? ~rOPA : rOPA ;
|
assign wOPX = (rOPC[0] & !rOPC[5]) ? ~rOPA : rOPA ;
|
//assign wOPC = ((rMSR_C & rOPC[1]) | (rOPC[0] & !rOPC[1])) & (!rOPC[5] & ~&rOPC[5:4]);
|
//assign wOPC = ((rMSR_C & rOPC[1]) | (rOPC[0] & !rOPC[1])) & (!rOPC[5] & ~&rOPC[5:4]);
|
assign wOPC = rMSR_CC;
|
assign wOPC = rMSR_CC;
|
|
|
assign {wSUBC,wSUB} = {wADDC,wADD};
|
assign {wSUBC,wSUB} = {wADDC,wADD};
|
assign {wADDC,wADD} = (rOPB + wOPX) + wOPC;
|
assign {wADDC,wADD} = (rOPB + wOPX) + wOPC;
|
|
|
reg rRES_ADDC;
|
reg rRES_ADDC;
|
reg [31:0] rRES_ADD;
|
reg [31:0] rRES_ADD;
|
always @(rIMM or rOPC or wADD or wADDC or wCMP
|
always @(rIMM or rOPC or wADD or wADDC or wCMP
|
or wCMPC or wSUB or wSUBC)
|
or wCMPC or wSUB or wSUBC)
|
case ({rOPC[3],rOPC[0],rIMM[0]})
|
case ({rOPC[3],rOPC[0],rIMM[0]})
|
4'h2, 4'h6, 4'h7: {rRES_ADDC,rRES_ADD} <= #1 {wSUBC,wSUB}; // SUB
|
4'h2, 4'h6, 4'h7: {rRES_ADDC,rRES_ADD} <= #1 {wSUBC,wSUB}; // SUB
|
4'h3: {rRES_ADDC,rRES_ADD} <= #1 {wCMPC,wCMP}; // CMP
|
4'h3: {rRES_ADDC,rRES_ADD} <= #1 {wCMPC,wCMP}; // CMP
|
default: {rRES_ADDC,rRES_ADD} <= #1 {wADDC,wADD};
|
default: {rRES_ADDC,rRES_ADD} <= #1 {wADDC,wADD};
|
endcase // case ({rOPC[3],rOPC[0],rIMM[0]})
|
endcase // case ({rOPC[3],rOPC[0],rIMM[0]})
|
|
|
/*
|
/*
|
LOGIC
|
LOGIC
|
|
|
This can be combined with the shifter below.
|
This can be combined with the shifter below.
|
*/
|
*/
|
|
|
reg [31:0] rRES_LOG;
|
reg [31:0] rRES_LOG;
|
always @(/*AUTOSENSE*/rOPA or rOPB or rOPC)
|
always @(/*AUTOSENSE*/rOPA or rOPB or rOPC)
|
case (rOPC[2:0])
|
case (rOPC[2:0])
|
2'o0: rRES_LOG <= #1 rOPA | rOPB;
|
2'o0: rRES_LOG <= #1 rOPA | rOPB;
|
2'o1: rRES_LOG <= #1 rOPA & rOPB;
|
2'o1: rRES_LOG <= #1 rOPA & rOPB;
|
2'o2: rRES_LOG <= #1 rOPA ^ rOPB;
|
2'o2: rRES_LOG <= #1 rOPA ^ rOPB;
|
2'o3: rRES_LOG <= #1 rOPA & ~rOPB;
|
2'o3: rRES_LOG <= #1 rOPA & ~rOPB;
|
endcase // case (rOPC[2:0])
|
endcase // case (rOPC[2:0])
|
|
|
/*
|
/*
|
SIMPLE SHIFTER
|
SIMPLE SHIFTER
|
|
|
Implemented as wiring and registers.
|
Implemented as wiring and registers.
|
*/
|
*/
|
|
|
reg [31:0] rRES_SFT;
|
reg [31:0] rRES_SFT;
|
reg rRES_SFTC;
|
reg rRES_SFTC;
|
|
|
always @(/*AUTOSENSE*/rIMM or rMSR_C or rOPA)
|
always @(/*AUTOSENSE*/rIMM or rMSR_C or rOPA)
|
case (rIMM[6:5])
|
case (rIMM[6:5])
|
2'o0: rRES_SFT <= {rOPA[31],rOPA[31:1]}; // SRA
|
2'o0: rRES_SFT <= {rOPA[31],rOPA[31:1]}; // SRA
|
2'o1: rRES_SFT <= {rMSR_C,rOPA[31:1]}; // SRC
|
2'o1: rRES_SFT <= {rMSR_C,rOPA[31:1]}; // SRC
|
2'o2: rRES_SFT <= {1'b0,rOPA[31:1]}; // SRL
|
2'o2: rRES_SFT <= {1'b0,rOPA[31:1]}; // SRL
|
2'o3: rRES_SFT <= (rIMM[0]) ?
|
2'o3: rRES_SFT <= (rIMM[0]) ?
|
{{(16){rOPA[15]}}, rOPA[15:0]} : // SEXT16
|
{{(16){rOPA[15]}}, rOPA[15:0]} : // SEXT16
|
{{(24){rOPA[7]}}, rOPA[7:0]}; // SEXT8
|
{{(24){rOPA[7]}}, rOPA[7:0]}; // SEXT8
|
endcase // case (rIMM[6:5])
|
endcase // case (rIMM[6:5])
|
|
|
always @(/*AUTOSENSE*/rIMM or rMSR_C or rOPA)
|
always @(/*AUTOSENSE*/rIMM or rMSR_C or rOPA)
|
rRES_SFTC <= (&rIMM[6:5]) ? rMSR_C : rOPA[0];
|
rRES_SFTC <= (&rIMM[6:5]) ? rMSR_C : rOPA[0];
|
|
|
/*
|
/*
|
MOVER
|
MOVER
|
*/
|
*/
|
|
|
wire fMFSR = (rOPC == 6'o45) & !rIMM[14] & rIMM[0];
|
wire fMFSR = (rOPC == 6'o45) & !rIMM[14] & rIMM[0];
|
wire fMFPC = (rOPC == 6'o45) & !rIMM[14] & !rIMM[0];
|
wire fMFPC = (rOPC == 6'o45) & !rIMM[14] & !rIMM[0];
|
reg [31:0] rRES_MOV;
|
reg [31:0] rRES_MOV;
|
|
|
always @(/*AUTOSENSE*/fMFSR or rOPA or rOPB or rRA or wMSR)
|
always @(/*AUTOSENSE*/fMFSR or rOPA or rOPB or rRA or wMSR)
|
case ({fMFSR, rRA[3]})
|
case ({fMFSR, rRA[3]})
|
2'o0: rRES_MOV <= rOPA; // MFS rpc
|
2'o0: rRES_MOV <= rOPA; // MFS rpc
|
2'o1: rRES_MOV <= rOPB; // BRA
|
2'o1: rRES_MOV <= rOPB; // BRA
|
2'o2: rRES_MOV <= wMSR; // MFS rmsr
|
2'o2: rRES_MOV <= wMSR; // MFS rmsr
|
default: rRES_MOV <= 32'hX;
|
default: rRES_MOV <= 32'hX;
|
endcase // case ({fMFSR, rRA[3]})
|
endcase // case ({fMFSR, rRA[3]})
|
|
|
|
|
/*
|
/*
|
COMBINED SHIFT/LOGIC/MOVE
|
COMBINED SHIFT/LOGIC/MOVE
|
|
|
*/
|
*/
|
|
|
reg [31:0] rRES_SLM;
|
reg [31:0] rRES_SLM;
|
|
|
always @(/*AUTOSENSE*/fMFSR or rIMM or rMSR_C or rOPA or rOPB
|
always @(/*AUTOSENSE*/fMFSR or rIMM or rMSR_C or rOPA or rOPB
|
or rOPC or rRA or wMSR)
|
or rOPC or rRA or wMSR)
|
case (rOPC[2:0])
|
case (rOPC[2:0])
|
3'o0: rRES_SLM <= #1 rOPA | rOPB;
|
3'o0: rRES_SLM <= #1 rOPA | rOPB;
|
3'o1: rRES_SLM <= #1 rOPA & rOPB;
|
3'o1: rRES_SLM <= #1 rOPA & rOPB;
|
3'o2: rRES_SLM <= #1 rOPA ^ rOPB;
|
3'o2: rRES_SLM <= #1 rOPA ^ rOPB;
|
3'o3: rRES_SLM <= #1 rOPA & ~rOPB;
|
3'o3: rRES_SLM <= #1 rOPA & ~rOPB;
|
3'o4: case (rIMM[6:5])
|
3'o4: case (rIMM[6:5])
|
2'o0: rRES_SLM <= #1 {rOPA[31],rOPA[31:1]}; // SRA
|
2'o0: rRES_SLM <= #1 {rOPA[31],rOPA[31:1]}; // SRA
|
2'o1: rRES_SLM <= #1 {rMSR_C,rOPA[31:1]}; // SRC
|
2'o1: rRES_SLM <= #1 {rMSR_C,rOPA[31:1]}; // SRC
|
2'o2: rRES_SLM <= #1 {1'b0,rOPA[31:1]}; // SRL
|
2'o2: rRES_SLM <= #1 {1'b0,rOPA[31:1]}; // SRL
|
2'o3: rRES_SLM <= #1 (rIMM[0]) ?
|
2'o3: rRES_SLM <= #1 (rIMM[0]) ?
|
{{(16){rOPA[15]}}, rOPA[15:0]} : // SEXT16
|
{{(16){rOPA[15]}}, rOPA[15:0]} : // SEXT16
|
{{(24){rOPA[7]}}, rOPA[7:0]}; // SEXT8
|
{{(24){rOPA[7]}}, rOPA[7:0]}; // SEXT8
|
endcase // case (rIMM[6:5])
|
endcase // case (rIMM[6:5])
|
3'o5: case ({fMFSR, rRA[3]})
|
3'o5: case ({fMFSR, rRA[3]})
|
2'o0: rRES_SLM <= #1 rOPA; // MFS rpc
|
2'o0: rRES_SLM <= #1 rOPA; // MFS rpc
|
2'o1: rRES_SLM <= #1 rOPB; // BRA
|
2'o1: rRES_SLM <= #1 rOPB; // BRA
|
2'o2: rRES_SLM <= #1 wMSR; // MFS rmsr
|
2'o2: rRES_SLM <= #1 wMSR; // MFS rmsr
|
default: rRES_MOV <= #1 32'hX;
|
default: rRES_MOV <= #1 32'hX;
|
endcase // case ({fMFSR, rRA[3]})
|
endcase // case ({fMFSR, rRA[3]})
|
3'o6: rRES_SLM <= #1 rOPB;
|
3'o6: rRES_SLM <= #1 rOPB;
|
default: rRES_SLM <= #1 32'hX;
|
default: rRES_SLM <= #1 32'hX;
|
endcase // case (rOPC[2:0])
|
endcase // case (rOPC[2:0])
|
|
|
|
|
/*
|
/*
|
MULTIPLIER
|
MULTIPLIER
|
|
|
Implemented as a 2-stage multiplier in order to increase clock
|
Implemented as a 2-stage multiplier in order to increase clock
|
speed. */
|
speed. */
|
|
|
reg [31:0] rRES_MUL;
|
reg [31:0] rRES_MUL;
|
always @(posedge clk_i) if (ena_i) begin
|
always @(posedge clk_i) if (ena_i) begin
|
rMUL_MA <= #1 rRES_MUL;
|
rMUL_MA <= #1 rRES_MUL;
|
rRES_MUL <= #1 (rOPA * rOPB);
|
rRES_MUL <= #1 (rOPA * rOPB);
|
end
|
end
|
|
|
/*
|
/*
|
BARREL SHIFTER
|
BARREL SHIFTER
|
|
|
This can be potentially made 2-stage if it is a
|
This can be potentially made 2-stage if it is a
|
bottleneck. Doesn't seem necessary at the moment as the critical
|
bottleneck. Doesn't seem necessary at the moment as the critical
|
path runs through the adder. */
|
path runs through the adder. */
|
|
|
reg [31:0] rRES_BSF;
|
reg [31:0] rRES_BSF;
|
reg [31:0] xBSRL, xBSRA, xBSLL;
|
reg [31:0] xBSRL, xBSRA, xBSLL;
|
|
|
/* logical left barrel shifter */
|
/* logical left barrel shifter */
|
always @(/*AUTOSENSE*/rOPA or rOPB)
|
always @(/*AUTOSENSE*/rOPA or rOPB)
|
xBSLL <= rOPA << rOPB[4:0];
|
xBSLL <= rOPA << rOPB[4:0];
|
|
|
/* logical right barrel shifter */
|
/* logical right barrel shifter */
|
always @(/*AUTOSENSE*/rOPA or rOPB)
|
always @(/*AUTOSENSE*/rOPA or rOPB)
|
xBSRL <= rOPA >> rOPB[4:0];
|
xBSRL <= rOPA >> rOPB[4:0];
|
|
|
/* arithmetic right barrel shifter */
|
/* arithmetic right barrel shifter */
|
always @(/*AUTOSENSE*/rOPA or rOPB)
|
always @(/*AUTOSENSE*/rOPA or rOPB)
|
case (rOPB[4:0])
|
case (rOPB[4:0])
|
5'd00: xBSRA <= rOPA;
|
5'd00: xBSRA <= rOPA;
|
5'd01: xBSRA <= {{(1){rOPA[31]}}, rOPA[31:1]};
|
5'd01: xBSRA <= {{(1){rOPA[31]}}, rOPA[31:1]};
|
5'd02: xBSRA <= {{(2){rOPA[31]}}, rOPA[31:2]};
|
5'd02: xBSRA <= {{(2){rOPA[31]}}, rOPA[31:2]};
|
5'd03: xBSRA <= {{(3){rOPA[31]}}, rOPA[31:3]};
|
5'd03: xBSRA <= {{(3){rOPA[31]}}, rOPA[31:3]};
|
5'd04: xBSRA <= {{(4){rOPA[31]}}, rOPA[31:4]};
|
5'd04: xBSRA <= {{(4){rOPA[31]}}, rOPA[31:4]};
|
5'd05: xBSRA <= {{(5){rOPA[31]}}, rOPA[31:5]};
|
5'd05: xBSRA <= {{(5){rOPA[31]}}, rOPA[31:5]};
|
5'd06: xBSRA <= {{(6){rOPA[31]}}, rOPA[31:6]};
|
5'd06: xBSRA <= {{(6){rOPA[31]}}, rOPA[31:6]};
|
5'd07: xBSRA <= {{(7){rOPA[31]}}, rOPA[31:7]};
|
5'd07: xBSRA <= {{(7){rOPA[31]}}, rOPA[31:7]};
|
5'd08: xBSRA <= {{(8){rOPA[31]}}, rOPA[31:8]};
|
5'd08: xBSRA <= {{(8){rOPA[31]}}, rOPA[31:8]};
|
5'd09: xBSRA <= {{(9){rOPA[31]}}, rOPA[31:9]};
|
5'd09: xBSRA <= {{(9){rOPA[31]}}, rOPA[31:9]};
|
5'd10: xBSRA <= {{(10){rOPA[31]}}, rOPA[31:10]};
|
5'd10: xBSRA <= {{(10){rOPA[31]}}, rOPA[31:10]};
|
5'd11: xBSRA <= {{(11){rOPA[31]}}, rOPA[31:11]};
|
5'd11: xBSRA <= {{(11){rOPA[31]}}, rOPA[31:11]};
|
5'd12: xBSRA <= {{(12){rOPA[31]}}, rOPA[31:12]};
|
5'd12: xBSRA <= {{(12){rOPA[31]}}, rOPA[31:12]};
|
5'd13: xBSRA <= {{(13){rOPA[31]}}, rOPA[31:13]};
|
5'd13: xBSRA <= {{(13){rOPA[31]}}, rOPA[31:13]};
|
5'd14: xBSRA <= {{(14){rOPA[31]}}, rOPA[31:14]};
|
5'd14: xBSRA <= {{(14){rOPA[31]}}, rOPA[31:14]};
|
5'd15: xBSRA <= {{(15){rOPA[31]}}, rOPA[31:15]};
|
5'd15: xBSRA <= {{(15){rOPA[31]}}, rOPA[31:15]};
|
5'd16: xBSRA <= {{(16){rOPA[31]}}, rOPA[31:16]};
|
5'd16: xBSRA <= {{(16){rOPA[31]}}, rOPA[31:16]};
|
5'd17: xBSRA <= {{(17){rOPA[31]}}, rOPA[31:17]};
|
5'd17: xBSRA <= {{(17){rOPA[31]}}, rOPA[31:17]};
|
5'd18: xBSRA <= {{(18){rOPA[31]}}, rOPA[31:18]};
|
5'd18: xBSRA <= {{(18){rOPA[31]}}, rOPA[31:18]};
|
5'd19: xBSRA <= {{(19){rOPA[31]}}, rOPA[31:19]};
|
5'd19: xBSRA <= {{(19){rOPA[31]}}, rOPA[31:19]};
|
5'd20: xBSRA <= {{(20){rOPA[31]}}, rOPA[31:20]};
|
5'd20: xBSRA <= {{(20){rOPA[31]}}, rOPA[31:20]};
|
5'd21: xBSRA <= {{(21){rOPA[31]}}, rOPA[31:21]};
|
5'd21: xBSRA <= {{(21){rOPA[31]}}, rOPA[31:21]};
|
5'd22: xBSRA <= {{(22){rOPA[31]}}, rOPA[31:22]};
|
5'd22: xBSRA <= {{(22){rOPA[31]}}, rOPA[31:22]};
|
5'd23: xBSRA <= {{(23){rOPA[31]}}, rOPA[31:23]};
|
5'd23: xBSRA <= {{(23){rOPA[31]}}, rOPA[31:23]};
|
5'd24: xBSRA <= {{(24){rOPA[31]}}, rOPA[31:24]};
|
5'd24: xBSRA <= {{(24){rOPA[31]}}, rOPA[31:24]};
|
5'd25: xBSRA <= {{(25){rOPA[31]}}, rOPA[31:25]};
|
5'd25: xBSRA <= {{(25){rOPA[31]}}, rOPA[31:25]};
|
5'd26: xBSRA <= {{(26){rOPA[31]}}, rOPA[31:26]};
|
5'd26: xBSRA <= {{(26){rOPA[31]}}, rOPA[31:26]};
|
5'd27: xBSRA <= {{(27){rOPA[31]}}, rOPA[31:27]};
|
5'd27: xBSRA <= {{(27){rOPA[31]}}, rOPA[31:27]};
|
5'd28: xBSRA <= {{(28){rOPA[31]}}, rOPA[31:28]};
|
5'd28: xBSRA <= {{(28){rOPA[31]}}, rOPA[31:28]};
|
5'd29: xBSRA <= {{(29){rOPA[31]}}, rOPA[31:29]};
|
5'd29: xBSRA <= {{(29){rOPA[31]}}, rOPA[31:29]};
|
5'd30: xBSRA <= {{(30){rOPA[31]}}, rOPA[31:30]};
|
5'd30: xBSRA <= {{(30){rOPA[31]}}, rOPA[31:30]};
|
5'd31: xBSRA <= {{(31){rOPA[31]}}, rOPA[31]};
|
5'd31: xBSRA <= {{(31){rOPA[31]}}, rOPA[31]};
|
endcase // case (rOPB[4:0])
|
endcase // case (rOPB[4:0])
|
|
|
/* select the shift result (2nd stage) */
|
/* select the shift result (2nd stage) */
|
always @(/*AUTOSENSE*/rALT or xBSLL or xBSRA or xBSRL)
|
always @(/*AUTOSENSE*/rALT or xBSLL or xBSRA or xBSRL)
|
case (rALT[10:9])
|
case (rALT[10:9])
|
2'd0: rRES_BSF <= xBSRL;
|
2'd0: rRES_BSF <= xBSRL;
|
2'd1: rRES_BSF <= xBSRA;
|
2'd1: rRES_BSF <= xBSRA;
|
2'd2: rRES_BSF <= xBSLL;
|
2'd2: rRES_BSF <= xBSLL;
|
default: rRES_BSF <= 32'hX;
|
default: rRES_BSF <= 32'hX;
|
endcase // case (rALT[10:9])
|
endcase // case (rALT[10:9])
|
|
|
|
|
/*
|
/*
|
RESULTS
|
RESULTS
|
*/
|
*/
|
|
|
// RESULT
|
// RESULT
|
always @(posedge clk_i)
|
always @(posedge clk_i)
|
if (rst_i) begin
|
if (rst_i) begin
|
/*AUTORESET*/
|
/*AUTORESET*/
|
// Beginning of autoreset for uninitialized flops
|
// Beginning of autoreset for uninitialized flops
|
rRES_EX <= 32'h0;
|
rRES_EX <= 32'h0;
|
rRES_MA <= 32'h0;
|
rRES_MA <= 32'h0;
|
// End of automatics
|
// End of automatics
|
end else if (ena_i) begin
|
end else if (ena_i) begin
|
rRES_MA <= #1 rRES_EX;
|
rRES_MA <= #1 rRES_EX;
|
/*
|
/*
|
case (rALU_OF)
|
case (rALU_OF)
|
3'o0: rRES_EX <= #1 rRES_ADD;
|
3'o0: rRES_EX <= #1 rRES_ADD;
|
3'o1: rRES_EX <= #1 rRES_LOG;
|
3'o1: rRES_EX <= #1 rRES_LOG;
|
3'o2: rRES_EX <= #1 rRES_SFT;
|
3'o2: rRES_EX <= #1 rRES_SFT;
|
3'o3: rRES_EX <= #1 rRES_MOV;
|
3'o3: rRES_EX <= #1 rRES_MOV;
|
3'o5: rRES_EX <= #1 (BSF) ? rRES_BSF : 32'hX;
|
3'o5: rRES_EX <= #1 (BSF) ? rRES_BSF : 32'hX;
|
default: rRES_EX <= #1 32'hX;
|
default: rRES_EX <= #1 32'hX;
|
endcase // case (rALU_OF)
|
endcase // case (rALU_OF)
|
*/
|
*/
|
case (rALU_OF[1:0])
|
case (rALU_OF[1:0])
|
//case (rOPC[5:4])
|
//case (rOPC[5:4])
|
2'o0: rRES_EX <= #1 rRES_ADD;
|
2'o0: rRES_EX <= #1 rRES_ADD;
|
2'o2: rRES_EX <= #1 rRES_SLM;
|
2'o2: rRES_EX <= #1 rRES_SLM;
|
2'o1: rRES_EX <= #1 (BSF) ? rRES_BSF : 32'hX;
|
2'o1: rRES_EX <= #1 (BSF) ? rRES_BSF : 32'hX;
|
default: rRES_EX <= #1 32'hX;
|
default: rRES_EX <= #1 32'hX;
|
endcase // case (rALU_OF[1:0])
|
endcase // case (rALU_OF[1:0])
|
|
|
end // if (ena_i)
|
end // if (ena_i)
|
|
|
|
|
/*
|
/*
|
MSR REGISTER
|
MSR REGISTER
|
|
|
Move data to the MSR or change due to break/returns. */
|
Move data to the MSR or change due to break/returns. */
|
|
|
reg xMSR_C;
|
reg xMSR_C;
|
|
|
// C
|
// C
|
wire fMTS = (rOPC == 6'o45) & rIMM[14];
|
wire fMTS = (rOPC == 6'o45) & rIMM[14];
|
wire fADDC = ({rOPC[5:4], rOPC[2]} == 3'o0);
|
wire fADDC = ({rOPC[5:4], rOPC[2]} == 3'o0);
|
|
|
always @(/*AUTOSENSE*/fADDC or rALU_OF or rIMM or rMSR_C or rOPC
|
always @(/*AUTOSENSE*/fADDC or rALU_OF or rIMM or rMSR_C or rOPC
|
or rRES_ADDC or rRES_SFTC)
|
or rRES_ADDC or rRES_SFTC)
|
case (rALU_OF[1:0])
|
case (rALU_OF[1:0])
|
//case (rOPC[5:4])
|
//case (rOPC[5:4])
|
3'o0: xMSR_C <= (fADDC) ? rRES_ADDC : rMSR_C; // ADD/SUB
|
3'o0: xMSR_C <= (fADDC) ? rRES_ADDC : rMSR_C; // ADD/SUB
|
3'o2: case (rOPC[2:0])
|
3'o2: case (rOPC[2:0])
|
3'o5: xMSR_C <= (rIMM[14]) ? rOPA[2] : rMSR_C; // MTS
|
3'o5: xMSR_C <= (rIMM[14]) ? rOPA[2] : rMSR_C; // MTS
|
3'o4: xMSR_C <= (&rIMM[6:5]) ? rMSR_C : rRES_SFTC; // SRX
|
3'o4: xMSR_C <= (&rIMM[6:5]) ? rMSR_C : rRES_SFTC; // SRX
|
default: xMSR_C <= rMSR_C;
|
default: xMSR_C <= rMSR_C;
|
endcase // case (rOPC[2:0])
|
endcase // case (rOPC[2:0])
|
default: xMSR_C <= rMSR_C;
|
default: xMSR_C <= rMSR_C;
|
endcase // case (rOPC[5:4])
|
endcase // case (rOPC[5:4])
|
|
|
/*
|
/*
|
case (rALU_OF)
|
case (rALU_OF)
|
3'o0: xMSR_C <= (fADDC) ? rRES_ADDC : rMSR_C;
|
3'o0: xMSR_C <= (fADDC) ? rRES_ADDC : rMSR_C;
|
3'o1: xMSR_C <= rMSR_C; // LOGIC
|
3'o1: xMSR_C <= rMSR_C; // LOGIC
|
3'o2: xMSR_C <= rRES_SFTC; // SHIFT
|
3'o2: xMSR_C <= rRES_SFTC; // SHIFT
|
3'o3: xMSR_C <= (fMTS) ? rOPA[2] : rMSR_C;
|
3'o3: xMSR_C <= (fMTS) ? rOPA[2] : rMSR_C;
|
3'o4: xMSR_C <= rMSR_C;
|
3'o4: xMSR_C <= rMSR_C;
|
3'o5: xMSR_C <= rMSR_C;
|
3'o5: xMSR_C <= rMSR_C;
|
default: xMSR_C <= 1'hX;
|
default: xMSR_C <= 1'hX;
|
endcase // case (rALU_OF)
|
endcase // case (rALU_OF)
|
*/
|
*/
|
|
|
always @(posedge clk_i)
|
always @(posedge clk_i)
|
if (rst_i) begin
|
if (rst_i) begin
|
/*AUTORESET*/
|
/*AUTORESET*/
|
// Beginning of autoreset for uninitialized flops
|
// Beginning of autoreset for uninitialized flops
|
rMSR_C0 <= 1'h0;
|
rMSR_C0 <= 1'h0;
|
rMSR_C1 <= 1'h0;
|
rMSR_C1 <= 1'h0;
|
// End of automatics
|
// End of automatics
|
end else if (ena_i) begin
|
end else if (ena_i) begin
|
if (pha_i)
|
if (pha_i)
|
rMSR_C1 <= #1 xMSR_C;
|
rMSR_C1 <= #1 xMSR_C;
|
else
|
else
|
rMSR_C0 <= #1 xMSR_C;
|
rMSR_C0 <= #1 xMSR_C;
|
end
|
end
|
|
|
// IE/BIP/BE
|
// IE/BIP/BE
|
wire fRTID = (rOPC == 6'o55) & rRD[0];
|
wire fRTID = (rOPC == 6'o55) & rRD[0];
|
wire fRTBD = (rOPC == 6'o55) & rRD[1];
|
wire fRTBD = (rOPC == 6'o55) & rRD[1];
|
wire fBRK = ((rOPC == 6'o56) | (rOPC == 6'o66)) & (rRA == 5'hC);
|
wire fBRK = ((rOPC == 6'o56) | (rOPC == 6'o66)) & (rRA == 5'hC);
|
wire fINT = ((rOPC == 6'o56) | (rOPC == 6'o66)) & (rRA == 5'hE);
|
wire fINT = ((rOPC == 6'o56) | (rOPC == 6'o66)) & (rRA == 5'hE);
|
|
|
always @(posedge clk_i)
|
always @(posedge clk_i)
|
if (rst_i) begin
|
if (rst_i) begin
|
/*AUTORESET*/
|
/*AUTORESET*/
|
// Beginning of autoreset for uninitialized flops
|
// Beginning of autoreset for uninitialized flops
|
dwb_tga_o <= 1'h0;
|
dwb_tga_o <= 1'h0;
|
iwb_tga_o <= 1'h0;
|
iwb_tga_o <= 1'h0;
|
rMSR_BE <= 1'h0;
|
rMSR_BE <= 1'h0;
|
rMSR_BIP <= 1'h0;
|
rMSR_BIP <= 1'h0;
|
rMSR_IE <= 1'h0;
|
rMSR_IE <= 1'h0;
|
// End of automatics
|
// End of automatics
|
end else if (ena_i) begin
|
end else if (ena_i) begin
|
|
|
// Interrupt enable (compatible)
|
// Interrupt enable (compatible)
|
rMSR_IE <= #1
|
rMSR_IE <= #1
|
(fINT) ? 1'b0 :
|
(fINT) ? 1'b0 :
|
(fRTID) ? 1'b1 :
|
(fRTID) ? 1'b1 :
|
(fMTS) ? rOPA[1] :
|
(fMTS) ? rOPA[1] :
|
rMSR_IE;
|
rMSR_IE;
|
|
|
// Break in progress (compatible)
|
// Break in progress (compatible)
|
rMSR_BIP <= #1
|
rMSR_BIP <= #1
|
(fBRK) ? 1'b1 :
|
(fBRK) ? 1'b1 :
|
(fRTBD) ? 1'b0 :
|
(fRTBD) ? 1'b0 :
|
(fMTS) ? rOPA[3] :
|
(fMTS) ? rOPA[3] :
|
rMSR_BIP;
|
rMSR_BIP;
|
|
|
// Forcibly assert dwb_cyc_o signal
|
// Forcibly assert dwb_cyc_o signal
|
rMSR_BE <= #1
|
rMSR_BE <= #1
|
(fMTS) ? rOPA[0] : rMSR_BE;
|
(fMTS) ? rOPA[0] : rMSR_BE;
|
|
|
// Enable the thread extension
|
// Enable the thread extension
|
//rMSR_TXE <= #1 TXE[0];
|
//rMSR_TXE <= #1 TXE[0];
|
|
|
// Enable the caches
|
// Enable the caches
|
dwb_tga_o <= #1 (fMTS) ?
|
dwb_tga_o <= #1 (fMTS) ?
|
rOPA[7] :
|
rOPA[7] :
|
dwb_tga_o;
|
dwb_tga_o;
|
iwb_tga_o <= #1 (fMTS) ?
|
iwb_tga_o <= #1 (fMTS) ?
|
rOPA[5] :
|
rOPA[5] :
|
iwb_tga_o;
|
iwb_tga_o;
|
|
|
end // if (ena_i)
|
end // if (ena_i)
|
|
|
/*
|
/*
|
DATA/FSL WISHBONE
|
DATA/FSL WISHBONE
|
|
|
Asserts the data address as calculated by the adder and the
|
Asserts the data address as calculated by the adder and the
|
appropriate byte select lanes depending on the byte offset of the
|
appropriate byte select lanes depending on the byte offset of the
|
address. It does not check for mis-aligned addresses. */
|
address. It does not check for mis-aligned addresses. */
|
|
|
// TODO: Check for mis-alignment
|
// TODO: Check for mis-alignment
|
|
|
always @(posedge clk_i)
|
always @(posedge clk_i)
|
if (rst_i) begin
|
if (rst_i) begin
|
/*AUTORESET*/
|
/*AUTORESET*/
|
// Beginning of autoreset for uninitialized flops
|
// Beginning of autoreset for uninitialized flops
|
cwb_adr_o <= 5'h0;
|
cwb_adr_o <= 5'h0;
|
cwb_sel_o <= 4'h0;
|
cwb_sel_o <= 4'h0;
|
cwb_tga_o <= 2'h0;
|
cwb_tga_o <= 2'h0;
|
dwb_adr_o <= {(1+(DWB-1)-(2)){1'b0}};
|
dwb_adr_o <= {(1+(DWB-1)-(2)){1'b0}};
|
dwb_sel_o <= 4'h0;
|
dwb_sel_o <= 4'h0;
|
rSEL_MA <= 4'h0;
|
rSEL_MA <= 4'h0;
|
// End of automatics
|
// End of automatics
|
end else if (ena_i) begin // if (rst_i)
|
end else if (ena_i) begin // if (rst_i)
|
rSEL_MA <= #1 dwb_sel_o;
|
rSEL_MA <= #1 dwb_sel_o;
|
|
|
dwb_adr_o <= #1 wADD[DWB-1:2];
|
dwb_adr_o <= #1 wADD[DWB-1:2];
|
case (rOPC[1:0])
|
case (rOPC[1:0])
|
2'o0: case (wADD[1:0]) // 8'bit
|
2'o0: case (wADD[1:0]) // 8'bit
|
2'o0: dwb_sel_o <= #1 4'h8;
|
2'o0: dwb_sel_o <= #1 4'h8;
|
2'o1: dwb_sel_o <= #1 4'h4;
|
2'o1: dwb_sel_o <= #1 4'h4;
|
2'o2: dwb_sel_o <= #1 4'h2;
|
2'o2: dwb_sel_o <= #1 4'h2;
|
2'o3: dwb_sel_o <= #1 4'h1;
|
2'o3: dwb_sel_o <= #1 4'h1;
|
endcase // case (wADD[1:0])
|
endcase // case (wADD[1:0])
|
2'o1: dwb_sel_o <= #1 (wADD[1]) ? 4'h3 : 4'hC; // 16'bit
|
2'o1: dwb_sel_o <= #1 (wADD[1]) ? 4'h3 : 4'hC; // 16'bit
|
2'o2: dwb_sel_o <= #1 4'hF; // 32'bit
|
2'o2: dwb_sel_o <= #1 4'hF; // 32'bit
|
2'o3: dwb_sel_o <= #1 4'h0; // FSL
|
2'o3: dwb_sel_o <= #1 4'h0; // FSL
|
endcase // case (rOPC[1:0])
|
endcase // case (rOPC[1:0])
|
|
|
{cwb_adr_o, cwb_tga_o} <= #1 {rIMM_OF[4:0], rIMM_OF[15:14]};
|
{cwb_adr_o, cwb_tga_o} <= #1 {rIMM_OF[4:0], rIMM_OF[15:14]};
|
cwb_sel_o <= #1 {(4){ &rOPC[1:0]}};
|
cwb_sel_o <= #1 {(4){ &rOPC[1:0]}};
|
|
|
end // if (ena_i)
|
end // if (ena_i)
|
|
|
endmodule // aeMB2_aslu
|
endmodule // aeMB2_aslu
|
|
|
/* $Log: not supported by cvs2svn $
|
/* $Log: not supported by cvs2svn $
|
/* Revision 1.9 2008/01/09 19:17:33 sybreon
|
/* Revision 1.9 2008/01/09 19:17:33 sybreon
|
/* Made multiplier pause with pipeline
|
/* Made multiplier pause with pipeline
|
/*
|
/*
|
/* Revision 1.8 2008/01/09 19:12:59 sybreon
|
/* Revision 1.8 2008/01/09 19:12:59 sybreon
|
/* multiplier issues
|
/* multiplier issues
|
/*
|
/*
|
/* Revision 1.7 2007/12/17 12:53:27 sybreon
|
/* Revision 1.7 2007/12/17 12:53:27 sybreon
|
/* Fixed Carry bit bug.
|
/* Fixed Carry bit bug.
|
/*
|
/*
|
/* Revision 1.6 2007/12/16 20:38:06 sybreon
|
/* Revision 1.6 2007/12/16 20:38:06 sybreon
|
/* Minor optimisations.
|
/* Minor optimisations.
|
/*
|
/*
|
/* Revision 1.5 2007/12/16 03:25:37 sybreon
|
/* Revision 1.5 2007/12/16 03:25:37 sybreon
|
/* Some optimisations.
|
/* Some optimisations.
|
/*
|
/*
|
/* Revision 1.4 2007/12/13 21:25:41 sybreon
|
/* Revision 1.4 2007/12/13 21:25:41 sybreon
|
/* Further optimisations (speed + size).
|
/* Further optimisations (speed + size).
|
/*
|
/*
|
/* Revision 1.3 2007/12/13 20:12:11 sybreon
|
/* Revision 1.3 2007/12/13 20:12:11 sybreon
|
/* Code cleanup + minor speed regression.
|
/* Code cleanup + minor speed regression.
|
/*
|
/*
|
/* Revision 1.2 2007/12/12 19:16:59 sybreon
|
/* Revision 1.2 2007/12/12 19:16:59 sybreon
|
/* Minor optimisations (~10% faster)
|
/* Minor optimisations (~10% faster)
|
/*
|
/*
|
/* Revision 1.1 2007/12/11 00:43:17 sybreon
|
/* Revision 1.1 2007/12/11 00:43:17 sybreon
|
/* initial import
|
/* initial import
|
|
|