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

Subversion Repositories aemb

[/] [aemb/] [branches/] [DEV_SYBREON/] [rtl/] [verilog/] [aeMB2_aslu.v] - Blame information for rev 78

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

Line No. Rev Author Line
1 78 sybreon
/* $Id: aeMB2_aslu.v,v 1.1 2007-12-11 00:43:17 sybreon Exp $
2
**
3
** AEMB2 INTEGER ARITHMETIC SHIFT LOGIC UNIT
4
**
5
** Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
6
**
7
** This file is part of AEMB.
8
**
9
** 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
** You should have received a copy of the GNU Lesser General Public
20
** License along with AEMB. If not, see <http://www.gnu.org/licenses/>.
21
*/
22
 
23
module aeMB2_aslu (/*AUTOARG*/
24
   // Outputs
25
   dwb_adr_o, dwb_sel_o, rSEL_MA, cwb_adr_o, cwb_tga_o, cwb_sel_o,
26
   rMUL_MA, rRES_MA, rRES_EX, rMSR_IE, rMSR_BE, rMSR_BIP,
27
   // Inputs
28
   rIMM_OF, rALU_OF, rOPC_OF, rRA_OF, rRD_OF, rPC_OF, rOPA_OF,
29
   rOPB_OF, pha_i, clk_i, rst_i, ena_i
30
   );
31
 
32
   parameter DWB = 32;
33
 
34
   parameter MUL = 0;
35
   parameter BSF = 1;
36
   parameter FSL = 1;
37
 
38
   parameter TXE = 1;
39
   parameter LUT = 1;
40
 
41
   // DWB
42
   output [DWB-1:2] dwb_adr_o;
43
   output [3:0]     dwb_sel_o;
44
   output [3:0]     rSEL_MA;
45
 
46
   // FSL
47
   output [6:2]     cwb_adr_o;
48
   output [1:0]     cwb_tga_o;
49
   output [3:0]     cwb_sel_o;
50
 
51
   // PIPELINE
52
   output [31:0]    rMUL_MA;
53
   output [31:0]    rRES_MA,
54
                    rRES_EX;
55
 
56
   output           rMSR_IE,
57
                    rMSR_BE,
58
                    rMSR_BIP;
59
 
60
   input [15:0]     rIMM_OF;
61
   input [2:0]       rALU_OF;
62
   input [5:0]       rOPC_OF;
63
   input [4:0]       rRA_OF,
64
                    rRD_OF;
65
   input [31:2]     rPC_OF;
66
   input [31:0]     rOPA_OF, // RA, PC
67
                    rOPB_OF; // RB, IMM
68
 
69
   // SYSTEM
70
   input            pha_i,
71
                    clk_i,
72
                    rst_i,
73
                    ena_i;
74
 
75
   /*AUTOREG*/
76
   // Beginning of automatic regs (for this module's undeclared outputs)
77
   reg [6:2]            cwb_adr_o;
78
   reg [3:0]             cwb_sel_o;
79
   reg [1:0]             cwb_tga_o;
80
   reg [DWB-1:2]        dwb_adr_o;
81
   reg [3:0]             dwb_sel_o;
82
   reg                  rMSR_BE;
83
   reg                  rMSR_BIP;
84
   reg                  rMSR_IE;
85
   reg [31:0]            rMUL_MA;
86
   reg [31:0]            rRES_EX;
87
   reg [31:0]            rRES_MA;
88
   reg [3:0]             rSEL_MA;
89
   // End of automatics
90
 
91
   reg                  rMSR_C0,
92
                        rMSR_C1,
93
                        rMSR_CL[0:TXE];
94
 
95
 
96
   wire [4:0]        rRD = rRD_OF;
97
   wire [31:0]       rOPA = rOPA_OF;
98
   wire [31:0]       rOPB = rOPB_OF;
99
   wire [5:0]        rOPC = rOPC_OF;
100
   wire [4:0]        rRA = rRA_OF;
101
   wire [15:0]       rIMM = rIMM_OF;
102
   wire [10:0]       rALT = rIMM_OF[10:0];
103
 
104
   // --- ADD/SUB SELECTOR ----
105
   // FIXME: Redesign
