OpenCores
URL https://opencores.org/ocsvn/aemb/aemb/trunk

Subversion Repositories aemb

[/] [aemb/] [trunk/] [rtl/] [verilog/] [aeMB_xecu.v] - Blame information for rev 41

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 41 sybreon
// $Id: aeMB_xecu.v,v 1.1 2007-11-02 03:25:41 sybreon Exp $
2
//
3
// AEMB MAIN EXECUTION ALU
4
//
5
// Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
6
//  
7
// This library is free software; you can redistribute it and/or
8
// modify it under the terms of the GNU Lesser General Public License
9
// as published by the Free Software Foundation; either version 2.1 of
10
// the License, or (at your option) any later version.
11
//
12
// This library is distributed in the hope that it will be useful, but
13
// WITHOUT ANY WARRANTY; without even the implied warranty of
14
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
// Lesser General Public License for more details.
16
//  
17
// You should have received a copy of the GNU Lesser General Public
18
// License along with this library; if not, write to the Free Software
19
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20
// USA
21
//
22
// $Log: not supported by cvs2svn $
23
 
24
module aeMB_xecu (/*AUTOARG*/
25
   // Outputs
26
   dwb_adr_o, dwb_sel_o, rRESULT, rOPA, rOPB, rDWBSEL, rMSR_IE,
27
   // Inputs
28
   rREGA, rREGB, rMXSRC, rMXTGT, rRA, rMXALU, rBRA, rDLY, rXCE, rSIMM,
29
   rIMM, rOPC, rRD, rDWBDI, rPC, rRES_MUL, rRES_BSF, gclk, grst, gena
30
   );
31
   parameter DW=32;
32
 
33
   // DATA WISHBONE
34
   output [DW-1:2] dwb_adr_o;
35
   output [3:0]    dwb_sel_o;
36
 
37
   // INTERNAL
38
   output [31:0]   rRESULT;
39
   output [31:0]   rOPA, rOPB;
40
   output [3:0]    rDWBSEL;
41
   output          rMSR_IE;
42
   input [31:0]    rREGA, rREGB;
43
   input [1:0]      rMXSRC, rMXTGT;
44
   input [4:0]      rRA;
45
   input [2:0]      rMXALU;
46
   input           rBRA, rDLY;
47
   input [1:0]      rXCE;
48
   input [31:0]    rSIMM;
49
   input [15:0]    rIMM;
50
   input [5:0]      rOPC;
51
   input [4:0]      rRD;
52
   input [31:0]    rDWBDI;
53
   input [31:2]    rPC;
54
   input [31:0]    rRES_MUL; // External Multiplier
55
   input [31:0]    rRES_BSF; // External Barrel Shifter
56
 
57
   // SYSTEM
58
   input           gclk, grst, gena;
59
 
60
   reg             rMSR_C, xMSR_C;
61
   reg             rMSR_IE, xMSR_IE;
62
 
63
   // --- OPERAND SELECT
64
 
65
   reg [31:0]       rOPA, rOPB;
66
   always @(/*AUTOSENSE*/rDWBDI or rMXSRC or rPC or rREGA or rRESULT)
67
     case (rMXSRC)
68
       2'o0: rOPA <= rREGA;
69
       2'o1: rOPA <= rRESULT;
70
       2'o2: rOPA <= rDWBDI;
71
       2'o3: rOPA <= {rPC, 2'o0};
72
     endcase // case (rMXSRC)
73
 
74
   always @(/*AUTOSENSE*/rDWBDI or rMXTGT or rREGB or rRESULT or rSIMM)
75
     case (rMXTGT)
76
       2'o0: rOPB <= rREGB;
77
       2'o1: rOPB <= rRESULT;
78
       2'o2: rOPB <= rDWBDI;
79
       2'o3: rOPB <= rSIMM;
80
     endcase // case (rMXTGT)
81
 
82
   // --- LOGIC SELECTOR ---
83
 
84
   reg [31:0]        rRES_LOG;
85
   always @(/*AUTOSENSE*/rOPA or rOPB or rOPC)
86
     case (rOPC[1:0])
87
       2'o0: rRES_LOG <= #1 rOPA | rOPB;
88
       2'o1: rRES_LOG <= #1 rOPA & rOPB;
89
       2'o2: rRES_LOG <= #1 rOPA ^ rOPB;
90
       2'o3: rRES_LOG <= #1 rOPA & ~rOPB;
91
     endcase // case (rOPC[1:0])
92
 
