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

Subversion Repositories dbg_interface

[/] [dbg_interface/] [tags/] [rel_15/] [rtl/] [verilog/] [dbg_top.v] - Blame information for rev 99

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

Line No. Rev Author Line
1 2 mohor
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  dbg_top.v                                                   ////
4
////                                                              ////
5
////                                                              ////
6
////  This file is part of the SoC/OpenRISC Development Interface ////
7 36 mohor
////  http://www.opencores.org/projects/DebugInterface/           ////
8 2 mohor
////                                                              ////
9
////  Author(s):                                                  ////
10 81 mohor
////       Igor Mohor (igorm@opencores.org)                       ////
11 2 mohor
////                                                              ////
12
////                                                              ////
13 81 mohor
////  All additional information is avaliable in the README.txt   ////
14 2 mohor
////  file.                                                       ////
15
////                                                              ////
16
//////////////////////////////////////////////////////////////////////
17
////                                                              ////
18 81 mohor
//// Copyright (C) 2000 - 2003 Authors                            ////
19 2 mohor
////                                                              ////
20
//// This source file may be used and distributed without         ////
21
//// restriction provided that this copyright statement is not    ////
22
//// removed from the file and that any derivative work contains  ////
23
//// the original copyright notice and the associated disclaimer. ////
24
////                                                              ////
25
//// This source file is free software; you can redistribute it   ////
26
//// and/or modify it under the terms of the GNU Lesser General   ////
27
//// Public License as published by the Free Software Foundation; ////
28
//// either version 2.1 of the License, or (at your option) any   ////
29
//// later version.                                               ////
30
////                                                              ////
31
//// This source is distributed in the hope that it will be       ////
32
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
33
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
34
//// PURPOSE.  See the GNU Lesser General Public License for more ////
35
//// details.                                                     ////
36
////                                                              ////
37
//// You should have received a copy of the GNU Lesser General    ////
38
//// Public License along with this source; if not, download it   ////
39
//// from http://www.opencores.org/lgpl.shtml                     ////
40
////                                                              ////
41
//////////////////////////////////////////////////////////////////////
42
//
43
// CVS Revision History
44
//
45
// $Log: not supported by cvs2svn $
46 99 mohor
// Revision 1.35  2004/01/14 22:59:16  mohor
47
// Temp version.
48
//
49 95 mohor
// Revision 1.34  2003/12/23 15:07:34  mohor
50
// New directory structure. New version of the debug interface.
51
// Files that are not needed removed.
52
//
53 81 mohor
// Revision 1.33  2003/10/23 16:17:01  mohor
54
// CRC logic changed.
55
//
56 73 mohor
// Revision 1.32  2003/09/18 14:00:47  simons
57
// Lower two address lines must be always zero.
58
//
59 67 simons
// Revision 1.31  2003/09/17 14:38:57  simons
60
// WB_CNTL register added, some syncronization fixes.
61
//
62 65 simons
// Revision 1.30  2003/08/28 13:55:22  simons
63
// Three more chains added for cpu debug access.
64
//
65 63 simons
// Revision 1.29  2003/07/31 12:19:49  simons
66
// Multiple cpu support added.
67
//
68 57 simons
// Revision 1.28  2002/11/06 14:22:41  mohor
69
// Trst signal is not inverted here any more. Inverted on higher layer !!!.
70
//
71 52 mohor
// Revision 1.27  2002/10/10 02:42:55  mohor
72 73 mohor
// WISHBONE Scan Chain is changed to reflect state of the WISHBONE access (WBInProgress bit added). 
73
// Internal counter is used (counts 256 wb_clk cycles) and when counter exceeds that value, 
74
// wb_cyc_o is negated.
75 52 mohor
//
76 51 mohor
// Revision 1.26  2002/05/07 14:43:59  mohor
77
// mon_cntl_o signals that controls monitor mux added.
78
//
79 47 mohor
// Revision 1.25  2002/04/22 12:54:11  mohor
80
// Signal names changed to lower case.
81
//
82 44 mohor
// Revision 1.24  2002/04/17 13:17:01  mohor
83
// Intentional error removed.
84
//
85 43 mohor
// Revision 1.23  2002/04/17 11:16:33  mohor
86
// A block for checking possible simulation/synthesis missmatch added.
87
//
88 42 mohor
// Revision 1.22  2002/03/12 10:31:53  mohor
89
// tap_top and dbg_top modules are put into two separate modules. tap_top
90
// contains only tap state machine and related logic. dbg_top contains all
91
// logic necessery for debugging.
92
//
93 37 mohor
// Revision 1.21  2002/03/08 15:28:16  mohor
94
// Structure changed. Hooks for jtag chain added.
95
//
96 36 mohor
// Revision 1.20  2002/02/06 12:23:09  mohor
97 81 mohor
// latched_jtag_ir used when muxing TDO instead of JTAG_IR.
98 36 mohor
//
99 33 mohor
// Revision 1.19  2002/02/05 13:34:51  mohor
100
// Stupid bug that was entered by previous update fixed.
101
//
102 32 mohor
// Revision 1.18  2002/02/05 12:41:01  mohor
103
// trst synchronization is not needed and was removed.
104
//
105 31 mohor
// Revision 1.17  2002/01/25 07:58:35  mohor
106
// IDCODE bug fixed, chains reused to decreas size of core. Data is shifted-in
107
// not filled-in. Tested in hw.
108
//
109 30 mohor
// Revision 1.16  2001/12/20 11:17:26  mohor
110
// TDO and TDO Enable signal are separated into two signals.
111
//
112 28 mohor
// Revision 1.15  2001/12/05 13:28:21  mohor
113
// trst signal is synchronized to wb_clk_i.
114
//
115 25 mohor
// Revision 1.14  2001/11/28 09:36:15  mohor
116
// Register length fixed.
117
//
118 22 mohor
// Revision 1.13  2001/11/27 13:37:43  mohor
119
// CRC is returned when chain selection data is transmitted.
120
//
121 21 mohor
// Revision 1.12  2001/11/26 10:47:09  mohor
122
// Crc generation is different for read or write commands. Small synthesys fixes.
123
//
124 20 mohor
// Revision 1.11  2001/11/14 10:10:41  mohor
125
// Wishbone data latched on wb_clk_i instead of risc_clk.
126
//
127 19 mohor
// Revision 1.10  2001/11/12 01:11:27  mohor
128
// Reset signals are not combined any more.
129
//
130 18 mohor
// Revision 1.9  2001/10/19 11:40:01  mohor
131
// dbg_timescale.v changed to timescale.v This is done for the simulation of
132
// few different cores in a single project.
133
//
134 17 mohor
// Revision 1.8  2001/10/17 10:39:03  mohor
135
// bs_chain_o added.
136
//
137 15 mohor
// Revision 1.7  2001/10/16 10:09:56  mohor
138
// Signal names changed to lowercase.
139 13 mohor
//
140 15 mohor
//
141 13 mohor
// Revision 1.6  2001/10/15 09:55:47  mohor
142
// Wishbone interface added, few fixes for better performance,
143
// hooks for boundary scan testing added.
144
//
145 12 mohor
// Revision 1.5  2001/09/24 14:06:42  mohor
146
// Changes connected to the OpenRISC access (SPR read, SPR write).
147
//
148 11 mohor
// Revision 1.4  2001/09/20 10:11:25  mohor
149
// Working version. Few bugs fixed, comments added.
150
//
151 9 mohor
// Revision 1.3  2001/09/19 11:55:13  mohor
152
// Asynchronous set/reset not used in trace any more.
153
//
154 8 mohor
// Revision 1.2  2001/09/18 14:13:47  mohor
155
// Trace fixed. Some registers changed, trace simplified.
156
//
157 5 mohor
// Revision 1.1.1.1  2001/09/13 13:49:19  mohor
158
// Initial official release.
159
//
160 2 mohor
// Revision 1.3  2001/06/01 22:22:35  mohor
161
// This is a backup. It is not a fully working version. Not for use, yet.
162
//
163
// Revision 1.2  2001/05/18 13:10:00  mohor
164
// Headers changed. All additional information is now avaliable in the README.txt file.
165
//
166
// Revision 1.1.1.1  2001/05/18 06:35:02  mohor
167
// Initial release
168
//
169
//
170
 
