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

Subversion Repositories aemb

[/] [aemb/] [branches/] [AEMB2_712/] [rtl/] [verilog/] [aeMB_ctrl.v] - Blame information for rev 61

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

Line No. Rev Author Line
1 61 sybreon
// $Id: aeMB_ctrl.v,v 1.7 2007-11-14 22:14:34 sybreon Exp $
2 41 sybreon
//
3
// AEMB CONTROL UNIT
4
// 
5
// Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
6
//  
7 55 sybreon
// This file is part of AEMB.
8 41 sybreon
//
9 55 sybreon
// AEMB is free software: you can redistribute it and/or modify it
10
// under the terms of the GNU Lesser General Public License as
11
// published by the Free Software Foundation, either version 3 of the
12
// License, or (at your option) any later version.
13
//
14
// AEMB is distributed in the hope that it will be useful, but WITHOUT
15
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16
// or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
17
// Public License for more details.
18
//
19 41 sybreon
// You should have received a copy of the GNU Lesser General Public
20 55 sybreon
// License along with AEMB. If not, see <http://www.gnu.org/licenses/>.
21 41 sybreon
//
22
// $Log: not supported by cvs2svn $
23 61 sybreon
// Revision 1.6  2007/11/10 16:39:38  sybreon
24
// Upgraded license to LGPLv3.
25
// Significant performance optimisations.
26
//
27 55 sybreon
// Revision 1.5  2007/11/09 20:51:52  sybreon
28
// Added GET/PUT support through a FSL bus.
29
//
30 53 sybreon
// Revision 1.4  2007/11/08 17:48:14  sybreon
31
// Fixed data WISHBONE arbitration problem (reported by J Lee).
32
//
33 51 sybreon
// Revision 1.3  2007/11/08 14:17:47  sybreon
34
// Parameterised optional components.
35
//
36 50 sybreon
// Revision 1.2  2007/11/02 19:20:58  sybreon
37
// Added better (beta) interrupt support.
38
// Changed MSR_IE to disabled at reset as per MB docs.
39
//
40 44 sybreon
// Revision 1.1  2007/11/02 03:25:40  sybreon
41
// New EDK 3.2 compatible design with optional barrel-shifter and multiplier.
42
// Fixed various minor data hazard bugs.
43
// Code compatible with -O0/1/2/3/s generated code.
44
//
45 41 sybreon
 
46
module aeMB_ctrl (/*AUTOARG*/
47
   // Outputs
48 53 sybreon
   rMXDST, rMXSRC, rMXTGT, rMXALT, rMXALU, rRW, rDWBSTB, rFSLSTB,
49
   dwb_stb_o, dwb_wre_o, fsl_stb_o, fsl_wre_o,
50 41 sybreon
   // Inputs
51 61 sybreon
   rDLY, rIMM, rALT, rOPC, rRD, rRA, rRB, rPC, rBRA, rMSR_IE, xIREG,
52
   dwb_ack_i, iwb_ack_i, fsl_ack_i, gclk, grst, gena
53 41 sybreon
   );
54
   // INTERNAL   
55
   //output [31:2] rPCLNK;
56
   output [1:0]  rMXDST;
57
   output [1:0]  rMXSRC, rMXTGT, rMXALT;
58
   output [2:0]  rMXALU;
59
   output [4:0]  rRW;
60 53 sybreon
   output        rDWBSTB;
61
   output        rFSLSTB;
62
 
63 61 sybreon
   //input [1:0]         rXCE;
64 41 sybreon
   input         rDLY;
65
   input [15:0]  rIMM;
66
   input [10:0]  rALT;
67
   input [5:0]    rOPC;
68
   input [4:0]    rRD, rRA, rRB;
69
   input [31:2]  rPC;
70
   input         rBRA;
71
   input         rMSR_IE;
72 61 sybreon
   input [31:0]  xIREG;
73 41 sybreon
 
74
   // DATA WISHBONE
75
   output        dwb_stb_o;
76
   output        dwb_wre_o;
77 51 sybreon
   input         dwb_ack_i;
78
 
79
   // INST WISHBONE
80 55 sybreon
   input         iwb_ack_i;
81 41 sybreon
 
82 53 sybreon
   // FSL WISHBONE
83
   output        fsl_stb_o;
84
   output        fsl_wre_o;
85
   input         fsl_ack_i;
86
 
87 41 sybreon
   // SYSTEM
88
   input         gclk, grst, gena;
89
 
90
   // --- DECODE INSTRUCTIONS
91
   // TODO: Simplify
92
 
93 55 sybreon
   wire [5:0]     wOPC;
94
   wire [4:0]     wRD, wRA, wRB;
95
   wire [10:0]    wALT;
96
 
97 61 sybreon
   assign        {wOPC, wRD, wRA, wRB, wALT} = xIREG; // FIXME: Endian
