Line 1... |
Line 1... |
/* $Id: aeMB2_aslu.v,v 1.1 2007-12-11 00:43:17 sybreon Exp $
|
/* $Id: aeMB2_aslu.v,v 1.2 2007-12-12 19:16:59 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>
|
**
|
**
|
Line 21... |
Line 21... |
*/
|
*/
|
|
|
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,
|
rMUL_MA, rRES_MA, rRES_EX, rMSR_IE, rMSR_BE, rMSR_BIP,
|
rMUL_MA, rRES_MA, rRES_EX, rMSR_IE, rMSR_BE, rMSR_TXE, rMSR_BIP,
|
// Inputs
|
// Inputs
|
rIMM_OF, rALU_OF, rOPC_OF, rRA_OF, rRD_OF, rPC_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 MUL = 0;
|
parameter MUL = 0;
|
parameter BSF = 1;
|
parameter BSF = 1;
|
parameter FSL = 1;
|
parameter FSL = 1;
|
|
|
parameter TXE = 1;
|
|
parameter LUT = 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;
|
|
|
Line 53... |
Line 51... |
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_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;
|
|
|
input [4:0] rRA_OF,
|
input [4:0] rRA_OF,
|
rRD_OF;
|
rRD_OF;
|
input [31:2] rPC_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,
|
Line 80... |
Line 81... |
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 rMSR_BE;
|
reg rMSR_BE;
|
reg rMSR_BIP;
|
reg rMSR_BIP;
|
reg rMSR_IE;
|
reg rMSR_IE;
|
|
reg rMSR_TXE;
|
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_CL[0:TXE];
|
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];
|
|
|
// --- ADD/SUB SELECTOR ----
|
/*
|
|
C SELECTOR
|
|
|
|
Preselects the C in the OF stage to speed things up. */
|
|
|
|
// TODO: Optimise
|
|
|
|
wire wMSR_CX, wMSR_C;
|
|
assign wMSR_CX = (pha_i) ? rMSR_C0 :
|
|
(TXE) ? rMSR_C1 : 1'bX;
|
|
|
|
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:0] == 2'o1); // RSUB
|
|
|
|
reg rMSR_C;
|
|
|
|
always @(posedge clk_i)
|
|
if (rst_i) begin
|
|
/*AUTORESET*/
|
|
// Beginning of autoreset for uninitialized flops
|
|
rMSR_C <= 1'h0;
|
|
// End of automatics
|
|
end else if (ena_i) begin
|
|
rMSR_C <= #1 wMSR_C;
|
|
end
|
|
|
|
/*
|
|
ADD/SUB SELECTOR
|
|
|
|
Current implementation is a clutz. It needs to be
|
|
re-implemented. It is also in the critical path. */
|
|
|
// FIXME: Redesign
|
// FIXME: Redesign
|
// TODO: Refactor
|
|
// TODO: Verify signed compare
|
// TODO: Verify signed compare
|
|
|
wire rMSR_CX = (!pha_i) ? rMSR_C0 : (TXE) ? rMSR_C1 : 1'bX;
|
|
wire rMSR_C = (LUT) ? rMSR_CL[pha_i] : rMSR_CX;
|
|
|
|
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 = ((wMSR_C & rOPC[1]) | (rOPC[0] & !rOPC[1])) & (!rOPC[5] & ~&rOPC[5:4]);
|
|
assign wOPC = rMSR_C;
|
|
|
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;
|
Line 131... |
Line 162... |
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 SELECTOR --------------------------------------
|
/*
|
|
LOGIC
|
|
|
|
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[1: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[1:0])
|
endcase // case (rOPC[2:0])
|
|
|
|
/*
|
|
SIMPLE SHIFTER
|
|
|
// --- SHIFTER SELECTOR ------------------------------------
|
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, rRES_SFTC} <= #1 {rOPA[31],rOPA[31:0]};
|
2'o0: rRES_SFT <= {rOPA[31],rOPA[31:1]}; // SRA
|
2'o1: {rRES_SFT, rRES_SFTC} <= #1 {rMSR_C,rOPA[31:0]};
|
2'o1: rRES_SFT <= {rMSR_C,rOPA[31:1]}; // SRC
|
2'o2: {rRES_SFT, rRES_SFTC} <= #1 {1'b0,rOPA[31:0]};
|
2'o2: rRES_SFT <= {1'b0,rOPA[31:1]}; // SRL
|
2'o3: {rRES_SFT, rRES_SFTC} <= #1 (rIMM[0]) ? { {(16){rOPA[15]}}, rOPA[15:0], rMSR_C} :
|
2'o3: rRES_SFT <= (rIMM[0]) ?
|
{ {(24){rOPA[7]}}, rOPA[7:0], rMSR_C};
|
{{(16){rOPA[15]}}, rOPA[15:0]} : // SEXT16
|
|
{{(24){rOPA[7]}}, rOPA[7:0]}; // SEXT8
|
endcase // case (rIMM[6:5])
|
endcase // case (rIMM[6:5])
|
|
|
// --- MOVE SELECTOR ---------------------------------------
|
always @(/*AUTOSENSE*/rIMM or rMSR_C or rOPA)
|
|
rRES_SFTC <= (&rIMM[6:5]) ? rMSR_C : rOPA[0];
|
|
|
|
/*
|
|
MOVE FROM SPECIAL
|
|
|
|
MSR bits
|
|
31 - CC (carry copy)
|
|
30 - PHA (current phase)
|
|
29 - TXE (enable second thread)
|
|
|
|
3 - BIP (break in progress)
|
|
2 - C (carry flag)
|
|
1 - IE (interrupt enable)
|
|
0 - BE (bus-lock enable)
|
|
*/
|
|
|
wire wTXE = (TXE) ? 2'd1 : 2'd0;
|
wire wTXE = (TXE) ? 1'b1 : 1'b0;
|
wire [31:0] wMSR = {rMSR_C, // MSR_CC
|
wire [31:0] wMSR = {rMSR_C, // MSR_CC
|
pha_i, // Current phase
|
pha_i, // Current phase
|
!pha_i, // Current phase
|
rMSR_TXE, // Thread Execution Enabled
|
wTXE, // Thread Execution Enabled
|
wTXE,
|
4'h0, // Reserved
|
4'h0, // Reserved
|
8'hAE, // Vendor
|
8'hAE, // Vendor
|
8'h32, // Version
|
8'h32, // Version
|
4'h0, // Reserved
|
4'h0, // Reserved
|
rMSR_BIP, // MSR_BIP
|
rMSR_BIP, // MSR_BIP
|
Line 176... |
Line 230... |
rMSR_BE}; // MSR_BE
|
rMSR_BE}; // MSR_BE
|
|
|
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*/fMFPC or fMFSR or rOPA or rOPB or rPC_OF
|
always @(/*AUTOSENSE*/fMFSR or rOPA or rOPB or rRA or wMSR)
|
or rRA or wMSR)
|
|
rRES_MOV <= (fMFSR) ? wMSR :
|
rRES_MOV <= (fMFSR) ? wMSR :
|
(fMFPC) ? {rPC_OF, 2'd0} :
|
//(fMFPC) ? rOPA :
|
(rRA[3]) ? rOPB :
|
(rRA[3]) ? rOPB :
|
rOPA;
|
rOPA;
|
|
|
// --- MULTIPLIER ------------------------------------------
|
/*
|
// 2-stage
|
MULTIPLIER
|
|
|
|
Implemented as a 2-stage multiplier in order to increase clock
|
|
speed. */
|
|
|
reg [31:0] rRES_MUL;
|
reg [31:0] rRES_MUL;
|
always @(posedge clk_i) begin
|
always @(posedge clk_i) begin
|
rMUL_MA <= (MUL) ? rRES_MUL : 32'hX;
|
rMUL_MA <= (MUL) ? rRES_MUL : 32'hX;
|
rRES_MUL <= (rOPA * rOPB);
|
rRES_MUL <= (MUL) ? (rOPA * rOPB) : 32'hX;
|
end
|
end
|
|
|
// --- BARREL SHIFTER --------------------------------------
|
/*
|
// 1-stage
|
BARREL SHIFTER
|
|
|
|
This can be potentially made 2-stage to increase clock
|
|
speed. Doesn't seem necessary at the moment as the critical 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;
|
|
|
// Infer a 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];
|
|
|
// Infer a 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];
|
|
|
// Infer a 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]};
|
Line 243... |
Line 303... |
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) */
|
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])
|
|
|
|
|
// --- MSR REGISTER -----------------
|
/*
|
|
MSR REGISTER
|
|
|
|
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);
|
Line 269... |
Line 334... |
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
|
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 begin
|
if (pha_i)
|
if (pha_i & ena_i & rMSR_TXE)
|
rMSR_C1 <= #1 xMSR_C;
|
rMSR_C1 <= #1 xMSR_C;
|
else
|
|
rMSR_C0 <= #1 xMSR_C;
|
|
end
|
|
|
|
always @(posedge clk_i)
|
if (!pha_i & ena_i)
|
if (ena_i)
|
rMSR_C0 <= #1 xMSR_C;
|
rMSR_CL[pha_i] <= xMSR_C;
|
end // else: !if(rst_i)
|
|
|
// 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);
|
Line 302... |
Line 364... |
/*AUTORESET*/
|
/*AUTORESET*/
|
// Beginning of autoreset for uninitialized flops
|
// Beginning of autoreset for uninitialized flops
|
rMSR_BE <= 1'h0;
|
rMSR_BE <= 1'h0;
|
rMSR_BIP <= 1'h0;
|
rMSR_BIP <= 1'h0;
|
rMSR_IE <= 1'h0;
|
rMSR_IE <= 1'h0;
|
|
rMSR_TXE <= 1'h0;
|
// End of automatics
|
// End of automatics
|
end else if (ena_i) begin
|
end else if (ena_i) begin
|
|
|
|
// 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)
|
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
|
rMSR_BE <= #1
|
rMSR_BE <= #1
|
(fMTS) ? rOPA[0] : rMSR_BE;
|
(fMTS) ? rOPA[0] : rMSR_BE;
|
end
|
|
|
|
|
// Enable the thread extension
|
|
rMSR_TXE <= #1
|
|
(fMTS) ? rOPA[28] & TXE : rMSR_TXE;
|
|
|
|
end // if (ena_i)
|
|
|
// --- RESULT SELECTOR -------------------------------------------
|
/*
|
// Selects results from functional units.
|
RESULTS
|
|
*/
|
|
|
// RESULT
|
// RESULT
|
always @(posedge clk_i)
|
always @(posedge clk_i)
|
if (rst_i) begin
|
if (rst_i) begin
|
/*AUTORESET*/
|
/*AUTORESET*/
|
Line 346... |
Line 417... |
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)
|
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
|
|
appropriate byte select lanes depending on the byte offset of the
|
|
address. It does not check for mis-aligned addresses. */
|
|
|
|
// 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
|
Line 359... |
Line 437... |
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
|
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
|
Line 388... |
Line 466... |
initial begin
|
initial begin
|
for (r=0; r<TXE; r=r+1) begin
|
for (r=0; r<TXE; r=r+1) begin
|
rMSR_CL[r] <= $random;
|
rMSR_CL[r] <= $random;
|
end
|
end
|
end
|
end
|
|
|
// synopsys translate_on
|
// synopsys translate_on
|
|
|
endmodule // aeMB2_aslu
|
endmodule // aeMB2_aslu
|
|
|
/* $Log: not supported by cvs2svn $ */
|
|
No newline at end of file
|
No newline at end of file
|
|
/* $Log: not supported by cvs2svn $
|
|
/* Revision 1.1 2007/12/11 00:43:17 sybreon
|
|
/* initial import
|
|
/* */
|
No newline at end of file
|
No newline at end of file
|