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 80

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

Line No. Rev Author Line
1 80 sybreon
/* $Id: aeMB2_aslu.v,v 1.2 2007-12-12 19:16:59 sybreon Exp $
2 78 sybreon
**
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 80 sybreon
   rMUL_MA, rRES_MA, rRES_EX, rMSR_IE, rMSR_BE, rMSR_TXE, rMSR_BIP,
27 78 sybreon
   // Inputs
28 80 sybreon
   rIMM_OF, rALU_OF, rOPC_OF, rOPC_IF, rRA_OF, rRD_OF, rOPA_OF,
29 78 sybreon
   rOPB_OF, pha_i, clk_i, rst_i, ena_i
30
   );
31
 
32
   parameter DWB = 32;
33 80 sybreon
   parameter TXE = 1;
34 78 sybreon
 
35
   parameter MUL = 0;
36
   parameter BSF = 1;
37
   parameter FSL = 1;
38
 
39
   // DWB
40
   output [DWB-1:2] dwb_adr_o;
41
   output [3:0]     dwb_sel_o;
42
   output [3:0]     rSEL_MA;
43
 
44
   // FSL
45
   output [6:2]     cwb_adr_o;
46
   output [1:0]     cwb_tga_o;
47
   output [3:0]     cwb_sel_o;
48
 
49
   // PIPELINE
50
   output [31:0]    rMUL_MA;
51
   output [31:0]    rRES_MA,
52
                    rRES_EX;
53
 
54
   output           rMSR_IE,
55
                    rMSR_BE,
56 80 sybreon
                    rMSR_TXE,
57 78 sybreon
                    rMSR_BIP;
58
 
59
   input [15:0]     rIMM_OF;
60
   input [2:0]       rALU_OF;
61 80 sybreon
   input [5:0]       rOPC_OF,
62
                    rOPC_IF;
63
 
64 78 sybreon
   input [4:0]       rRA_OF,
65
                    rRD_OF;
66 80 sybreon
 
67 78 sybreon
   input [31:0]     rOPA_OF, // RA, PC
68
                    rOPB_OF; // RB, IMM
69
 
70
   // SYSTEM
71
   input            pha_i,
72
                    clk_i,
73
                    rst_i,
74
                    ena_i;
75
 
76
   /*AUTOREG*/
77
   // Beginning of automatic regs (for this module's undeclared outputs)
78
   reg [6:2]            cwb_adr_o;
79
   reg [3:0]             cwb_sel_o;
80
   reg [1:0]             cwb_tga_o;
81
   reg [DWB-1:2]        dwb_adr_o;
82
   reg [3:0]             dwb_sel_o;
83
   reg                  rMSR_BE;
84
   reg                  rMSR_BIP;
85
   reg                  rMSR_IE;
86 80 sybreon
   reg                  rMSR_TXE;
87 78 sybreon
   reg [31:0]            rMUL_MA;
88
   reg [31:0]            rRES_EX;
89
   reg [31:0]            rRES_MA;
90
   reg [3:0]             rSEL_MA;
91
   // End of automatics
92
 
93
   reg                  rMSR_C0,
94
                        rMSR_C1,
95 80 sybreon
                        rMSR_CL[0:1];
96 78 sybreon
 
97
 
98 80 sybreon
   wire [4:0]            rRD = rRD_OF;
99
   wire [31:0]           rOPA = rOPA_OF;
100
   wire [31:0]           rOPB = rOPB_OF;
101
   wire [5:0]            rOPC = rOPC_OF;
102
   wire [4:0]            rRA = rRA_OF;
103
   wire [15:0]           rIMM = rIMM_OF;
104
   wire [10:0]           rALT = rIMM_OF[10:0];
105
 
106
   /*
107
    C SELECTOR
108
 
109
    Preselects the C in the OF stage to speed things up.  */
110
 
111
   // TODO: Optimise
112 78 sybreon
 
113 80 sybreon
   wire                 wMSR_CX, wMSR_C;
114
   assign               wMSR_CX = (pha_i) ? rMSR_C0 :