171 20 mohor
// synopsys translate_off
172 17 mohor
`include "timescale.v"
173 20 mohor
// synopsys translate_on
174 2 mohor
`include "dbg_defines.v"
175
 
176
// Top module
177 9 mohor
module dbg_top(
178 81 mohor
                // JTAG signals
179
                tck_i,
180
                tdi_i,
181
                tdo_o,
182 57 simons
 
183 81 mohor
                // TAP states
184
                shift_dr_i,
185
                pause_dr_i,
186
                update_dr_i,
187
 
188
                // Instructions
189
                debug_select_i,
190
 
191 12 mohor
                // WISHBONE common signals
192 81 mohor
                wb_rst_i, wb_clk_i,
193
 
194 12 mohor
                // WISHBONE master interface
195
                wb_adr_o, wb_dat_o, wb_dat_i, wb_cyc_o, wb_stb_o, wb_sel_o,
196 81 mohor
                wb_we_o, wb_ack_i, wb_cab_o, wb_err_i, wb_cti_o, wb_bte_o
197 2 mohor
              );
198
 
199
 
200 81 mohor
// JTAG signals
201
input   tck_i;
202
input   tdi_i;
203
output  tdo_o;
204 2 mohor
 
205 81 mohor
// TAP states
206
input   shift_dr_i;
207
input   pause_dr_i;
208
input   update_dr_i;
209 2 mohor
 