106
   // TODO: Refactor
107
   // TODO: Verify signed compare
108
 
109
   wire             rMSR_CX = (!pha_i) ? rMSR_C0 : (TXE) ? rMSR_C1 : 1'bX;
110
   wire             rMSR_C = (LUT) ? rMSR_CL[pha_i] : rMSR_CX;
111
 
112
   wire             wADDC, wSUBC, wRES_AC, wCMPC, wOPC;
113
   wire [31:0]       wADD, wSUB, wRES_A, wCMP, wOPX;
114
 
115
   wire             wCMPU = (rOPA > rOPB);
116
   wire             wCMPF = (rIMM[1]) ? wCMPU :
117
                            ((wCMPU & ~(rOPB[31] ^ rOPA[31])) | (rOPB[31] & ~rOPA[31]));
118
 
119
   assign           {wCMPC,wCMP} = {wSUBC,wCMPF,wSUB[30:0]};
120
   assign           wOPX = (rOPC[0] & !rOPC[5]) ? ~rOPA : rOPA ;
121
   assign           wOPC = ((rMSR_C & rOPC[1]) | (rOPC[0] & !rOPC[1])) & (!rOPC[5] & ~&rOPC[5:4]);
122
 
123
   assign           {wSUBC,wSUB} = {wADDC,wADD};
124
   assign           {wADDC,wADD} = (rOPB + wOPX) + wOPC;
125
 
126
   reg              rRES_ADDC;
127
   reg [31:0]        rRES_ADD;
128
   always @(rIMM or rOPC or wADD or wADDC or wCMP
129
            or wCMPC or wSUB or wSUBC)
130
     case ({rOPC[3],rOPC[0],rIMM[0]})
131
       4'h2, 4'h6, 4'h7: {rRES_ADDC,rRES_ADD} <= #1 {~wSUBC,wSUB}; // SUB
132
       4'h3: {rRES_ADDC,rRES_ADD} <= #1 {~wCMPC,wCMP}; // CMP
133
       default: {rRES_ADDC,rRES_ADD} <= #1 {wADDC,wADD};
134
     endcase // case ({rOPC[3],rOPC[0],rIMM[0]})
135
 
136
   // --- LOGIC SELECTOR --------------------------------------
137
 
138
   reg [31:0]        rRES_LOG;
139
   always @(/*AUTOSENSE*/rOPA or rOPB or rOPC)
140
     case (rOPC[1:0])
141
       2'o0: rRES_LOG <= #1 rOPA | rOPB;
142
       2'o1: rRES_LOG <= #1 rOPA & rOPB;
143
       2'o2: rRES_LOG <= #1 rOPA ^ rOPB;
144
       2'o3: rRES_LOG <= #1 rOPA & ~rOPB;
145
     endcase // case (rOPC[1:0])
146
 
147
 
148
   // --- SHIFTER SELECTOR ------------------------------------
149
 
150
   reg [31:0]        rRES_SFT;
151
   reg              rRES_SFTC;
152
 
153
   always @(/*AUTOSENSE*/rIMM or rMSR_C or rOPA)
154
     case (rIMM[6:5])
155
       2'o0: {rRES_SFT, rRES_SFTC} <= #1 {rOPA[31],rOPA[31:0]};
156
       2'o1: {rRES_SFT, rRES_SFTC} <= #1 {rMSR_C,rOPA[31:0]};
157
       2'o2: {rRES_SFT, rRES_SFTC} <= #1 {1'b0,rOPA[31:0]};
158
       2'o3: {rRES_SFT, rRES_SFTC} <= #1 (rIMM[0]) ? { {(16){rOPA[15]}}, rOPA[15:0], rMSR_C} :
159
                                      { {(24){rOPA[7]}}, rOPA[7:0], rMSR_C};
160
     endcase // case (rIMM[6:5])
161
 
162
   // --- MOVE SELECTOR ---------------------------------------
163
 
164
   wire             wTXE = (TXE) ? 2'd1 : 2'd0;