93
   // --- SHIFT SELECTOR ---
94
 
95
   reg [31:0]        rRES_SFT;
96
   reg              rRES_SFTC;
97
 
98
   always @(/*AUTOSENSE*/rIMM or rMSR_C or rOPA)
99
     case (rIMM[6:5])
100
       2'o0: {rRES_SFT, rRES_SFTC} <= #1 {rOPA[31],rOPA[31:0]};
101
       2'o1: {rRES_SFT, rRES_SFTC} <= #1 {rMSR_C,rOPA[31:0]};
102
       2'o2: {rRES_SFT, rRES_SFTC} <= #1 {1'b0,rOPA[31:0]};
103
       2'o3: {rRES_SFT, rRES_SFTC} <= #1 (rIMM[0]) ? { {(16){rOPA[15]}}, rOPA[15:0], rMSR_C} :
104
                                      { {(24){rOPA[7]}}, rOPA[7:0], rMSR_C};
105
     endcase // case (rIMM[6:5])
106
 
107
   // --- MOVE SELECTOR ---
108
 
109
   wire [31:0]       wMSR = {rMSR_C, 23'h0ED32, 5'b0, rMSR_C, rMSR_IE, 1'b0};
110
   wire             fMFSR = (rOPC == 6'o45) & !rIMM[14] & rIMM[0];
111
   wire             fMFPC = (rOPC == 6'o45) & !rIMM[14] & !rIMM[0];
112
   reg [31:0]        rRES_MOV;
113
   always @(/*AUTOSENSE*/fMFPC or fMFSR or rOPA or rOPB or rPC or rRA
114
            or wMSR)
115
     rRES_MOV <= (fMFSR) ? wMSR :
116
                 (fMFPC) ? rPC :
117
                 (rRA[3]) ? rOPB :
118
                 rOPA;
119
 
120
   // --- ADD/SUB SELECTOR ----
121
   // TODO: Refactor
122
   // TODO: Verify signed compare
123
 
124
   wire             wADDC, wSUBC, wRES_AC, wCMPC, wOPC;
125
   wire [31:0]       wADD, wSUB, wRES_A, wCMP, wOPX;
126
 
127
   wire             wCMPU = (rOPA > rOPB);
128
   wire             wCMPF = (rIMM[1]) ? wCMPU :
129
                            ((wCMPU & ~(rOPB[31] ^ rOPA[31])) | (rOPB[31] & ~rOPA[31]));
130
 
131
   assign           {wCMPC,wCMP} = {wSUBC,wCMPF,wSUB[30:0]};
132
   assign           wOPX = (rOPC[0] & !rOPC[5]) ? ~rOPA : rOPA ;
133
   assign           wOPC = ((rMSR_C & rOPC[1]) | (rOPC[0] & !rOPC[1])) & (!rOPC[5] & ~&rOPC[5:4]);
134
 
135
   assign           {wSUBC,wSUB} = {wADDC,wADD};
136
   assign           {wADDC,wADD} = (rOPB + wOPX) + wOPC;
137
 
138
   reg              rRES_ADDC;
139
   reg [31:0]        rRES_ADD;
140
   always @(rIMM or rOPC or wADD or wADDC or wCMP
141
            or wCMPC or wSUB or wSUBC)
142
     case ({rOPC[3],rOPC[0],rIMM[0]})
143
       4'h2, 4'h6, 4'h7: {rRES_ADDC,rRES_ADD} <= #1 {~wSUBC,wSUB}; // SUB
144
       4'h3: {rRES_ADDC,rRES_ADD} <= #1 {~wCMPC,wCMP}; // CMP
145
       default: {rRES_ADDC,rRES_ADD} <= #1 {wADDC,wADD};
146
     endcase // case ({rOPC[3],rOPC[0],rIMM[0]})
147
 
148
 
149
   // --- RESULT SELECTOR
150
 
151
   wire            fSKIP = rBRA & !rDLY;
152
   reg [31:0]       rRESULT, xRESULT;
153
 
154
   // RESULT
155
   always @(/*AUTOSENSE*/fSKIP or rMXALU or rRES_ADD or rRES_BSF
156
            or rRES_LOG or rRES_MOV or rRES_MUL or rRES_SFT)
157
     if (fSKIP)
158
       /*AUTORESET*/
159
       // Beginning of autoreset for uninitialized flops
160
       xRESULT <= 32'h0;
161
       // End of automatics
162
     else
163
       case (rMXALU)
164
         3'o0: xRESULT <= rRES_ADD;
165
         3'o1: xRESULT <= rRES_LOG;
166
         3'o2: xRESULT <= rRES_SFT;
167
         3'o3: xRESULT <= rRES_MOV;
168
         3'o4: xRESULT <= rRES_MUL;
169
         3'o5: xRESULT <= rRES_BSF;
170
         default: xRESULT <= 32'hX;
171
       endcase // case (rMXALU)
172
 
173
   // C
174
   wire            fMTS = (rOPC == 6'o45) & rIMM[14];
175
   wire            fADDC = ({rOPC[5:4], rOPC[2]} == 3'o0);
176
 
177
   always @(/*AUTOSENSE*/fADDC or fMTS or fSKIP or rMSR_C or rMXALU
178
            or rOPA or rRES_ADDC or rRES_SFTC)
179
     if (fSKIP)
180
       /*AUTORESET*/
181
       // Beginning of autoreset for uninitialized flops
182
       xMSR_C <= 1'h0;
183
       // End of automatics
184
     else
185
       case (rMXALU)
186
         3'o0: xMSR_C <= (fADDC) ? rRES_ADDC : rMSR_C;
187
         3'o1: xMSR_C <= rMSR_C; // LOGIC       
188
         3'o2: xMSR_C <= rRES_SFTC; // SHIFT
189
         3'o3: xMSR_C <= (fMTS) ? rOPA[2] : rMSR_C;
190
         3'o4: xMSR_C <= rMSR_C;
191
         3'o5: xMSR_C <= rMSR_C;
192
         default: xMSR_C <= 1'hX;
193
       endcase
194
 
195
   // IE
196
   wire             fRTID = (rOPC == 6'o55) & rRD[0];
197
   always @(/*AUTOSENSE*/fMTS or fRTID or rMSR_IE or rOPA) begin
198
      xMSR_IE <= //(rXCE == 2'o1) ? 1'b0 :
199
                 (fRTID) ? 1'b1 :
200
                 (fMTS) ? rOPA[1] :
201
                 rMSR_IE;
202
   end
203
 
204
   // --- DATA WISHBONE -----
205
 
206
   reg [3:0]         rDWBSEL, xDWBSEL;
207
   assign           dwb_adr_o = rRESULT[DW-1:2];
208
   assign           dwb_sel_o = rDWBSEL;
209
 
210
   always @(/*AUTOSENSE*/rOPC or wADD)
211
     case (rOPC[1:0])
212
       2'o0: case (wADD[1:0])
213
               2'o0: xDWBSEL <= 4'h8;
214
               2'o1: xDWBSEL <= 4'h4;
215
               2'o2: xDWBSEL <= 4'h2;
216
               2'o3: xDWBSEL <= 4'h1;
217
             endcase // case (wADD[1:0])
218
       2'o1: xDWBSEL <= (wADD[1]) ? 4'h3 : 4'hC;
219
       2'o2: xDWBSEL <= 4'hF;
220
       default: xDWBSEL <= 4'hX;
221
     endcase // case (rOPC[1:0])
222
 
223
     /*
224
     case (wADD[1:0])
225
       2'o0: case (rOPC[1:0])
226
               2'o0: xDWBSEL <= 4'h8;
227
               2'o1: xDWBSEL <= 4'hC;
228
               default: xDWBSEL <= 4'hF;
229
             endcase // case (rOPC[1:0])
230
       2'o1: xDWBSEL <= 4'h4;
231
       2'o2: xDWBSEL <= (rOPC[0]) ? 4'h3 : 4'h2;
232
       2'o3: xDWBSEL <= 4'h1;
233
     endcase // case (wADD[1:0])
234
      */
235
 
236
   // --- SYNC ---
237
 
238
   always @(posedge gclk)
239
     if (grst) begin
240
        rMSR_IE <= 1'b1;
241
        /*AUTORESET*/
242
        // Beginning of autoreset for uninitialized flops
243
        rDWBSEL <= 4'h0;
244
        rMSR_C <= 1'h0;
245
        rRESULT <= 32'h0;
246
        // End of automatics
247
     end else if (gena) begin
248
        rRESULT <= #1 xRESULT;
249
        rDWBSEL <= #1 xDWBSEL;
250
        rMSR_C <= #1 xMSR_C;
251
        rMSR_IE <= #1 xMSR_IE;
252
     end
253
 
254
   // synopsys translate_off
255
 
256
   // synopsys translate_on
257
 
258
endmodule // aeMB_xecu

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.