210 81 mohor
// Instructions
211
input   debug_select_i;
212 2 mohor
 
213 12 mohor
// WISHBONE common signals
214 9 mohor
input         wb_rst_i;                   // WISHBONE reset
215 12 mohor
input         wb_clk_i;                   // WISHBONE clock
216 81 mohor
 
217 12 mohor
// WISHBONE master interface
218
output [31:0] wb_adr_o;
219
output [31:0] wb_dat_o;
220
input  [31:0] wb_dat_i;
221
output        wb_cyc_o;
222
output        wb_stb_o;
223
output  [3:0] wb_sel_o;
224
output        wb_we_o;
225
input         wb_ack_i;
226
output        wb_cab_o;
227
input         wb_err_i;
228 81 mohor
output  [2:0] wb_cti_o;
229
output  [1:0] wb_bte_o;
230 9 mohor
 
231 2 mohor
 
232 81 mohor
reg     cpu_debug_scan_chain;
233
reg     wishbone_scan_chain;
234 2 mohor
 
235 81 mohor
reg [`DATA_CNT -1:0]        data_cnt;
236
reg [`CRC_CNT -1:0]         crc_cnt;
237
reg [`STATUS_CNT -1:0]      status_cnt;
238
reg [`CHAIN_DATA_LEN -1:0]  chain_dr;
239
reg [`CHAIN_ID_LENGTH -1:0] chain;
240 9 mohor
 
241 99 mohor
wire chain_latch_en;
242 81 mohor
wire data_cnt_end;
243
wire crc_cnt_end;
244
wire status_cnt_end;
245
reg  crc_cnt_end_q;
246
reg  crc_cnt_end_q2;
247
reg  crc_cnt_end_q3;
248
reg  chain_select;
249
reg  chain_select_error;
250
wire crc_out;
251
wire crc_match;
252
wire crc_en_wb;
253 99 mohor
wire crc_en_cpu;
254 81 mohor
wire shift_crc_wb;
255 99 mohor
wire shift_crc_cpu;
256 36 mohor
 
257 81 mohor
wire data_shift_en;
258
wire selecting_command;
259 2 mohor
 
260 81 mohor
reg tdo_o;
261
reg wishbone_ce;
262 99 mohor
reg cpu_ce;
263 73 mohor
 
264 99 mohor
wire tdi_wb;
265
wire tdi_cpu;
266
 
267
wire tdo_wb;
268
wire tdo_cpu;
269
 
270
wire shift_crc;
271
 
272 81 mohor
// data counter
273 95 mohor
always @ (posedge tck_i or posedge wb_rst_i)
274 81 mohor
begin
275 95 mohor
  if (wb_rst_i)
276 81 mohor
    data_cnt <= #1 'h0;
277
  else if(shift_dr_i & (~data_cnt_end))
278
    data_cnt <= #1 data_cnt + 1'b1;
279
  else if (update_dr_i)
280
    data_cnt <= #1 'h0;
281
end
282 9 mohor
 
283 11 mohor
 
284 81 mohor
assign data_cnt_end = data_cnt == `CHAIN_DATA_LEN;
285 2 mohor
 
286
 
287 81 mohor
// crc counter
288 95 mohor
always @ (posedge tck_i or posedge wb_rst_i)
289 2 mohor
begin
290 95 mohor
  if (wb_rst_i)
291 81 mohor
    crc_cnt <= #1 'h0;
292
  else if(shift_dr_i & data_cnt_end & (~crc_cnt_end) & chain_select)
293
    crc_cnt <= #1 crc_cnt + 1'b1;
294
  else if (update_dr_i)
295
    crc_cnt <= #1 'h0;
296 2 mohor
end
297
 
298 81 mohor
assign crc_cnt_end = crc_cnt == `CRC_LEN;
299 2 mohor
 
300 12 mohor
 
301 81 mohor
always @ (posedge tck_i)
302 73 mohor
  begin
303 81 mohor
    crc_cnt_end_q  <= #1 crc_cnt_end;
304
    crc_cnt_end_q2 <= #1 crc_cnt_end_q;
305
    crc_cnt_end_q3 <= #1 crc_cnt_end_q2;
306 73 mohor
  end
307 20 mohor
 
308 2 mohor
 
309 81 mohor
// status counter
310 95 mohor
always @ (posedge tck_i or posedge wb_rst_i)
311 2 mohor
begin
312 95 mohor
  if (wb_rst_i)
313 81 mohor
    status_cnt <= #1 'h0;
314
  else if(shift_dr_i & crc_cnt_end & (~status_cnt_end))
315
    status_cnt <= #1 status_cnt + 1'b1;
316
  else if (update_dr_i)
317
    status_cnt <= #1 'h0;
318 2 mohor
end
319
 
320 81 mohor
assign status_cnt_end = status_cnt == `STATUS_LEN;
321 42 mohor
 
322
 
323 81 mohor
assign selecting_command = shift_dr_i & (data_cnt == `DATA_CNT'h0) & debug_select_i;
324 42 mohor
 
325
 
326 95 mohor
always @ (posedge tck_i or posedge wb_rst_i)
327 2 mohor
begin
328 95 mohor
  if (wb_rst_i)
329 81 mohor
    chain_select <= #1 1'b0;
330
  else if(selecting_command & tdi_i)       // Chain select
331
    chain_select <= #1 1'b1;
332
  else if (update_dr_i)
333
    chain_select <= #1 1'b0;
334 2 mohor
end
335
 
336
 
337 81 mohor
always @ (chain)
338 2 mohor
begin
339 81 mohor
  cpu_debug_scan_chain  <= #1 1'b0;
340
  wishbone_scan_chain   <= #1 1'b0;
341
  chain_select_error    <= #1 1'b0;
342
 
343
  case (chain)                /* synthesis parallel_case */
344
    `CPU_DEBUG_CHAIN      :   cpu_debug_scan_chain  <= #1 1'b1;
345
    `WISHBONE_SCAN_CHAIN  :   wishbone_scan_chain   <= #1 1'b1;
346
    default               :   chain_select_error    <= #1 1'b1;
347
  endcase
348 2 mohor
end
349
 
350 20 mohor
 
351 99 mohor
assign chain_latch_en = chain_select & crc_cnt_end & (~crc_cnt_end_q);
352
 
353
 
354 95 mohor
always @ (posedge tck_i or posedge wb_rst_i)
355 67 simons
begin
356 95 mohor
  if (wb_rst_i)
357 81 mohor
    chain <= `CHAIN_ID_LENGTH'b111;
358 99 mohor
  else if(chain_latch_en & crc_match)
359 81 mohor
    chain <= #1 chain_dr[`CHAIN_DATA_LEN -1:1];
360 67 simons
end
361
 
362 2 mohor
 
363 81 mohor
assign data_shift_en = shift_dr_i & (~data_cnt_end);
364 2 mohor
 
365
 
366 81 mohor
always @ (posedge tck_i)
367 2 mohor
begin
368 81 mohor
  if (data_shift_en)
369
    chain_dr[`CHAIN_DATA_LEN -1:0] <= #1 {tdi_i, chain_dr[`CHAIN_DATA_LEN -1:1]};
370 2 mohor
end
371
 
372
 
373 81 mohor
// Calculating crc for input data
374
dbg_crc32_d1 i_dbg_crc32_d1_in
375
             (
376
              .data       (tdi_i),
377
              .enable     (shift_dr_i),
378
              .shift      (1'b0),
379 95 mohor
              .rst        (wb_rst_i),
380 81 mohor
              .sync_rst   (update_dr_i),
381
              .crc_out    (),
382
              .clk        (tck_i),
383
              .crc_match  (crc_match)
384
             );
385 2 mohor
 
386 12 mohor
 
387 81 mohor
reg tdo_chain_select;
388
wire crc_en;
389
wire crc_en_dbg;
390
reg crc_started;
391 99 mohor
assign crc_en = crc_en_dbg | crc_en_wb | crc_en_cpu;
392 81 mohor
assign crc_en_dbg = shift_dr_i & crc_cnt_end & (~status_cnt_end);
393 12 mohor
 
394 81 mohor
always @ (posedge tck_i)
395 12 mohor
begin
396 81 mohor
  if (crc_en)
397
    crc_started <= #1 1'b1;
398
  else if (update_dr_i)
399
    crc_started <= #1 1'b0;
400 12 mohor
end
401
 
402
 
403 81 mohor
reg tdo_tmp;
404 12 mohor
 
405 51 mohor
 
406 81 mohor
// Calculating crc for input data
407
dbg_crc32_d1 i_dbg_crc32_d1_out
408
             (
409
              .data       (tdo_tmp),
410
              .enable     (crc_en), // enable has priority
411
//              .shift      (1'b0),
412
              .shift      (shift_dr_i & crc_started & (~crc_en)),
413 95 mohor
              .rst        (wb_rst_i),
414 81 mohor
              .sync_rst   (update_dr_i),
415
              .crc_out    (crc_out),
416
              .clk        (tck_i),
417
              .crc_match  ()
418
             );
419 51 mohor
 
420 81 mohor
// Following status is shifted out: 
421
// 1. bit:          1 if crc is OK, else 0
422
// 2. bit:          1 if command is "chain select", else 0
423
// 3. bit:          1 if non-existing chain is selected else 0
424
// 4. bit:          always 1
425 51 mohor
 
426 81 mohor
reg [799:0] current_on_tdo;
427 51 mohor
 
428 81 mohor
always @ (status_cnt or chain_select or crc_match or chain_select_error or crc_out)
429 51 mohor
begin
430 81 mohor
  case (status_cnt)                   /* synthesis full_case parallel_case */
431
    `STATUS_CNT'd0  : begin
432
                        tdo_chain_select = crc_match;
433
                        current_on_tdo = "crc_match";
434
                      end
435
    `STATUS_CNT'd1  : begin
436
                        tdo_chain_select = chain_select;
437
                        current_on_tdo = "chain_select";
438
                      end
439
    `STATUS_CNT'd2  : begin
440
                        tdo_chain_select = chain_select_error;
441
                        current_on_tdo = "chain_select_error";
442
                      end
443
    `STATUS_CNT'd3  : begin
444
                        tdo_chain_select = 1'b1;
445
                        current_on_tdo = "one 1";
446
                      end
447
    `STATUS_CNT'd4  : begin
448
                        tdo_chain_select = crc_out;
449
                  //      tdo_chain_select = 1'hz;
450
                        current_on_tdo = "crc_out";
451
                      end
452
  endcase
453 51 mohor
end
454
 
455
 
456 5 mohor
 
457 99 mohor
 
458
assign shift_crc = shift_crc_wb | shift_crc_cpu;
459
 
460
always @ (shift_crc or crc_out or wishbone_ce or tdo_wb  or tdo_cpu or tdo_chain_select)
461 11 mohor
begin
462 99 mohor
  if (shift_crc)          // shifting crc
463 81 mohor
    tdo_tmp = crc_out;
464
  else if (wishbone_ce)   //  shifting data from wb
465
    tdo_tmp = tdo_wb;
466 99 mohor
  else if (cpu_ce)        // shifting data from cpu
467
    tdo_tmp = tdo_cpu;
468 11 mohor
  else
469 81 mohor
    tdo_tmp = tdo_chain_select;
470 11 mohor
end
471 9 mohor
 
472 11 mohor
 
473 81 mohor
always @ (negedge tck_i)
474 2 mohor
begin
475 81 mohor
  tdo_o <= #1 tdo_tmp;
476 2 mohor
end
477
 
478
 
479
 
480
 
481 81 mohor
// Signals for WISHBONE module
482 9 mohor
 
483
 
484 95 mohor
always @ (posedge tck_i or posedge wb_rst_i)
485 2 mohor
begin
486 95 mohor
  if (wb_rst_i)
487 99 mohor
    begin
488
      wishbone_ce <= #1 1'b0;
489
      cpu_ce <= #1 1'b0;
490
    end
491
  else if(selecting_command & (~tdi_i))
492
    begin
493
      if (wishbone_scan_chain)      // wishbone CE
494
        wishbone_ce <= #1 1'b1;
495
      if (cpu_debug_scan_chain)     // CPU CE
496
        cpu_ce <= #1 1'b1;
497
    end
498 81 mohor
  else if (update_dr_i)   // igor !!! This needs to be changed?
499 99 mohor
    begin
500
      wishbone_ce <= #1 1'b0;
501
      cpu_ce <= #1 1'b0;
502
    end
503 2 mohor
end
504
 
505
 
506 99 mohor
assign tdi_wb  = wishbone_ce & tdi_i;
507
assign tdi_cpu = cpu_ce & tdi_i;
508 2 mohor
 
509 99 mohor
 
510 81 mohor
// Connecting wishbone module
511
dbg_wb i_dbg_wb (
512
                  // JTAG signals
513
                  .tck_i         (tck_i),
514
                  .tdi_i         (tdi_wb),
515
                  .tdo_o         (tdo_wb),
516 2 mohor
 
517 81 mohor
                  // TAP states
518
                  .shift_dr_i    (shift_dr_i),
519
                  .pause_dr_i    (pause_dr_i),
520
                  .update_dr_i   (update_dr_i),
521 2 mohor
 
522 81 mohor
                  .wishbone_ce_i (wishbone_ce),
523
                  .crc_match_i   (crc_match),
524
                  .crc_en_o      (crc_en_wb),
525
                  .shift_crc_o   (shift_crc_wb),
526 95 mohor
                  .rst_i         (wb_rst_i),
527 2 mohor
 
528 81 mohor
                  // WISHBONE common signals
529
                  .wb_clk_i      (wb_clk_i),
530 5 mohor
 
531 81 mohor
                  // WISHBONE master interface
532
                  .wb_adr_o      (wb_adr_o),
533
                  .wb_dat_o      (wb_dat_o),
534
                  .wb_dat_i      (wb_dat_i),
535
                  .wb_cyc_o      (wb_cyc_o),
536
                  .wb_stb_o      (wb_stb_o),
537
                  .wb_sel_o      (wb_sel_o),
538
                  .wb_we_o       (wb_we_o),
539
                  .wb_ack_i      (wb_ack_i),
540
                  .wb_cab_o      (wb_cab_o),
541
                  .wb_err_i      (wb_err_i),
542
                  .wb_cti_o      (wb_cti_o),
543
                  .wb_bte_o      (wb_bte_o)
544
            );
545 2 mohor
 
546 99 mohor
 
547
// Connecting cpu module
548
dbg_cpu i_dbg_cpu (
549
                  // JTAG signals
550
                  .tck_i         (tck_i),
551
                  .tdi_i         (tdi_cpu),
552
                  .tdo_o         (tdo_cpu),
553
 
554
                  // TAP states
555
                  .shift_dr_i    (shift_dr_i),
556
                  .pause_dr_i    (pause_dr_i),
557
                  .update_dr_i   (update_dr_i),
558
 
559
                  .cpu_ce_i      (cpu_ce),
560
                  .crc_match_i   (crc_match),
561
                  .crc_en_o      (crc_en_cpu),
562
                  .shift_crc_o   (shift_crc_cpu),
563
                  .rst_i         (wb_rst_i),
564
                  .clk_i         (wb_clk_i)
565
              );
566
 
567
 
568 9 mohor
endmodule

powered by: WebSVN 2.1.0

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