98 55 sybreon
 
99 41 sybreon
   wire          fSFT = (rOPC == 6'o44);
100
   wire          fLOG = ({rOPC[5:4],rOPC[2]} == 3'o4);
101
 
102
   wire          fMUL = (rOPC == 6'o20) | (rOPC == 6'o30);
103
   wire          fBSF = (rOPC == 6'o21) | (rOPC == 6'o31);
104
   wire          fDIV = (rOPC == 6'o22);
105
 
106
   wire          fRTD = (rOPC == 6'o55);
107
   wire          fBCC = (rOPC == 6'o47) | (rOPC == 6'o57);
108
   wire          fBRU = (rOPC == 6'o46) | (rOPC == 6'o56);
109
   wire          fBRA = fBRU & rRA[3];
110
 
111
   wire          fIMM = (rOPC == 6'o54);
112
   wire          fMOV = (rOPC == 6'o45);
113
 
114
   wire          fLOD = ({rOPC[5:4],rOPC[2]} == 3'o6);
115
   wire          fSTR = ({rOPC[5:4],rOPC[2]} == 3'o7);
116
   wire          fLDST = (&rOPC[5:4]);
117
 
118 53 sybreon
   wire          fPUT = (rOPC == 6'o33) & rRB[4];
119
   wire          fGET = (rOPC == 6'o33) & !rRB[4];
120 55 sybreon
 
121
 
122
   wire          wSFT = (wOPC == 6'o44);
123
   wire          wLOG = ({wOPC[5:4],wOPC[2]} == 3'o4);
124
 
125
   wire          wMUL = (wOPC == 6'o20) | (wOPC == 6'o30);
126
   wire          wBSF = (wOPC == 6'o21) | (wOPC == 6'o31);
127
   wire          wDIV = (wOPC == 6'o22);
128 41 sybreon
 
129 55 sybreon
   wire          wRTD = (wOPC == 6'o55);
130
   wire          wBCC = (wOPC == 6'o47) | (wOPC == 6'o57);
131
   wire          wBRU = (wOPC == 6'o46) | (wOPC == 6'o56);
132
   wire          wBRA = wBRU & wRA[3];
133
 
134
   wire          wIMM = (wOPC == 6'o54);
135
   wire          wMOV = (wOPC == 6'o45);
136
 
137
   wire          wLOD = ({wOPC[5:4],wOPC[2]} == 3'o6);
138
   wire          wSTR = ({wOPC[5:4],wOPC[2]} == 3'o7);
139
   wire          wLDST = (&wOPC[5:4]);
140
 
141
   wire          wPUT = (wOPC == 6'o33) & wRB[4];
142
   wire          wGET = (wOPC == 6'o33) & !wRB[4];
143
 
144
 
145
   // --- BRANCH SLOT REGISTERS ---------------------------
146
 
147
   reg [31:2]    rPCLNK, xPCLNK;
148
   reg [1:0]      rMXDST, xMXDST;
149
   reg [4:0]      rRW, xRW;
150
 
151
   reg [1:0]      rMXSRC, xMXSRC;
152
   reg [1:0]      rMXTGT, xMXTGT;
153
   reg [1:0]      rMXALT, xMXALT;
154
 
155
 
156 41 sybreon
   // --- OPERAND SELECTOR ---------------------------------
157
 
158 55 sybreon
   /*
159 41 sybreon
   wire          fRDWE = |rRW;
160
   wire          fAFWD_M = (rRW == rRA) & (rMXDST == 2'o2) & fRDWE;
161
   wire          fBFWD_M = (rRW == rRB) & (rMXDST == 2'o2) & fRDWE;
162
   wire          fAFWD_R = (rRW == rRA) & (rMXDST == 2'o0) & fRDWE;
163
   wire          fBFWD_R = (rRW == rRB) & (rMXDST == 2'o0) & fRDWE;
164
 
165
   assign        rMXSRC = (fBRU | fBCC) ? 2'o3 : // PC
166
                          (fAFWD_M) ? 2'o2: // RAM
167
                          (fAFWD_R) ? 2'o1: // FWD
168
                          2'o0; // REG
169
 
170
   assign        rMXTGT = (rOPC[3]) ? 2'o3 : // IMM
171
                          (fBFWD_M) ? 2'o2 : // RAM
172
                          (fBFWD_R) ? 2'o1 : // FWD
173
                          2'o0; // REG
174
 
175
   assign        rMXALT = (fAFWD_M) ? 2'o2 : // RAM
176
                          (fAFWD_R) ? 2'o1 : // FWD
177
                          2'o0; // REG
178 55 sybreon
   */
179
 
180
   wire          wRDWE = |xRW;
181
   wire          wAFWD_M = (xRW == wRA) & (xMXDST == 2'o2) & wRDWE;
182
   wire          wBFWD_M = (xRW == wRB) & (xMXDST == 2'o2) & wRDWE;
183
   wire          wAFWD_R = (xRW == wRA) & (xMXDST == 2'o0) & wRDWE;
184
   wire          wBFWD_R = (xRW == wRB) & (xMXDST == 2'o0) & wRDWE;
185
 
186 61 sybreon
   always @(/*AUTOSENSE*/rBRA or wAFWD_M or wAFWD_R or wBCC or wBFWD_M
187
            or wBFWD_R or wBRU or wOPC)
188
     //if (rBRA | |rXCE) begin
189
     if (rBRA) begin
190 55 sybreon
        /*AUTORESET*/
191
        // Beginning of autoreset for uninitialized flops
192
        xMXALT <= 2'h0;
193
        xMXSRC <= 2'h0;
194
        xMXTGT <= 2'h0;
195
        // End of automatics
196
     end else begin
197
        xMXSRC <= (wBRU | wBCC) ? 2'o3 : // PC
198
                  (wAFWD_M) ? 2'o2 : // RAM
199
                  (wAFWD_R) ? 2'o1 : // FWD
200
                  2'o0; // REG
201
        xMXTGT <= (wOPC[3]) ? 2'o3 : // IMM
202
                  (wBFWD_M) ? 2'o2 : // RAM
203
                  (wBFWD_R) ? 2'o1 : // FWD
204
                  2'o0; // REG
205
        xMXALT <= (wAFWD_M) ? 2'o2 : // RAM
206
                  (wAFWD_R) ? 2'o1 : // FWD
207
                  2'o0; // REG  
208
     end
209 41 sybreon
 
210
   // --- ALU CONTROL ---------------------------------------
211
 
212 55 sybreon
   /*
213 41 sybreon
   reg [2:0]     rMXALU;
214 55 sybreon
   always @(fBRA or fBSF or fDIV or fLOG or fMOV or fMUL
215
     or fSFT) begin
216 41 sybreon
      rMXALU <= (fBRA | fMOV) ? 3'o3 :
217
                (fSFT) ? 3'o2 :
218
                (fLOG) ? 3'o1 :
219
                (fMUL) ? 3'o4 :
220
                (fBSF) ? 3'o5 :
221
                (fDIV) ? 3'o6 :
222
                3'o0;
223
   end
224 55 sybreon
    */
225
 
226
   reg [2:0]     rMXALU, xMXALU;
227
 
228 61 sybreon
   always @(/*AUTOSENSE*/rBRA or wBRA or wBSF or wDIV or wLOG or wMOV
229
            or wMUL or wSFT)
230
     //if (rBRA | |rXCE) begin
231
     if (rBRA) begin
232 55 sybreon
        /*AUTORESET*/
233
        // Beginning of autoreset for uninitialized flops
234
        xMXALU <= 3'h0;
235
        // End of automatics
236
     end else begin
237
        xMXALU <= (wBRA | wMOV) ? 3'o3 :
238
                  (wSFT) ? 3'o2 :
239
                  (wLOG) ? 3'o1 :
240
                  (wMUL) ? 3'o4 :
241
                  (wBSF) ? 3'o5 :
242
                  (wDIV) ? 3'o6 :
243
                  3'o0;
244
     end
245 41 sybreon
 
246
   // --- DELAY SLOT REGISTERS ------------------------------
247
 
248 50 sybreon
   wire          fSKIP = (rBRA & !rDLY);
249 51 sybreon
 
250 53 sybreon
   always @(/*AUTOSENSE*/fBCC or fBRU or fGET or fLOD or fRTD or fSKIP
251 61 sybreon
            or fSTR or rRD)
252 41 sybreon
     if (fSKIP) begin
253
        /*AUTORESET*/
254
        // Beginning of autoreset for uninitialized flops
255
        xMXDST <= 2'h0;
256
        xRW <= 5'h0;
257
        // End of automatics
258
     end else begin
259 61 sybreon
        /*
260 41 sybreon
        case (rXCE)
261 44 sybreon
          2'o2: xMXDST <= 2'o1;
262 41 sybreon
          default: xMXDST <= (fSTR | fRTD | fBCC) ? 2'o3 :
263 53 sybreon
                             (fLOD | fGET) ? 2'o2 :
264 41 sybreon
                             (fBRU) ? 2'o1 :
265
                             2'o0;
266 44 sybreon
        endcase
267
 
268 41 sybreon
        case (rXCE)
269 44 sybreon
          2'o2: xRW <= 5'd14;
270 41 sybreon
          default: xRW <= rRD;
271 44 sybreon
        endcase
272 61 sybreon
        */
273
        xMXDST <= (fSTR | fRTD | fBCC) ? 2'o3 :
274
                  (fLOD | fGET) ? 2'o2 :
275
                  (fBRU) ? 2'o1 :
276
                  2'o0;
277
        xRW <= rRD;
278 44 sybreon
     end // else: !if(fSKIP)
279 53 sybreon
 
280
 
281
   // --- DATA WISHBONE ----------------------------------
282
 
283
   wire          fDACK = !(rDWBSTB ^ dwb_ack_i);
284 41 sybreon
 
285 53 sybreon
   reg           rDWBSTB, xDWBSTB;
286
   reg           rDWBWRE, xDWBWRE;
287
 
288
   assign        dwb_stb_o = rDWBSTB;
289
   assign        dwb_wre_o = rDWBWRE;
290 41 sybreon
 
291 53 sybreon
 
292 61 sybreon
   always @(/*AUTOSENSE*/fLOD or fSKIP or fSTR or iwb_ack_i)
293
     //if (fSKIP | |rXCE) begin
294
     if (fSKIP) begin
295 41 sybreon
        /*AUTORESET*/
296
        // Beginning of autoreset for uninitialized flops
297 53 sybreon
        xDWBSTB <= 1'h0;
298
        xDWBWRE <= 1'h0;
299 41 sybreon
        // End of automatics
300 53 sybreon
     end else begin
301
        xDWBSTB <= (fLOD | fSTR) & iwb_ack_i;
302
        xDWBWRE <= fSTR & iwb_ack_i;
303 51 sybreon
     end
304 53 sybreon
 
305 51 sybreon
   always @(posedge gclk)
306
     if (grst) begin
307
        /*AUTORESET*/
308
        // Beginning of autoreset for uninitialized flops
309
        rDWBSTB <= 1'h0;
310
        rDWBWRE <= 1'h0;
311
        // End of automatics
312
     end else if (fDACK) begin
313 41 sybreon
        rDWBSTB <= #1 xDWBSTB;
314
        rDWBWRE <= #1 xDWBWRE;
315 51 sybreon
     end
316 41 sybreon
 
317 53 sybreon
 
318
   // --- FSL WISHBONE -----------------------------------
319
 
320
   wire          fFACK = !(rFSLSTB ^ fsl_ack_i);
321
 
322
   reg           rFSLSTB, xFSLSTB;
323
   reg           rFSLWRE, xFSLWRE;
324
 
325
   assign        fsl_stb_o = rFSLSTB;
326
   assign        fsl_wre_o = rFSLWRE;
327
 
328 61 sybreon
   always @(/*AUTOSENSE*/fGET or fPUT or fSKIP or iwb_ack_i)
329
     //if (fSKIP | |rXCE) begin
330
     if (fSKIP) begin
331 53 sybreon
        /*AUTORESET*/
332
        // Beginning of autoreset for uninitialized flops
333
        xFSLSTB <= 1'h0;
334
        xFSLWRE <= 1'h0;
335
        // End of automatics
336
     end else begin
337
        xFSLSTB <= (fPUT | fGET) & iwb_ack_i;
338
        xFSLWRE <= fPUT & iwb_ack_i;
339
     end
340
 
341
   always @(posedge gclk)
342
     if (grst) begin
343
        /*AUTORESET*/
344
        // Beginning of autoreset for uninitialized flops
345
        rFSLSTB <= 1'h0;
346
        rFSLWRE <= 1'h0;
347
        // End of automatics
348
     end else if (fFACK) begin
349
        rFSLSTB <= #1 xFSLSTB;
350
        rFSLWRE <= #1 xFSLWRE;
351
     end
352 41 sybreon
 
353 53 sybreon
   // --- PIPELINE CONTROL DELAY ----------------------------
354
 
355
   always @(posedge gclk)
356
     if (grst) begin
357
        /*AUTORESET*/
358
        // Beginning of autoreset for uninitialized flops
359 55 sybreon
        rMXALT <= 2'h0;
360
        rMXALU <= 3'h0;
361 53 sybreon
        rMXDST <= 2'h0;
362 55 sybreon
        rMXSRC <= 2'h0;
363
        rMXTGT <= 2'h0;
364 53 sybreon
        rRW <= 5'h0;
365
        // End of automatics
366
     end else if (gena) begin
367
        //rPCLNK <= #1 xPCLNK;
368
        rMXDST <= #1 xMXDST;
369
        rRW <= #1 xRW;
370 55 sybreon
        rMXSRC <= #1 xMXSRC;
371
        rMXTGT <= #1 xMXTGT;
372
        rMXALT <= #1 xMXALT;
373
        rMXALU <= #1 xMXALU;
374 53 sybreon
     end
375
 
376
 
377 41 sybreon
endmodule // aeMB_ctrl

powered by: WebSVN 2.1.0

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