115
                                  (TXE) ? rMSR_C1 : 1'bX;
116
 
117
   assign               wMSR_C = (rOPC_IF == 6'o44) & wMSR_CX | // SRX
118
                                 (rOPC_IF[5:4] == 2'o0) & rOPC_IF[1] & wMSR_CX | // ADDC/RSUBC
119
                                 (rOPC_IF[5:4] == 2'o0) & (rOPC_IF[1:0] == 2'o1); // RSUB
120
 
121
   reg                  rMSR_C;
122
 
123
   always @(posedge clk_i)
124
     if (rst_i) begin
125
        /*AUTORESET*/
126
        // Beginning of autoreset for uninitialized flops
127
        rMSR_C <= 1'h0;
128
        // End of automatics
129
     end else if (ena_i) begin
130
        rMSR_C <= #1 wMSR_C;
131
     end
132
 
133
   /*
134
    ADD/SUB SELECTOR
135
 
136
    Current implementation is a clutz. It needs to be
137
    re-implemented. It is also in the critical path.  */
138
 
139 78 sybreon
   // FIXME: Redesign
140 80 sybreon
   // TODO: Verify signed compare   
141
 
142
   wire                 wADDC, wSUBC, wRES_AC, wCMPC, wOPC;
143
   wire [31:0]           wADD, wSUB, wRES_A, wCMP, wOPX;
144 78 sybreon
 
145 80 sybreon
   wire                 wCMPU = (rOPA > rOPB);
146
   wire                 wCMPF = (rIMM[1]) ? wCMPU :
147
                        ((wCMPU & ~(rOPB[31] ^ rOPA[31])) | (rOPB[31] & ~rOPA[31]));
148 78 sybreon
 
149 80 sybreon
   assign               {wCMPC,wCMP} = {wSUBC,wCMPF,wSUB[30:0]};
150
   assign               wOPX = (rOPC[0] & !rOPC[5]) ? ~rOPA : rOPA ;
151
   //assign             wOPC = ((wMSR_C & rOPC[1]) | (rOPC[0] & !rOPC[1])) & (!rOPC[5] & ~&rOPC[5:4]);
152
   assign               wOPC = rMSR_C;
153 78 sybreon
 
154 80 sybreon
   assign               {wSUBC,wSUB} = {wADDC,wADD};
155
   assign               {wADDC,wADD} = (rOPB + wOPX) + wOPC;
156 78 sybreon
 
157 80 sybreon
   reg                  rRES_ADDC;
158
   reg [31:0]            rRES_ADD;
159 78 sybreon
   always @(rIMM or rOPC or wADD or wADDC or wCMP
160
            or wCMPC or wSUB or wSUBC)
161
     case ({rOPC[3],rOPC[0],rIMM[0]})
162
       4'h2, 4'h6, 4'h7: {rRES_ADDC,rRES_ADD} <= #1 {~wSUBC,wSUB}; // SUB
163
       4'h3: {rRES_ADDC,rRES_ADD} <= #1 {~wCMPC,wCMP}; // CMP
164
       default: {rRES_ADDC,rRES_ADD} <= #1 {wADDC,wADD};
165
     endcase // case ({rOPC[3],rOPC[0],rIMM[0]})
166
 
167 80 sybreon
   /*
168
    LOGIC
169
 
170
    This can be combined with the shifter below.
171
    */
172 78 sybreon
 
173 80 sybreon
   reg [31:0]            rRES_LOG;
174 78 sybreon
   always @(/*AUTOSENSE*/rOPA or rOPB or rOPC)
175 80 sybreon
     case (rOPC[2:0])
176 78 sybreon
       2'o0: rRES_LOG <= #1 rOPA | rOPB;
177
       2'o1: rRES_LOG <= #1 rOPA & rOPB;
178
       2'o2: rRES_LOG <= #1 rOPA ^ rOPB;
179 80 sybreon
       2'o3: rRES_LOG <= #1 rOPA & ~rOPB;
180
     endcase // case (rOPC[2:0])
181 78 sybreon
 
182 80 sybreon
   /*
183
    SIMPLE SHIFTER
184
 
185
    Implemented as wiring and registers.
186
    */
187 78 sybreon
 
188 80 sybreon
   reg [31:0]            rRES_SFT;
189
   reg                  rRES_SFTC;
190 78 sybreon
 
191
   always @(/*AUTOSENSE*/rIMM or rMSR_C or rOPA)
192
     case (rIMM[6:5])
193 80 sybreon
       2'o0: rRES_SFT <= {rOPA[31],rOPA[31:1]}; // SRA
194
       2'o1: rRES_SFT <= {rMSR_C,rOPA[31:1]}; // SRC
195
       2'o2: rRES_SFT <= {1'b0,rOPA[31:1]}; // SRL
196
       2'o3: rRES_SFT <= (rIMM[0]) ?
197
                         {{(16){rOPA[15]}}, rOPA[15:0]} : // SEXT16
198
                         {{(24){rOPA[7]}}, rOPA[7:0]}; // SEXT8
199 78 sybreon
     endcase // case (rIMM[6:5])
200
 
201 80 sybreon
   always @(/*AUTOSENSE*/rIMM or rMSR_C or rOPA)
202
     rRES_SFTC <= (&rIMM[6:5]) ? rMSR_C : rOPA[0];
203
 
204
   /*
205
    MOVE FROM SPECIAL
206
 
207
    MSR bits
208
    31 - CC (carry copy)
209
    30 - PHA (current phase)
210
    29 - TXE (enable second thread)
211 78 sybreon
 
212 80 sybreon
     3 - BIP (break in progress)
213
     2 - C (carry flag)
214
     1 - IE (interrupt enable)
215
 
216
    */
217
 
218
   wire                 wTXE = (TXE) ? 1'b1 : 1'b0;
219
   wire [31:0]           wMSR = {rMSR_C, // MSR_CC               
220
                                pha_i, // Current phase
221
                                rMSR_TXE, // Thread Execution Enabled
222
                                wTXE,
223
                                4'h0, // Reserved
224
                                8'hAE, // Vendor
225
                                8'h32, // Version
226
                                4'h0, // Reserved
227
                                rMSR_BIP, // MSR_BIP
228
                                rMSR_C, // MSR_C
229
                                rMSR_IE, // MSR_IE
230
                                rMSR_BE}; // MSR_BE
231 78 sybreon
 
232 80 sybreon
   wire                 fMFSR = (rOPC == 6'o45) & !rIMM[14] & rIMM[0];
233
   wire                 fMFPC = (rOPC == 6'o45) & !rIMM[14] & !rIMM[0];
234
   reg [31:0]            rRES_MOV;
235
   always @(/*AUTOSENSE*/fMFSR or rOPA or rOPB or rRA or wMSR)
236 78 sybreon
     rRES_MOV <= (fMFSR) ? wMSR :
237 80 sybreon
                 //(fMFPC) ? rOPA :
238 78 sybreon
                 (rRA[3]) ? rOPB :
239
                 rOPA;
240
 
241 80 sybreon
   /*
242
    MULTIPLIER
243
 
244
    Implemented as a 2-stage multiplier in order to increase clock
245
    speed. */
246 78 sybreon
 
247
   reg [31:0]        rRES_MUL;
248
   always @(posedge clk_i) begin
249
      rMUL_MA <= (MUL) ? rRES_MUL : 32'hX;
250 80 sybreon
      rRES_MUL <= (MUL) ? (rOPA * rOPB) : 32'hX;
251 78 sybreon
   end
252
 
253 80 sybreon
   /*
254
    BARREL SHIFTER
255
 
256
    This can be potentially made 2-stage to increase clock
257
    speed. Doesn't seem necessary at the moment as the critical path
258
    runs through the adder. */
259 78 sybreon
 
260
   reg [31:0]     rRES_BSF;
261
   reg [31:0]     xBSRL, xBSRA, xBSLL;
262
 
263 80 sybreon
   /* logical left barrel shifter */
264 78 sybreon
   always @(/*AUTOSENSE*/rOPA or rOPB)
265
     xBSLL <= rOPA << rOPB[4:0];
266
 
267 80 sybreon
   /* logical right barrel shifter */
268 78 sybreon
   always @(/*AUTOSENSE*/rOPA or rOPB)
269
     xBSRL <= rOPA >> rOPB[4:0];
270
 
271 80 sybreon
   /* arithmetic right barrel shifter */
272 78 sybreon
   always @(/*AUTOSENSE*/rOPA or rOPB)
273
     case (rOPB[4:0])
274
       5'd00: xBSRA <= rOPA;
275
       5'd01: xBSRA <= {{(1){rOPA[31]}}, rOPA[31:1]};
276
       5'd02: xBSRA <= {{(2){rOPA[31]}}, rOPA[31:2]};
277
       5'd03: xBSRA <= {{(3){rOPA[31]}}, rOPA[31:3]};
278
       5'd04: xBSRA <= {{(4){rOPA[31]}}, rOPA[31:4]};
279
       5'd05: xBSRA <= {{(5){rOPA[31]}}, rOPA[31:5]};
280
       5'd06: xBSRA <= {{(6){rOPA[31]}}, rOPA[31:6]};
281
       5'd07: xBSRA <= {{(7){rOPA[31]}}, rOPA[31:7]};
282
       5'd08: xBSRA <= {{(8){rOPA[31]}}, rOPA[31:8]};
283
       5'd09: xBSRA <= {{(9){rOPA[31]}}, rOPA[31:9]};
284
       5'd10: xBSRA <= {{(10){rOPA[31]}}, rOPA[31:10]};
285
       5'd11: xBSRA <= {{(11){rOPA[31]}}, rOPA[31:11]};
286
       5'd12: xBSRA <= {{(12){rOPA[31]}}, rOPA[31:12]};
287
       5'd13: xBSRA <= {{(13){rOPA[31]}}, rOPA[31:13]};
288
       5'd14: xBSRA <= {{(14){rOPA[31]}}, rOPA[31:14]};
289
       5'd15: xBSRA <= {{(15){rOPA[31]}}, rOPA[31:15]};
290
       5'd16: xBSRA <= {{(16){rOPA[31]}}, rOPA[31:16]};
291
       5'd17: xBSRA <= {{(17){rOPA[31]}}, rOPA[31:17]};
292
       5'd18: xBSRA <= {{(18){rOPA[31]}}, rOPA[31:18]};
293
       5'd19: xBSRA <= {{(19){rOPA[31]}}, rOPA[31:19]};
294
       5'd20: xBSRA <= {{(20){rOPA[31]}}, rOPA[31:20]};
295
       5'd21: xBSRA <= {{(21){rOPA[31]}}, rOPA[31:21]};
296
       5'd22: xBSRA <= {{(22){rOPA[31]}}, rOPA[31:22]};
297
       5'd23: xBSRA <= {{(23){rOPA[31]}}, rOPA[31:23]};
298
       5'd24: xBSRA <= {{(24){rOPA[31]}}, rOPA[31:24]};
299
       5'd25: xBSRA <= {{(25){rOPA[31]}}, rOPA[31:25]};
300
       5'd26: xBSRA <= {{(26){rOPA[31]}}, rOPA[31:26]};
301
       5'd27: xBSRA <= {{(27){rOPA[31]}}, rOPA[31:27]};
302
       5'd28: xBSRA <= {{(28){rOPA[31]}}, rOPA[31:28]};
303
       5'd29: xBSRA <= {{(29){rOPA[31]}}, rOPA[31:29]};
304
       5'd30: xBSRA <= {{(30){rOPA[31]}}, rOPA[31:30]};
305
       5'd31: xBSRA <= {{(31){rOPA[31]}}, rOPA[31]};
306
     endcase // case (rOPB[4:0])
307
 
308 80 sybreon
   /* select the shift result (2nd stage) */
309 78 sybreon
   always @(/*AUTOSENSE*/rALT or xBSLL or xBSRA or xBSRL)
310
     case (rALT[10:9])
311
       2'd0: rRES_BSF <= xBSRL;
312
       2'd1: rRES_BSF <= xBSRA;
313
       2'd2: rRES_BSF <= xBSLL;
314
       default: rRES_BSF <= 32'hX;
315
     endcase // case (rALT[10:9])
316
 
317
 
318 80 sybreon
   /*
319
    MSR REGISTER
320
 
321
    Move data to the MSR or change due to break/returns. */
322
 
323 78 sybreon
   reg           xMSR_C;
324
 
325
   // C
326 80 sybreon
   wire          fMTS = (rOPC == 6'o45) & rIMM[14];
327
   wire          fADDC = ({rOPC[5:4], rOPC[2]} == 3'o0);
328 78 sybreon
 
329
   always @(/*AUTOSENSE*/fADDC or fMTS or rALU_OF or rMSR_C or rOPA
330
            or rRES_ADDC or rRES_SFTC)
331
     case (rALU_OF)
332
       3'o0: xMSR_C <= (fADDC) ? rRES_ADDC : rMSR_C;
333
       3'o1: xMSR_C <= rMSR_C; // LOGIC       
334
       3'o2: xMSR_C <= rRES_SFTC; // SHIFT
335
       3'o3: xMSR_C <= (fMTS) ? rOPA[2] : rMSR_C;
336
       3'o4: xMSR_C <= rMSR_C;
337
       3'o5: xMSR_C <= rMSR_C;
338
       default: xMSR_C <= 1'hX;
339 80 sybreon
     endcase // case (rALU_OF)
340 78 sybreon
 
341
   always @(posedge clk_i)
342
     if (rst_i) begin
343
        /*AUTORESET*/
344
        // Beginning of autoreset for uninitialized flops
345
        rMSR_C0 <= 1'h0;
346
        rMSR_C1 <= 1'h0;
347
        // End of automatics
348 80 sybreon
     end else begin
349
        if (pha_i & ena_i & rMSR_TXE)
350 78 sybreon
          rMSR_C1 <= #1 xMSR_C;
351 80 sybreon
 
352
        if (!pha_i & ena_i)
353 78 sybreon
          rMSR_C0 <= #1 xMSR_C;
354 80 sybreon
     end // else: !if(rst_i)
355 78 sybreon
 
356
   // IE/BIP/BE
357
   wire             fRTID = (rOPC == 6'o55) & rRD[0];
358
   wire             fRTBD = (rOPC == 6'o55) & rRD[1];
359
   wire             fBRK = ((rOPC == 6'o56) | (rOPC == 6'o66)) & (rRA == 5'hC);
360
   wire             fINT = ((rOPC == 6'o56) | (rOPC == 6'o66)) & (rRA == 5'hE);
361
 
362
   always @(posedge clk_i)
363
     if (rst_i) begin
364
        /*AUTORESET*/
365
        // Beginning of autoreset for uninitialized flops
366
        rMSR_BE <= 1'h0;
367
        rMSR_BIP <= 1'h0;
368
        rMSR_IE <= 1'h0;
369 80 sybreon
        rMSR_TXE <= 1'h0;
370 78 sybreon
        // End of automatics
371
     end else if (ena_i) begin
372
 
373 80 sybreon
        // Interrupt enable (compatible)
374 78 sybreon
        rMSR_IE <= #1
375
                   (fINT) ? 1'b0 :
376
                   (fRTID) ? 1'b1 :
377
                   (fMTS) ? rOPA[1] :
378
                   rMSR_IE;
379 80 sybreon
 
380
        // Break in progress (compatible)
381 78 sybreon
        rMSR_BIP <= #1
382
                    (fBRK) ? 1'b1 :
383
                    (fRTBD) ? 1'b0 :
384
                    (fMTS) ? rOPA[3] :
385
                    rMSR_BIP;
386 80 sybreon
 
387
        // Forcibly assert dwb_cyc_o signal     
388 78 sybreon
        rMSR_BE <= #1
389 80 sybreon
                   (fMTS) ? rOPA[0] : rMSR_BE;
390 78 sybreon
 
391 80 sybreon
        // Enable the thread extension
392
        rMSR_TXE <= #1
393
                    (fMTS) ? rOPA[28] & TXE : rMSR_TXE;
394
 
395
     end // if (ena_i)
396 78 sybreon
 
397 80 sybreon
   /*
398
    RESULTS
399
    */
400
 
401 78 sybreon
   // RESULT   
402
   always @(posedge clk_i)
403
     if (rst_i) begin
404
        /*AUTORESET*/
405
        // Beginning of autoreset for uninitialized flops
406
        rRES_EX <= 32'h0;
407
        rRES_MA <= 32'h0;
408
        // End of automatics
409
     end else if (ena_i) begin
410
        rRES_MA <= #1 rRES_EX;
411
        case (rALU_OF)
412
          3'o0: rRES_EX <= #1 rRES_ADD;
413
          3'o1: rRES_EX <= #1 rRES_LOG;
414
          3'o2: rRES_EX <= #1 rRES_SFT;
415
          3'o3: rRES_EX <= #1 rRES_MOV;
416
          //3'o4: rRES_EX <= (MUL) ? rRES_MUL : 32'hX;   
417
          3'o5: rRES_EX <= #1 (BSF) ? rRES_BSF : 32'hX;
418
          default: rRES_EX <= #1 32'hX;
419
        endcase // case (rALU_OF)
420
     end // if (ena_i)
421
 
422 80 sybreon
   /*
423
    DATA/FSL WISHBONE
424
 
425
    Asserts the data address as calculated by the adder and the
426
    appropriate byte select lanes depending on the byte offset of the
427
    address. It does not check for mis-aligned addresses.  */
428 78 sybreon
 
429 80 sybreon
   // TODO: Check for mis-alignment
430
 
431 78 sybreon
   always @(posedge clk_i)
432
     if (rst_i) begin
433
        /*AUTORESET*/
434
        // Beginning of autoreset for uninitialized flops
435
        cwb_adr_o <= 5'h0;
436
        cwb_sel_o <= 4'h0;
437
        cwb_tga_o <= 2'h0;
438
        dwb_adr_o <= {(1+(DWB-1)-(2)){1'b0}};
439
        dwb_sel_o <= 4'h0;
440
        rSEL_MA <= 4'h0;
441
        // End of automatics
442 80 sybreon
     end else if (ena_i) begin // if (rst_i)
443 78 sybreon
        rSEL_MA <= #1 dwb_sel_o;
444
 
445
        dwb_adr_o <= #1 wADD[DWB-1:2];
446
        case (rOPC[1:0])
447
          2'o0: case (wADD[1:0]) // 8'bit
448
                  2'o0: dwb_sel_o <= #1 4'h8;
449
                  2'o1: dwb_sel_o <= #1 4'h4;
450
                  2'o2: dwb_sel_o <= #1 4'h2;
451
                  2'o3: dwb_sel_o <= #1 4'h1;
452
                endcase // case (wADD[1:0])
453
          2'o1: dwb_sel_o <= #1 (wADD[1]) ? 4'h3 : 4'hC; // 16'bit
454
          2'o2: dwb_sel_o <= #1 4'hF; // 32'bit
455
          2'o3: dwb_sel_o <= #1 4'h0; // FSL
456
        endcase // case (rOPC[1:0])
457
 
458
        {cwb_adr_o, cwb_tga_o} <= #1 {rIMM_OF[4:0], rIMM_OF[15:14]};
459
        cwb_sel_o <= #1 {(4){ &rOPC[1:0]}};
460
 
461
     end // if (ena_i)
462
 
463
 
464
   // synopsys translate_off
465
   integer r;
466
   initial begin
467
      for (r=0; r<TXE; r=r+1) begin
468
         rMSR_CL[r] <= $random;
469
      end
470
   end
471
   // synopsys translate_on
472
 
473
endmodule // aeMB2_aslu
474
 
475 80 sybreon
/* $Log: not supported by cvs2svn $
476
/* Revision 1.1  2007/12/11 00:43:17  sybreon
477
/* initial import
478
/* */

powered by: WebSVN 2.1.0

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