Line 1... |
Line 1... |
/* $Id: aeMB2_aslu.v,v 1.6 2007-12-16 20:38:06 sybreon Exp $
|
/* $Id: aeMB2_aslu.v,v 1.7 2007-12-17 12:53:27 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 99... |
Line 99... |
// End of automatics
|
// End of automatics
|
|
|
reg rMSR_C0,
|
reg rMSR_C0,
|
rMSR_C1,
|
rMSR_C1,
|
rMSR_C,
|
rMSR_C,
|
|
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;
|
Line 162... |
Line 163... |
|
|
// 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
|
|
((rOPC_IF[5:4] == 2'o0) & (rOPC_OF[1:0] == 2'o0)) ? 1'b0 : // ADD = 0
|
|
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;
|
// End of automatics
|
// End of automatics
|
end else if (ena_i) begin
|
end else if (ena_i) begin
|
rMSR_C <= #1 wMSR_C;
|
rMSR_C <= #1 wMSR_CX;
|
|
rMSR_CC <= #1 wMSR_C;
|
end
|
end
|
|
|
/*
|
/*
|
ADD/SUB SELECTOR
|
ADD/SUB SELECTOR
|
|
|
Line 194... |
Line 203... |
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 = ((wMSR_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_C;
|
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
|
Line 426... |
Line 435... |
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]) ? rOPC[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])
|
Line 552... |
Line 561... |
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.6 2007/12/16 20:38:06 sybreon
|
|
/* 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).
|