165
   wire [31:0]       wMSR = {rMSR_C, // MSR_CC                       
166
                            pha_i, // Current phase
167
                            !pha_i, // Current phase
168
                            wTXE, // Thread Execution Enabled
169
                            4'h0, // Reserved
170
                            8'hAE, // Vendor
171
                            8'h32, // Version
172
                            4'h0, // Reserved
173
                            rMSR_BIP, // MSR_BIP
174
                            rMSR_C, // MSR_C
175
                            rMSR_IE, // MSR_IE
176
                            rMSR_BE}; // MSR_BE
177
 
178
   wire             fMFSR = (rOPC == 6'o45) & !rIMM[14] & rIMM[0];
179
   wire             fMFPC = (rOPC == 6'o45) & !rIMM[14] & !rIMM[0];
180
   reg [31:0]        rRES_MOV;
181
   always @(/*AUTOSENSE*/fMFPC or fMFSR or rOPA or rOPB or rPC_OF
182
            or rRA or wMSR)
183
     rRES_MOV <= (fMFSR) ? wMSR :
184
                 (fMFPC) ? {rPC_OF, 2'd0} :
185
                 (rRA[3]) ? rOPB :
186
                 rOPA;
187
 
188
   // --- MULTIPLIER ------------------------------------------
189
   // 2-stage
190
 
191
   reg [31:0]        rRES_MUL;
192
   always @(posedge clk_i) begin
193
      rMUL_MA <= (MUL) ? rRES_MUL : 32'hX;
194
      rRES_MUL <= (rOPA * rOPB);
195
   end
196
 
197
   // --- BARREL SHIFTER --------------------------------------
198
   // 1-stage
199
 
200
   reg [31:0]     rRES_BSF;
201
   reg [31:0]     xBSRL, xBSRA, xBSLL;
202
 
203
   // Infer a logical left barrel shifter.   
204
   always @(/*AUTOSENSE*/rOPA or rOPB)
205
     xBSLL <= rOPA << rOPB[4:0];
206
 
207
   // Infer a logical right barrel shifter.
208
   always @(/*AUTOSENSE*/rOPA or rOPB)
209
     xBSRL <= rOPA >> rOPB[4:0];
210
 
211
   // Infer a arithmetic right barrel shifter.
212
   always @(/*AUTOSENSE*/rOPA or rOPB)
213
     case (rOPB[4:0])
214
       5'd00: xBSRA <= rOPA;
215
       5'd01: xBSRA <= {{(1){rOPA[31]}}, rOPA[31:1]};
216
       5'd02: xBSRA <= {{(2){rOPA[31]}}, rOPA[31:2]};
217
       5'd03: xBSRA <= {{(3){rOPA[31]}}, rOPA[31:3]};
218
       5'd04: xBSRA <= {{(4){rOPA[31]}}, rOPA[31:4]};
219
       5'd05: xBSRA <= {{(5){rOPA[31]}}, rOPA[31:5]};
220
       5'd06: xBSRA <= {{(6){rOPA[31]}}, rOPA[31:6]};
221
       5'd07: xBSRA <= {{(7){rOPA[31]}}, rOPA[31:7]};
222
       5'd08: xBSRA <= {{(8){rOPA[31]}}, rOPA[31:8]};
223
       5'd09: xBSRA <= {{(9){rOPA[31]}}, rOPA[31:9]};
224
       5'd10: xBSRA <= {{(10){rOPA[31]}}, rOPA[31:10]};
225
       5'd11: xBSRA <= {{(11){rOPA[31]}}, rOPA[31:11]};
226
       5'd12: xBSRA <= {{(12){rOPA[31]}}, rOPA[31:12]};
227
       5'd13: xBSRA <= {{(13){rOPA[31]}}, rOPA[31:13]};
228
       5'd14: xBSRA <= {{(14){rOPA[31]}}, rOPA[31:14]};
229
       5'd15: xBSRA <= {{(15){rOPA[31]}}, rOPA[31:15]};
230
       5'd16: xBSRA <= {{(16){rOPA[31]}}, rOPA[31:16]};
231
       5'd17: xBSRA <= {{(17){rOPA[31]}}, rOPA[31:17]};
232
       5'd18: xBSRA <= {{(18){rOPA[31]}}, rOPA[31:18]};
233
       5'd19: xBSRA <= {{(19){rOPA[31]}}, rOPA[31:19]};
234
       5'd20: xBSRA <= {{(20){rOPA[31]}}, rOPA[31:20]};
235
       5'd21: xBSRA <= {{(21){rOPA[31]}}, rOPA[31:21]};
236
       5'd22: xBSRA <= {{(22){rOPA[31]}}, rOPA[31:22]};
237
       5'd23: xBSRA <= {{(23){rOPA[31]}}, rOPA[31:23]};
238
       5'd24: xBSRA <= {{(24){rOPA[31]}}, rOPA[31:24]};
239
       5'd25: xBSRA <= {{(25){rOPA[31]}}, rOPA[31:25]};
240
       5'd26: xBSRA <= {{(26){rOPA[31]}}, rOPA[31:26]};
241
       5'd27: xBSRA <= {{(27){rOPA[31]}}, rOPA[31:27]};
242
       5'd28: xBSRA <= {{(28){rOPA[31]}}, rOPA[31:28]};
243
       5'd29: xBSRA <= {{(29){rOPA[31]}}, rOPA[31:29]};
244
       5'd30: xBSRA <= {{(30){rOPA[31]}}, rOPA[31:30]};
245
       5'd31: xBSRA <= {{(31){rOPA[31]}}, rOPA[31]};
246
     endcase // case (rOPB[4:0])
247
 
248
   always @(/*AUTOSENSE*/rALT or xBSLL or xBSRA or xBSRL)
249
     case (rALT[10:9])
250
       2'd0: rRES_BSF <= xBSRL;
251
       2'd1: rRES_BSF <= xBSRA;
252
       2'd2: rRES_BSF <= xBSLL;
253
       default: rRES_BSF <= 32'hX;
254
     endcase // case (rALT[10:9])
255
 
256
 
257
   // --- MSR REGISTER -----------------
258
   reg           xMSR_C;
259
 
260
   // C
261
   wire            fMTS = (rOPC == 6'o45) & rIMM[14];
262
   wire            fADDC = ({rOPC[5:4], rOPC[2]} == 3'o0);
263
 
264
   always @(/*AUTOSENSE*/fADDC or fMTS or rALU_OF or rMSR_C or rOPA
265
            or rRES_ADDC or rRES_SFTC)
266
     case (rALU_OF)
267
       3'o0: xMSR_C <= (fADDC) ? rRES_ADDC : rMSR_C;
268
       3'o1: xMSR_C <= rMSR_C; // LOGIC       
269
       3'o2: xMSR_C <= rRES_SFTC; // SHIFT
270
       3'o3: xMSR_C <= (fMTS) ? rOPA[2] : rMSR_C;
271
       3'o4: xMSR_C <= rMSR_C;
272
       3'o5: xMSR_C <= rMSR_C;
273
       default: xMSR_C <= 1'hX;
274
     endcase
275
 
276
   always @(posedge clk_i)
277
     if (rst_i) begin
278
        /*AUTORESET*/
279
        // Beginning of autoreset for uninitialized flops
280
        rMSR_C0 <= 1'h0;
281
        rMSR_C1 <= 1'h0;
282
        // End of automatics
283
     end else if (ena_i) begin
284
        if (pha_i)
285
          rMSR_C1 <= #1 xMSR_C;
286
        else
287
          rMSR_C0 <= #1 xMSR_C;
288
     end
289
 
290
   always @(posedge clk_i)
291
     if (ena_i)
292
       rMSR_CL[pha_i] <= xMSR_C;
293
 
294
   // IE/BIP/BE
295
   wire             fRTID = (rOPC == 6'o55) & rRD[0];
296
   wire             fRTBD = (rOPC == 6'o55) & rRD[1];
297
   wire             fBRK = ((rOPC == 6'o56) | (rOPC == 6'o66)) & (rRA == 5'hC);
298
   wire             fINT = ((rOPC == 6'o56) | (rOPC == 6'o66)) & (rRA == 5'hE);
299
 
300
   always @(posedge clk_i)
301
     if (rst_i) begin
302
        /*AUTORESET*/
303
        // Beginning of autoreset for uninitialized flops
304
        rMSR_BE <= 1'h0;
305
        rMSR_BIP <= 1'h0;
306
        rMSR_IE <= 1'h0;
307
        // End of automatics
308
     end else if (ena_i) begin
309
 
310
        rMSR_IE <= #1
311
                   (fINT) ? 1'b0 :
312
                   (fRTID) ? 1'b1 :
313
                   (fMTS) ? rOPA[1] :
314
                   rMSR_IE;
315
 
316
        rMSR_BIP <= #1
317
                    (fBRK) ? 1'b1 :
318
                    (fRTBD) ? 1'b0 :
319
                    (fMTS) ? rOPA[3] :
320
                    rMSR_BIP;
321
 
322
        rMSR_BE <= #1
323
                   (fMTS) ? rOPA[0] : rMSR_BE;
324
     end
325
 
326
 
327
   // --- RESULT SELECTOR -------------------------------------------
328
   // Selects results from functional units. 
329
 
330
   // RESULT   
331
   always @(posedge clk_i)
332
     if (rst_i) begin
333
        /*AUTORESET*/
334
        // Beginning of autoreset for uninitialized flops
335
        rRES_EX <= 32'h0;
336
        rRES_MA <= 32'h0;
337
        // End of automatics
338
     end else if (ena_i) begin
339
        rRES_MA <= #1 rRES_EX;
340
        case (rALU_OF)
341
          3'o0: rRES_EX <= #1 rRES_ADD;
342
          3'o1: rRES_EX <= #1 rRES_LOG;
343
          3'o2: rRES_EX <= #1 rRES_SFT;
344
          3'o3: rRES_EX <= #1 rRES_MOV;
345
          //3'o4: rRES_EX <= (MUL) ? rRES_MUL : 32'hX;   
346
          3'o5: rRES_EX <= #1 (BSF) ? rRES_BSF : 32'hX;
347
          default: rRES_EX <= #1 32'hX;
348
        endcase // case (rALU_OF)
349
     end // if (ena_i)
350
 
351
   // --- DATA/FSL WISHBONE -----
352
 
353
   always @(posedge clk_i)
354
     if (rst_i) begin
355
        /*AUTORESET*/
356
        // Beginning of autoreset for uninitialized flops
357
        cwb_adr_o <= 5'h0;
358
        cwb_sel_o <= 4'h0;
359
        cwb_tga_o <= 2'h0;
360
        dwb_adr_o <= {(1+(DWB-1)-(2)){1'b0}};
361
        dwb_sel_o <= 4'h0;
362
        rSEL_MA <= 4'h0;
363
        // End of automatics
364
     end else if (ena_i) begin
365
        rSEL_MA <= #1 dwb_sel_o;
366
 
367
        dwb_adr_o <= #1 wADD[DWB-1:2];
368
        case (rOPC[1:0])
369
          2'o0: case (wADD[1:0]) // 8'bit
370
                  2'o0: dwb_sel_o <= #1 4'h8;
371
                  2'o1: dwb_sel_o <= #1 4'h4;
372
                  2'o2: dwb_sel_o <= #1 4'h2;
373
                  2'o3: dwb_sel_o <= #1 4'h1;
374
                endcase // case (wADD[1:0])
375
          2'o1: dwb_sel_o <= #1 (wADD[1]) ? 4'h3 : 4'hC; // 16'bit
376
          2'o2: dwb_sel_o <= #1 4'hF; // 32'bit
377
          2'o3: dwb_sel_o <= #1 4'h0; // FSL
378
        endcase // case (rOPC[1:0])
379
 
380
        {cwb_adr_o, cwb_tga_o} <= #1 {rIMM_OF[4:0], rIMM_OF[15:14]};
381
        cwb_sel_o <= #1 {(4){ &rOPC[1:0]}};
382
 
383
     end // if (ena_i)
384
 
385
 
386
   // synopsys translate_off
387
   integer r;
388
   initial begin
389
      for (r=0; r<TXE; r=r+1) begin
390
         rMSR_CL[r] <= $random;
391
      end
392
   end
393
 
394
   // synopsys translate_on
395
 
396
endmodule // aeMB2_aslu
397
 
398
/* $Log: not supported by cvs2svn $ */

powered by: WebSVN 2.1.0

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