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

Subversion Repositories dbg_interface

[/] [dbg_interface/] [trunk/] [rtl/] [verilog/] [dbg_top.v] - Blame information for rev 51

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
////                                                              ////
10
////  Author(s):                                                  ////
11
////       Igor Mohor                                             ////
12
////       igorm@opencores.org                                    ////
13
////                                                              ////
14
////                                                              ////
15
////  All additional information is avaliable in the README.txt   ////
16
////  file.                                                       ////
17
////                                                              ////
18
//////////////////////////////////////////////////////////////////////
19
////                                                              ////
20
//// Copyright (C) 2000,2001 Authors                              ////
21
////                                                              ////
22
//// This source file may be used and distributed without         ////
23
//// restriction provided that this copyright statement is not    ////
24
//// removed from the file and that any derivative work contains  ////
25
//// the original copyright notice and the associated disclaimer. ////
26
////                                                              ////
27
//// This source file is free software; you can redistribute it   ////
28
//// and/or modify it under the terms of the GNU Lesser General   ////
29
//// Public License as published by the Free Software Foundation; ////
30
//// either version 2.1 of the License, or (at your option) any   ////
31
//// later version.                                               ////
32
////                                                              ////
33
//// This source is distributed in the hope that it will be       ////
34
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
35
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
36
//// PURPOSE.  See the GNU Lesser General Public License for more ////
37
//// details.                                                     ////
38
////                                                              ////
39
//// You should have received a copy of the GNU Lesser General    ////
40
//// Public License along with this source; if not, download it   ////
41
//// from http://www.opencores.org/lgpl.shtml                     ////
42
////                                                              ////
43
//////////////////////////////////////////////////////////////////////
44
//
45
// CVS Revision History
46
//
47
// $Log: not supported by cvs2svn $
48 51 mohor
// Revision 1.26  2002/05/07 14:43:59  mohor
49
// mon_cntl_o signals that controls monitor mux added.
50
//
51 47 mohor
// Revision 1.25  2002/04/22 12:54:11  mohor
52
// Signal names changed to lower case.
53
//
54 44 mohor
// Revision 1.24  2002/04/17 13:17:01  mohor
55
// Intentional error removed.
56
//
57 43 mohor
// Revision 1.23  2002/04/17 11:16:33  mohor
58
// A block for checking possible simulation/synthesis missmatch added.
59
//
60 42 mohor
// Revision 1.22  2002/03/12 10:31:53  mohor
61
// tap_top and dbg_top modules are put into two separate modules. tap_top
62
// contains only tap state machine and related logic. dbg_top contains all
63
// logic necessery for debugging.
64
//
65 37 mohor
// Revision 1.21  2002/03/08 15:28:16  mohor
66
// Structure changed. Hooks for jtag chain added.
67
//
68 36 mohor
// Revision 1.20  2002/02/06 12:23:09  mohor
69
// LatchedJTAG_IR used when muxing TDO instead of JTAG_IR.
70
//
71 33 mohor
// Revision 1.19  2002/02/05 13:34:51  mohor
72
// Stupid bug that was entered by previous update fixed.
73
//
74 32 mohor
// Revision 1.18  2002/02/05 12:41:01  mohor
75
// trst synchronization is not needed and was removed.
76
//
77 31 mohor
// Revision 1.17  2002/01/25 07:58:35  mohor
78
// IDCODE bug fixed, chains reused to decreas size of core. Data is shifted-in
79
// not filled-in. Tested in hw.
80
//
81 30 mohor
// Revision 1.16  2001/12/20 11:17:26  mohor
82
// TDO and TDO Enable signal are separated into two signals.
83
//
84 28 mohor
// Revision 1.15  2001/12/05 13:28:21  mohor
85
// trst signal is synchronized to wb_clk_i.
86
//
87 25 mohor
// Revision 1.14  2001/11/28 09:36:15  mohor
88
// Register length fixed.
89
//
90 22 mohor
// Revision 1.13  2001/11/27 13:37:43  mohor
91
// CRC is returned when chain selection data is transmitted.
92
//
93 21 mohor
// Revision 1.12  2001/11/26 10:47:09  mohor
94
// Crc generation is different for read or write commands. Small synthesys fixes.
95
//
96 20 mohor
// Revision 1.11  2001/11/14 10:10:41  mohor
97
// Wishbone data latched on wb_clk_i instead of risc_clk.
98
//
99 19 mohor
// Revision 1.10  2001/11/12 01:11:27  mohor
100
// Reset signals are not combined any more.
101
//
102 18 mohor
// Revision 1.9  2001/10/19 11:40:01  mohor
103
// dbg_timescale.v changed to timescale.v This is done for the simulation of
104
// few different cores in a single project.
105
//
106 17 mohor
// Revision 1.8  2001/10/17 10:39:03  mohor
107
// bs_chain_o added.
108
//
109 15 mohor
// Revision 1.7  2001/10/16 10:09:56  mohor
110
// Signal names changed to lowercase.
111 13 mohor
//
112 15 mohor
//
113 13 mohor
// Revision 1.6  2001/10/15 09:55:47  mohor
114
// Wishbone interface added, few fixes for better performance,
115
// hooks for boundary scan testing added.
116
//
117 12 mohor
// Revision 1.5  2001/09/24 14:06:42  mohor
118
// Changes connected to the OpenRISC access (SPR read, SPR write).
119
//
120 11 mohor
// Revision 1.4  2001/09/20 10:11:25  mohor
121
// Working version. Few bugs fixed, comments added.
122
//
123 9 mohor
// Revision 1.3  2001/09/19 11:55:13  mohor
124
// Asynchronous set/reset not used in trace any more.
125
//
126 8 mohor
// Revision 1.2  2001/09/18 14:13:47  mohor
127
// Trace fixed. Some registers changed, trace simplified.
128
//
129 5 mohor
// Revision 1.1.1.1  2001/09/13 13:49:19  mohor
130
// Initial official release.
131
//
132 2 mohor
// Revision 1.3  2001/06/01 22:22:35  mohor
133
// This is a backup. It is not a fully working version. Not for use, yet.
134
//
135
// Revision 1.2  2001/05/18 13:10:00  mohor
136
// Headers changed. All additional information is now avaliable in the README.txt file.
137
//
138
// Revision 1.1.1.1  2001/05/18 06:35:02  mohor
139
// Initial release
140
//
141
//
142
 
143 20 mohor
// synopsys translate_off
144 17 mohor
`include "timescale.v"
145 20 mohor
// synopsys translate_on
146 2 mohor
`include "dbg_defines.v"
147
 
148
// Top module
149 9 mohor
module dbg_top(
150
 
151
                // RISC signals
152 11 mohor
                risc_clk_i, risc_addr_o, risc_data_i, risc_data_o, wp_i,
153
                bp_i, opselect_o, lsstatus_i, istatus_i, risc_stall_o, reset_o,
154 9 mohor
 
155 12 mohor
                // WISHBONE common signals
156
                wb_rst_i, wb_clk_i,
157
 
158
                // WISHBONE master interface
159
                wb_adr_o, wb_dat_o, wb_dat_i, wb_cyc_o, wb_stb_o, wb_sel_o,
160 36 mohor
                wb_we_o, wb_ack_i, wb_cab_o, wb_err_i,
161 12 mohor
 
162 36 mohor
                // TAP states
163
                ShiftDR, Exit1DR, UpdateDR, UpdateDR_q,
164
 
165
                // Instructions
166
                IDCODESelected, CHAIN_SELECTSelected, DEBUGSelected,
167
 
168
                // TAP signals
169 37 mohor
                trst_in, tck, tdi, TDOData,
170 36 mohor
 
171 47 mohor
                BypassRegister,
172
 
173
                // Monitor mux control
174
                mon_cntl_o
175 37 mohor
 
176 2 mohor
              );
177
 
178
parameter Tp = 1;
179
 
180
 
181 9 mohor
// RISC signals
182 11 mohor
input         risc_clk_i;                 // Master clock (RISC clock)
183 9 mohor
input  [31:0] risc_data_i;                // RISC data inputs (data that is written to the RISC registers)
184
input  [10:0] wp_i;                       // Watchpoint inputs
185
input         bp_i;                       // Breakpoint input
186
input  [3:0]  lsstatus_i;                 // Load/store status inputs
187
input  [1:0]  istatus_i;                  // Instruction status inputs
188
output [31:0] risc_addr_o;                // RISC address output (for adressing registers within RISC)
189
output [31:0] risc_data_o;                // RISC data output (data read from risc registers)
190
output [`OPSELECTWIDTH-1:0] opselect_o;   // Operation selection (selecting what kind of data is set to the risc_data_i)
191
output                      risc_stall_o; // Stalls the RISC
192 11 mohor
output                      reset_o;      // Resets the RISC
193 2 mohor
 
194
 
195 12 mohor
// WISHBONE common signals
196 9 mohor
input         wb_rst_i;                   // WISHBONE reset
197 12 mohor
input         wb_clk_i;                   // WISHBONE clock
198 9 mohor
 
199 12 mohor
// WISHBONE master interface
200
output [31:0] wb_adr_o;
201
output [31:0] wb_dat_o;
202
input  [31:0] wb_dat_i;
203
output        wb_cyc_o;
204
output        wb_stb_o;
205
output  [3:0] wb_sel_o;
206
output        wb_we_o;
207
input         wb_ack_i;
208
output        wb_cab_o;
209
input         wb_err_i;
210 9 mohor
 
211
// TAP states
212 36 mohor
input         ShiftDR;
213
input         Exit1DR;
214
input         UpdateDR;
215
input         UpdateDR_q;
216 2 mohor
 
217 37 mohor
input trst_in;
218 36 mohor
input tck;
219
input tdi;
220 2 mohor
 
221 36 mohor
input BypassRegister;
222 9 mohor
 
223 36 mohor
output TDOData;
224 47 mohor
output [3:0] mon_cntl_o;
225 36 mohor
 
226 9 mohor
// Defining which instruction is selected
227 36 mohor
input         IDCODESelected;
228
input         CHAIN_SELECTSelected;
229
input         DEBUGSelected;
230 2 mohor
 
231 36 mohor
reg           wb_cyc_o;
232 9 mohor
 
233 36 mohor
reg [31:0]    ADDR;
234
reg [31:0]    DataOut;
235 11 mohor
 
236 36 mohor
reg [`OPSELECTWIDTH-1:0] opselect_o;        // Operation selection (selecting what kind of data is set to the risc_data_i)
237 2 mohor
 
238 36 mohor
reg [`CHAIN_ID_LENGTH-1:0] Chain;           // Selected chain
239
reg [31:0]    DataReadLatch;                // Data when reading register or RISC is latched one risc_clk_i clock after the data is read.
240
reg           RegAccessTck;                 // Indicates access to the registers (read or write)
241
reg           RISCAccessTck;                // Indicates access to the RISC (read or write)
242
reg [7:0]     BitCounter;                   // Counting bits in the ShiftDR and Exit1DR stages
243
reg           RW;                           // Read/Write bit
244
reg           CrcMatch;                     // The crc that is shifted in and the internaly calculated crc are equal
245 2 mohor
 
246 36 mohor
reg           RegAccess_q;                  // Delayed signals used for accessing the registers
247
reg           RegAccess_q2;                 // Delayed signals used for accessing the registers
248
reg           RISCAccess_q;                 // Delayed signals used for accessing the RISC
249
reg           RISCAccess_q2;                // Delayed signals used for accessing the RISC
250 2 mohor
 
251 36 mohor
reg           wb_AccessTck;                 // Indicates access to the WISHBONE
252
reg [31:0]    WBReadLatch;                  // Data latched during WISHBONE read
253
reg           WBErrorLatch;                 // Error latched during WISHBONE read
254 51 mohor
reg           WBInProgress;                 // WISHBONE access is in progress
255
reg [7:0]     WBAccessCounter;              // Counting access cycles. WBInProgress is cleared to 0 after counter exceeds 0xff
256
wire          WBAccessCounterExceed;        // Marks when the WBAccessCounter exceeds max value (oxff)
257
reg           WBInProgress_sync1;           // Synchronizing WBInProgress
258
reg           WBInProgress_tck;             // Synchronizing WBInProgress to tck clock signal
259 30 mohor
 
260 37 mohor
wire trst;
261 30 mohor
 
262 37 mohor
 
263 9 mohor
wire [31:0]             RegDataIn;        // Data from registers (read data)
264
wire [`CRC_LENGTH-1:0]  CalculatedCrcOut; // CRC calculated in this module. This CRC is apended at the end of the TDO.
265 2 mohor
 
266 9 mohor
wire RiscStall_reg;                       // RISC is stalled by setting the register bit
267
wire RiscReset_reg;                       // RISC is reset by setting the register bit
268
wire RiscStall_trace;                     // RISC is stalled by trace module
269
 
270
 
271
wire RegisterScanChain;                   // Register Scan chain selected
272
wire RiscDebugScanChain;                  // Risc Debug Scan chain selected
273 12 mohor
wire WishboneScanChain;                   // WISHBONE Scan chain selected
274 11 mohor
 
275
wire RiscStall_read_access;               // Stalling RISC because of the read access (SPR read)
276
wire RiscStall_write_access;              // Stalling RISC because of the write access (SPR write)
277
wire RiscStall_access;                    // Stalling RISC because of the read or write access
278
 
279 30 mohor
wire BitCounter_Lt4;
280
wire BitCounter_Eq5;
281
wire BitCounter_Eq32;
282
wire BitCounter_Lt38;
283
wire BitCounter_Lt65;
284
 
285 15 mohor
 
286
 
287 9 mohor
// This signals are used only when TRACE is used in the design
288 2 mohor
`ifdef TRACE_ENABLED
289 9 mohor
  wire [39:0] TraceChain;                 // Chain that comes from trace module
290 36 mohor
  reg  ReadBuffer_Tck;                    // Command for incrementing the trace read pointer (synchr with tck)
291 9 mohor
  wire ReadTraceBuffer;                   // Command for incrementing the trace read pointer (synchr with MClk)
292
  reg  ReadTraceBuffer_q;                 // Delayed command for incrementing the trace read pointer (synchr with MClk)
293
  wire ReadTraceBufferPulse;              // Pulse for reading the trace buffer (valid for only one Mclk command)
294 2 mohor
 
295
  // Outputs from registers
296 9 mohor
  wire ContinMode;                        // Trace working in continous mode
297
  wire TraceEnable;                       // Trace enabled
298 2 mohor
 
299 9 mohor
  wire [10:0] WpTrigger;                  // Watchpoint starts trigger
300
  wire        BpTrigger;                  // Breakpoint starts trigger
301
  wire [3:0]  LSSTrigger;                 // Load/store status starts trigger
302
  wire [1:0]  ITrigger;                   // Instruction status starts trigger
303
  wire [1:0]  TriggerOper;                // Trigger operation
304 2 mohor
 
305 9 mohor
  wire        WpTriggerValid;             // Watchpoint trigger is valid
306
  wire        BpTriggerValid;             // Breakpoint trigger is valid
307
  wire        LSSTriggerValid;            // Load/store status trigger is valid
308
  wire        ITriggerValid;              // Instruction status trigger is valid
309 2 mohor
 
310 9 mohor
  wire [10:0] WpQualif;                   // Watchpoint starts qualifier
311
  wire        BpQualif;                   // Breakpoint starts qualifier
312
  wire [3:0]  LSSQualif;                  // Load/store status starts qualifier
313
  wire [1:0]  IQualif;                    // Instruction status starts qualifier
314
  wire [1:0]  QualifOper;                 // Qualifier operation
315 2 mohor
 
316 9 mohor
  wire        WpQualifValid;              // Watchpoint qualifier is valid
317
  wire        BpQualifValid;              // Breakpoint qualifier is valid
318
  wire        LSSQualifValid;             // Load/store status qualifier is valid
319
  wire        IQualifValid;               // Instruction status qualifier is valid
320 2 mohor
 
321 9 mohor
  wire [10:0] WpStop;                     // Watchpoint stops recording of the trace
322
  wire        BpStop;                     // Breakpoint stops recording of the trace
323
  wire [3:0]  LSSStop;                    // Load/store status stops recording of the trace
324
  wire [1:0]  IStop;                      // Instruction status stops recording of the trace
325
  wire [1:0]  StopOper;                   // Stop operation
326 2 mohor
 
327 9 mohor
  wire WpStopValid;                       // Watchpoint stop is valid
328
  wire BpStopValid;                       // Breakpoint stop is valid
329
  wire LSSStopValid;                      // Load/store status stop is valid
330
  wire IStopValid;                        // Instruction status stop is valid
331 2 mohor
 
332 9 mohor
  wire RecordPC;                          // Recording program counter
333
  wire RecordLSEA;                        // Recording load/store effective address
334
  wire RecordLDATA;                       // Recording load data
335
  wire RecordSDATA;                       // Recording store data
336
  wire RecordReadSPR;                     // Recording read SPR
337
  wire RecordWriteSPR;                    // Recording write SPR
338
  wire RecordINSTR;                       // Recording instruction
339 2 mohor
 
340
  // End: Outputs from registers
341
 
342 9 mohor
  wire TraceTestScanChain;                // Trace Test Scan chain selected
343
  wire [47:0] Trace_Data;                 // Trace data
344 2 mohor
 
345 11 mohor
  wire [`OPSELECTWIDTH-1:0]opselect_trace;// Operation selection (trace selecting what kind of
346
                                          // data is set to the risc_data_i)
347 30 mohor
  wire BitCounter_Lt40;
348 11 mohor
 
349 2 mohor
`endif
350
 
351
 
352 37 mohor
assign trst = ~trst_in;                   // trst_pad_i is active low
353 25 mohor
 
354
 
355 2 mohor
/**********************************************************************************
356
*                                                                                 *
357
*   JTAG_DR:  JTAG Data Register                                                  *
358
*                                                                                 *
359
**********************************************************************************/
360
reg [`DR_LENGTH-1:0]JTAG_DR_IN;    // Data register
361
reg TDOData;
362
 
363
 
364 36 mohor
always @ (posedge tck or posedge trst)
365 2 mohor
begin
366 18 mohor
  if(trst)
367 2 mohor
    JTAG_DR_IN[`DR_LENGTH-1:0]<=#Tp 0;
368
  else
369 30 mohor
  if(IDCODESelected)                          // To save space JTAG_DR_IN is also used for shifting out IDCODE
370
    begin
371
      if(ShiftDR)
372 36 mohor
        JTAG_DR_IN[31:0] <= #Tp {tdi, JTAG_DR_IN[31:1]};
373 30 mohor
      else
374
        JTAG_DR_IN[31:0] <= #Tp `IDCODE_VALUE;
375
    end
376
  else
377
  if(CHAIN_SELECTSelected & ShiftDR)
378 36 mohor
    JTAG_DR_IN[12:0] <= #Tp {tdi, JTAG_DR_IN[12:1]};
379 30 mohor
  else
380
  if(DEBUGSelected & ShiftDR)
381
    begin
382
      if(RiscDebugScanChain | WishboneScanChain)
383 36 mohor
        JTAG_DR_IN[73:0] <= #Tp {tdi, JTAG_DR_IN[73:1]};
384 30 mohor
      else
385
      if(RegisterScanChain)
386 36 mohor
        JTAG_DR_IN[46:0] <= #Tp {tdi, JTAG_DR_IN[46:1]};
387 30 mohor
    end
388 2 mohor
end
389 30 mohor
 
390 22 mohor
wire [73:0] RISC_Data;
391
wire [46:0] Register_Data;
392
wire [73:0] WISHBONE_Data;
393 21 mohor
wire [12:0] chain_sel_data;
394 12 mohor
wire wb_Access_wbClk;
395 2 mohor
 
396
 
397 30 mohor
reg select_crc_out;
398 36 mohor
always @ (posedge tck or posedge trst)
399 30 mohor
begin
400
  if(trst)
401
    select_crc_out <= 0;
402
  else
403
  if( RegisterScanChain  & BitCounter_Eq5  |
404
      RiscDebugScanChain & BitCounter_Eq32 |
405
      WishboneScanChain  & BitCounter_Eq32 )
406 36 mohor
    select_crc_out <=#Tp tdi;
407 30 mohor
  else
408
  if(CHAIN_SELECTSelected)
409
    select_crc_out <=#Tp 1;
410
  else
411
  if(UpdateDR)
412
    select_crc_out <=#Tp 0;
413
end
414 12 mohor
 
415 20 mohor
wire [8:0] send_crc;
416
 
417 30 mohor
assign send_crc = select_crc_out? {9{BypassRegister}}    :    // Calculated CRC is returned when read operation is
418
                                  {CalculatedCrcOut, 1'b0} ;  // performed, else received crc is returned (loopback).
419 20 mohor
 
420 30 mohor
assign RISC_Data      = {send_crc, DataReadLatch, 33'h0};
421
assign Register_Data  = {send_crc, DataReadLatch, 6'h0};
422 51 mohor
assign WISHBONE_Data  = {send_crc, WBReadLatch, 31'h0, WBInProgress, WBErrorLatch};
423 21 mohor
assign chain_sel_data = {send_crc, 4'h0};
424 20 mohor
 
425
 
426
`ifdef TRACE_ENABLED
427 2 mohor
  assign Trace_Data     = {CalculatedCrcOut, TraceChain};
428
`endif
429
 
430 36 mohor
//TDO is changing on the falling edge of tck
431
always @ (negedge tck or posedge trst)
432 2 mohor
begin
433 18 mohor
  if(trst)
434 2 mohor
    begin
435
      TDOData <= #Tp 0;
436
      `ifdef TRACE_ENABLED
437
      ReadBuffer_Tck<=#Tp 0;
438
      `endif
439
    end
440
  else
441
  if(UpdateDR)
442
    begin
443
      TDOData <= #Tp CrcMatch;
444
      `ifdef TRACE_ENABLED
445 9 mohor
      if(DEBUGSelected & TraceTestScanChain & TraceChain[0])  // Sample in the trace buffer is valid
446
        ReadBuffer_Tck<=#Tp 1;                                // Increment read pointer
447 2 mohor
      `endif
448
    end
449
  else
450
    begin
451
      if(ShiftDR)
452
        begin
453
          if(IDCODESelected)
454 36 mohor
            TDOData <= #Tp JTAG_DR_IN[0]; // IDCODE is shifted out 32-bits, then tdi is bypassed
455 2 mohor
          else
456
          if(CHAIN_SELECTSelected)
457 21 mohor
            TDOData <= #Tp chain_sel_data[BitCounter];        // Received crc is sent back
458 2 mohor
          else
459
          if(DEBUGSelected)
460
            begin
461
              if(RiscDebugScanChain)
462 9 mohor
                TDOData <= #Tp RISC_Data[BitCounter];         // Data read from RISC in the previous cycle is shifted out
463 2 mohor
              else
464
              if(RegisterScanChain)
465 9 mohor
                TDOData <= #Tp Register_Data[BitCounter];     // Data read from register in the previous cycle is shifted out
466 12 mohor
              else
467
              if(WishboneScanChain)
468
                TDOData <= #Tp WISHBONE_Data[BitCounter];     // Data read from the WISHBONE slave
469 2 mohor
              `ifdef TRACE_ENABLED
470
              else
471
              if(TraceTestScanChain)
472 9 mohor
                TDOData <= #Tp Trace_Data[BitCounter];        // Data from the trace buffer is shifted out
473 2 mohor
              `endif
474
            end
475
        end
476
      else
477
        begin
478
          TDOData <= #Tp 0;
479
          `ifdef TRACE_ENABLED
480
          ReadBuffer_Tck<=#Tp 0;
481
          `endif
482
        end
483
    end
484
end
485
 
486 42 mohor
 
487
//synopsys translate_off
488
always @ (posedge tck)
489
begin
490
  if(ShiftDR & CHAIN_SELECTSelected & BitCounter > 12)
491
    begin
492
      $display("\n%m Error: BitCounter is bigger then chain_sel_data bits width[12:0]. BitCounter=%d\n",BitCounter);
493
      $stop;
494
    end
495
  else
496
  if(ShiftDR & DEBUGSelected)
497
    begin
498
      if(RiscDebugScanChain & BitCounter > 73)
499
        begin
500
          $display("\n%m Error: BitCounter is bigger then RISC_Data bits width[73:0]. BitCounter=%d\n",BitCounter);
501
          $stop;
502
        end
503
      else
504 43 mohor
      if(RegisterScanChain & BitCounter > 46)
505 42 mohor
        begin
506
          $display("\n%m Error: BitCounter is bigger then RISC_Data bits width[46:0]. BitCounter=%d\n",BitCounter);
507
          $stop;
508
        end
509
      else
510
      if(WishboneScanChain & BitCounter > 73)
511
        begin
512
          $display("\n%m Error: BitCounter is bigger then WISHBONE_Data bits width[73:0]. BitCounter=%d\n",BitCounter);
513
          $stop;
514
        end
515
      `ifdef TRACE_ENABLED
516
      else
517
      if(TraceTestScanChain & BitCounter > 47)
518
        begin
519
          $display("\n%m Error: BitCounter is bigger then Trace_Data bits width[47:0]. BitCounter=%d\n",BitCounter);
520
          $stop;
521
        end
522
      `endif
523
    end
524
end
525
// synopsys translate_on
526
 
527
 
528
 
529
 
530
 
531
 
532
 
533
 
534 2 mohor
/**********************************************************************************
535
*                                                                                 *
536
*   End: JTAG_DR                                                                  *
537
*                                                                                 *
538
**********************************************************************************/
539
 
540
 
541
 
542
/**********************************************************************************
543
*                                                                                 *
544
*   CHAIN_SELECT logic                                                            *
545
*                                                                                 *
546
**********************************************************************************/
547 36 mohor
always @ (posedge tck or posedge trst)
548 2 mohor
begin
549 18 mohor
  if(trst)
550 9 mohor
    Chain[`CHAIN_ID_LENGTH-1:0]<=#Tp `GLOBAL_BS_CHAIN;  // Global BS chain is selected after reset
551 2 mohor
  else
552
  if(UpdateDR & CHAIN_SELECTSelected & CrcMatch)
553 9 mohor
    Chain[`CHAIN_ID_LENGTH-1:0]<=#Tp JTAG_DR_IN[3:0];   // New chain is selected
554 2 mohor
end
555
 
556
 
557
 
558
/**********************************************************************************
559
*                                                                                 *
560
*   Register read/write logic                                                     *
561
*   RISC registers read/write logic                                               *
562
*                                                                                 *
563
**********************************************************************************/
564 36 mohor
always @ (posedge tck or posedge trst)
565 2 mohor
begin
566 18 mohor
  if(trst)
567 2 mohor
    begin
568
      ADDR[31:0]        <=#Tp 32'h0;
569
      DataOut[31:0]     <=#Tp 32'h0;
570
      RW                <=#Tp 1'b0;
571
      RegAccessTck      <=#Tp 1'b0;
572
      RISCAccessTck     <=#Tp 1'b0;
573 12 mohor
      wb_AccessTck      <=#Tp 1'h0;
574 2 mohor
    end
575
  else
576
  if(UpdateDR & DEBUGSelected & CrcMatch)
577
    begin
578
      if(RegisterScanChain)
579
        begin
580
          ADDR[4:0]         <=#Tp JTAG_DR_IN[4:0];    // Latching address for register access
581
          RW                <=#Tp JTAG_DR_IN[5];      // latch R/W bit
582
          DataOut[31:0]     <=#Tp JTAG_DR_IN[37:6];   // latch data for write
583
          RegAccessTck      <=#Tp 1'b1;
584
        end
585
      else
586
      if(RiscDebugScanChain)
587
        begin
588
          ADDR[31:0]        <=#Tp JTAG_DR_IN[31:0];   // Latching address for RISC register access
589
          RW                <=#Tp JTAG_DR_IN[32];     // latch R/W bit
590
          DataOut[31:0]     <=#Tp JTAG_DR_IN[64:33];  // latch data for write
591
          RISCAccessTck     <=#Tp 1'b1;
592
        end
593 12 mohor
      else
594 51 mohor
      if(WishboneScanChain & (!WBInProgress_tck))
595 12 mohor
        begin
596 20 mohor
          ADDR              <=#Tp JTAG_DR_IN[31:0];   // Latching address for WISHBONE slave access
597
          RW                <=#Tp JTAG_DR_IN[32];     // latch R/W bit
598
          DataOut           <=#Tp JTAG_DR_IN[64:33];  // latch data for write
599 12 mohor
          wb_AccessTck      <=#Tp 1'b1;               // 
600
        end
601 2 mohor
    end
602
  else
603
    begin
604 36 mohor
      RegAccessTck      <=#Tp 1'b0;       // This signals are valid for one tck clock period only
605 2 mohor
      RISCAccessTck     <=#Tp 1'b0;
606 12 mohor
      wb_AccessTck      <=#Tp 1'b0;
607 2 mohor
    end
608
end
609
 
610 20 mohor
 
611
assign wb_adr_o = ADDR;
612
assign wb_we_o  = RW;
613
assign wb_dat_o = DataOut;
614 12 mohor
assign wb_sel_o[3:0] = 4'hf;
615
assign wb_cab_o = 1'b0;
616 20 mohor
 
617
 
618 11 mohor
// Synchronizing the RegAccess signal to risc_clk_i clock
619 36 mohor
dbg_sync_clk1_clk2 syn1 (.clk1(risc_clk_i),   .clk2(tck),           .reset1(wb_rst_i),  .reset2(trst),
620 2 mohor
                         .set2(RegAccessTck), .sync_out(RegAccess)
621
                        );
622
 
623 11 mohor
// Synchronizing the RISCAccess signal to risc_clk_i clock
624 36 mohor
dbg_sync_clk1_clk2 syn2 (.clk1(risc_clk_i),    .clk2(tck),          .reset1(wb_rst_i),  .reset2(trst),
625 2 mohor
                         .set2(RISCAccessTck), .sync_out(RISCAccess)
626
                        );
627
 
628
 
629 12 mohor
// Synchronizing the wb_Access signal to wishbone clock
630 36 mohor
dbg_sync_clk1_clk2 syn3 (.clk1(wb_clk_i),     .clk2(tck),           .reset1(wb_rst_i),  .reset2(trst),
631 12 mohor
                         .set2(wb_AccessTck), .sync_out(wb_Access_wbClk)
632
                        );
633
 
634
 
635
 
636
 
637
 
638 9 mohor
// Delayed signals used for accessing registers and RISC
639 18 mohor
always @ (posedge risc_clk_i or posedge wb_rst_i)
640 2 mohor
begin
641 18 mohor
  if(wb_rst_i)
642 2 mohor
    begin
643
      RegAccess_q   <=#Tp 1'b0;
644
      RegAccess_q2  <=#Tp 1'b0;
645
      RISCAccess_q  <=#Tp 1'b0;
646
      RISCAccess_q2 <=#Tp 1'b0;
647
    end
648
  else
649
    begin
650
      RegAccess_q   <=#Tp RegAccess;
651
      RegAccess_q2  <=#Tp RegAccess_q;
652
      RISCAccess_q  <=#Tp RISCAccess;
653
      RISCAccess_q2 <=#Tp RISCAccess_q;
654
    end
655
end
656
 
657 9 mohor
// Chip select and read/write signals for accessing RISC
658 11 mohor
assign RiscStall_write_access = RISCAccess & ~RISCAccess_q  &  RW;
659
assign RiscStall_read_access  = RISCAccess & ~RISCAccess_q2 & ~RW;
660
assign RiscStall_access = RiscStall_write_access | RiscStall_read_access;
661 2 mohor
 
662
 
663 12 mohor
reg wb_Access_wbClk_q;
664
// Delayed signals used for accessing WISHBONE
665 18 mohor
always @ (posedge wb_clk_i or posedge wb_rst_i)
666 12 mohor
begin
667 18 mohor
  if(wb_rst_i)
668 12 mohor
    wb_Access_wbClk_q <=#Tp 1'b0;
669
  else
670
    wb_Access_wbClk_q <=#Tp wb_Access_wbClk;
671
end
672
 
673 18 mohor
always @ (posedge wb_clk_i or posedge wb_rst_i)
674 12 mohor
begin
675 18 mohor
  if(wb_rst_i)
676 12 mohor
    wb_cyc_o <=#Tp 1'b0;
677
  else
678 51 mohor
  if(wb_Access_wbClk & ~wb_Access_wbClk_q)
679 12 mohor
    wb_cyc_o <=#Tp 1'b1;
680
  else
681 51 mohor
  if(wb_ack_i | wb_err_i | WBAccessCounterExceed)
682 12 mohor
    wb_cyc_o <=#Tp 1'b0;
683
end
684
 
685
assign wb_stb_o = wb_cyc_o;
686
 
687
 
688
// Latching data read from registers
689 19 mohor
always @ (posedge wb_clk_i or posedge wb_rst_i)
690 12 mohor
begin
691 18 mohor
  if(wb_rst_i)
692 12 mohor
    WBReadLatch[31:0]<=#Tp 32'h0;
693
  else
694
  if(wb_ack_i)
695
    WBReadLatch[31:0]<=#Tp wb_dat_i[31:0];
696
end
697
 
698
// Latching WISHBONE error cycle
699 18 mohor
always @ (posedge wb_clk_i or posedge wb_rst_i)
700 12 mohor
begin
701 18 mohor
  if(wb_rst_i)
702 12 mohor
    WBErrorLatch<=#Tp 1'b0;
703
  else
704
  if(wb_err_i)
705
    WBErrorLatch<=#Tp 1'b1;     // Latching wb_err_i while performing WISHBONE access
706 20 mohor
  else
707 12 mohor
  if(wb_ack_i)
708
    WBErrorLatch<=#Tp 1'b0;     // Clearing status
709
end
710
 
711
 
712 51 mohor
// WBInProgress is set at the beginning of the access and cleared when wb_ack_i or wb_err_i is set
713
always @ (posedge wb_clk_i or posedge wb_rst_i)
714
begin
715
  if(wb_rst_i)
716
    WBInProgress<=#Tp 1'b0;
717
  else
718
  if(wb_Access_wbClk & ~wb_Access_wbClk_q)
719
    WBInProgress<=#Tp 1'b1;
720
  else
721
  if(wb_ack_i | wb_err_i | WBAccessCounterExceed)
722
    WBInProgress<=#Tp 1'b0;
723
end
724
 
725
 
726
// Synchronizing WBInProgress
727
always @ (posedge wb_clk_i or posedge wb_rst_i)
728
begin
729
  if(wb_rst_i)
730
    WBAccessCounter<=#Tp 8'h0;
731
  else
732
  if(wb_ack_i | wb_err_i | WBAccessCounterExceed)
733
    WBAccessCounter<=#Tp 8'h0;
734
  else
735
  if(wb_cyc_o)
736
    WBAccessCounter<=#Tp WBAccessCounter + 1'b1;
737
end
738
 
739
assign WBAccessCounterExceed = WBAccessCounter==8'hff;
740
 
741
 
742
// Synchronizing WBInProgress
743
always @ (posedge tck)
744
begin
745
    WBInProgress_sync1<=#Tp WBInProgress;
746
    WBInProgress_tck<=#Tp WBInProgress_sync1;
747
end
748
 
749
 
750 9 mohor
// Whan enabled, TRACE stalls RISC while saving data to the trace buffer.
751 5 mohor
`ifdef TRACE_ENABLED
752 11 mohor
  assign  risc_stall_o = RiscStall_access | RiscStall_reg | RiscStall_trace ;
753 5 mohor
`else
754 12 mohor
  assign  risc_stall_o = RiscStall_access | RiscStall_reg;
755 5 mohor
`endif
756
 
757 11 mohor
assign  reset_o = RiscReset_reg;
758 5 mohor
 
759
 
760 12 mohor
`ifdef TRACE_ENABLED
761 11 mohor
always @ (RiscStall_write_access or RiscStall_read_access or opselect_trace)
762 12 mohor
`else
763
always @ (RiscStall_write_access or RiscStall_read_access)
764
`endif
765 11 mohor
begin
766
  if(RiscStall_write_access)
767
    opselect_o = `DEBUG_WRITE_SPR;  // Write spr
768
  else
769
  if(RiscStall_read_access)
770
    opselect_o = `DEBUG_READ_SPR;   // Read spr
771
  else
772 12 mohor
`ifdef TRACE_ENABLED
773 11 mohor
    opselect_o = opselect_trace;
774 12 mohor
`else
775
    opselect_o = 3'h0;
776
`endif
777 11 mohor
end
778 9 mohor
 
779 11 mohor
 
780 30 mohor
// Latching data read from RISC or registers
781 18 mohor
always @ (posedge risc_clk_i or posedge wb_rst_i)
782 2 mohor
begin
783 18 mohor
  if(wb_rst_i)
784 30 mohor
    DataReadLatch[31:0]<=#Tp 0;
785 2 mohor
  else
786
  if(RISCAccess_q & ~RISCAccess_q2)
787 30 mohor
    DataReadLatch[31:0]<=#Tp risc_data_i[31:0];
788
  else
789
  if(RegAccess_q & ~RegAccess_q2)
790
    DataReadLatch[31:0]<=#Tp RegDataIn[31:0];
791 2 mohor
end
792
 
793 12 mohor
assign risc_addr_o = ADDR;
794
assign risc_data_o = DataOut;
795 2 mohor
 
796
 
797
 
798
/**********************************************************************************
799
*                                                                                 *
800
*   Read Trace buffer logic                                                       *
801
*                                                                                 *
802
**********************************************************************************/
803
`ifdef TRACE_ENABLED
804
 
805 9 mohor
 
806 11 mohor
// Synchronizing the trace read buffer signal to risc_clk_i clock
807 36 mohor
dbg_sync_clk1_clk2 syn4 (.clk1(risc_clk_i),     .clk2(tck),           .reset1(wb_rst_i),  .reset2(trst),
808 9 mohor
                         .set2(ReadBuffer_Tck), .sync_out(ReadTraceBuffer)
809
                        );
810
 
811
 
812
 
813 18 mohor
  always @(posedge risc_clk_i or posedge wb_rst_i)
814 2 mohor
  begin
815 18 mohor
    if(wb_rst_i)
816 9 mohor
      ReadTraceBuffer_q <=#Tp 0;
817 2 mohor
    else
818 9 mohor
      ReadTraceBuffer_q <=#Tp ReadTraceBuffer;
819 2 mohor
  end
820 9 mohor
 
821
  assign ReadTraceBufferPulse = ReadTraceBuffer & ~ReadTraceBuffer_q;
822
 
823 2 mohor
`endif
824
 
825
/**********************************************************************************
826
*                                                                                 *
827
*   End: Read Trace buffer logic                                                  *
828
*                                                                                 *
829
**********************************************************************************/
830
 
831
 
832
 
833
 
834
 
835
/**********************************************************************************
836
*                                                                                 *
837
*   Bit counter                                                                   *
838
*                                                                                 *
839
**********************************************************************************/
840
 
841
 
842 36 mohor
always @ (posedge tck or posedge trst)
843 2 mohor
begin
844 18 mohor
  if(trst)
845 2 mohor
    BitCounter[7:0]<=#Tp 0;
846
  else
847
  if(ShiftDR)
848
    BitCounter[7:0]<=#Tp BitCounter[7:0]+1;
849
  else
850
  if(UpdateDR)
851
    BitCounter[7:0]<=#Tp 0;
852
end
853
 
854
 
855
 
856
/**********************************************************************************
857
*                                                                                 *
858
*   End: Bit counter                                                              *
859
*                                                                                 *
860
**********************************************************************************/
861
 
862
 
863
 
864
/**********************************************************************************
865
*                                                                                 *
866
*   Connecting Registers                                                          *
867
*                                                                                 *
868
**********************************************************************************/
869 44 mohor
dbg_registers dbgregs(.data_in(DataOut[31:0]), .data_out(RegDataIn[31:0]),
870
                      .address(ADDR[4:0]), .rw(RW), .access(RegAccess & ~RegAccess_q), .clk(risc_clk_i),
871
                      .bp(bp_i), .reset(wb_rst_i),
872 2 mohor
                      `ifdef TRACE_ENABLED
873 5 mohor
                      .ContinMode(ContinMode), .TraceEnable(TraceEnable),
874 2 mohor
                      .WpTrigger(WpTrigger), .BpTrigger(BpTrigger), .LSSTrigger(LSSTrigger),
875
                      .ITrigger(ITrigger), .TriggerOper(TriggerOper), .WpQualif(WpQualif),
876
                      .BpQualif(BpQualif), .LSSQualif(LSSQualif), .IQualif(IQualif),
877 5 mohor
                      .QualifOper(QualifOper), .RecordPC(RecordPC),
878
                      .RecordLSEA(RecordLSEA), .RecordLDATA(RecordLDATA),
879
                      .RecordSDATA(RecordSDATA), .RecordReadSPR(RecordReadSPR),
880
                      .RecordWriteSPR(RecordWriteSPR), .RecordINSTR(RecordINSTR),
881
                      .WpTriggerValid(WpTriggerValid),
882 2 mohor
                      .BpTriggerValid(BpTriggerValid), .LSSTriggerValid(LSSTriggerValid),
883
                      .ITriggerValid(ITriggerValid), .WpQualifValid(WpQualifValid),
884
                      .BpQualifValid(BpQualifValid), .LSSQualifValid(LSSQualifValid),
885
                      .IQualifValid(IQualifValid),
886
                      .WpStop(WpStop), .BpStop(BpStop), .LSSStop(LSSStop), .IStop(IStop),
887 5 mohor
                      .StopOper(StopOper), .WpStopValid(WpStopValid), .BpStopValid(BpStopValid),
888
                      .LSSStopValid(LSSStopValid), .IStopValid(IStopValid),
889 2 mohor
                      `endif
890 47 mohor
                      .risc_stall(RiscStall_reg), .risc_reset(RiscReset_reg), .mon_cntl_o(mon_cntl_o)
891 5 mohor
 
892 2 mohor
                     );
893
 
894
/**********************************************************************************
895
*                                                                                 *
896
*   End: Connecting Registers                                                     *
897
*                                                                                 *
898
**********************************************************************************/
899
 
900
 
901
/**********************************************************************************
902
*                                                                                 *
903
*   Connecting CRC module                                                         *
904
*                                                                                 *
905
**********************************************************************************/
906 18 mohor
wire AsyncResetCrc = trst;
907 9 mohor
wire SyncResetCrc = UpdateDR_q;
908 2 mohor
wire [7:0] CalculatedCrcIn;     // crc calculated from the input data (shifted in)
909
 
910 30 mohor
assign BitCounter_Lt4   = BitCounter<4;
911
assign BitCounter_Eq5   = BitCounter==5;
912
assign BitCounter_Eq32  = BitCounter==32;
913
assign BitCounter_Lt38  = BitCounter<38;
914
assign BitCounter_Lt65  = BitCounter<65;
915
 
916
`ifdef TRACE_ENABLED
917
  assign BitCounter_Lt40 = BitCounter<40;
918
`endif
919
 
920
 
921 2 mohor
wire EnableCrcIn = ShiftDR &
922 30 mohor
                  ( (CHAIN_SELECTSelected                 & BitCounter_Lt4) |
923
                    ((DEBUGSelected & RegisterScanChain)  & BitCounter_Lt38)|
924
                    ((DEBUGSelected & RiscDebugScanChain) & BitCounter_Lt65)|
925
                    ((DEBUGSelected & WishboneScanChain)  & BitCounter_Lt65)
926 9 mohor
                  );
927 2 mohor
 
928
wire EnableCrcOut= ShiftDR &
929 9 mohor
                   (
930 30 mohor
                    ((DEBUGSelected & RegisterScanChain)  & BitCounter_Lt38)|
931
                    ((DEBUGSelected & RiscDebugScanChain) & BitCounter_Lt65)|
932
                    ((DEBUGSelected & WishboneScanChain)  & BitCounter_Lt65)
933 2 mohor
                    `ifdef TRACE_ENABLED
934 30 mohor
                                                                            |
935
                    ((DEBUGSelected & TraceTestScanChain) & BitCounter_Lt40)
936 2 mohor
                    `endif
937 9 mohor
                   );
938 2 mohor
 
939
// Calculating crc for input data
940 44 mohor
dbg_crc8_d1 crc1 (.data(tdi), .enable_crc(EnableCrcIn), .reset(AsyncResetCrc), .sync_rst_crc(SyncResetCrc),
941
                  .crc_out(CalculatedCrcIn), .clk(tck));
942 2 mohor
 
943
// Calculating crc for output data
944 44 mohor
dbg_crc8_d1 crc2 (.data(TDOData), .enable_crc(EnableCrcOut), .reset(AsyncResetCrc), .sync_rst_crc(SyncResetCrc),
945
                  .crc_out(CalculatedCrcOut), .clk(tck));
946 2 mohor
 
947
 
948
// Generating CrcMatch signal
949 36 mohor
always @ (posedge tck or posedge trst)
950 2 mohor
begin
951 18 mohor
  if(trst)
952 2 mohor
    CrcMatch <=#Tp 1'b0;
953
  else
954
  if(Exit1DR)
955
    begin
956
      if(CHAIN_SELECTSelected)
957
        CrcMatch <=#Tp CalculatedCrcIn == JTAG_DR_IN[11:4];
958
      else
959 30 mohor
        begin
960
          if(RegisterScanChain)
961
            CrcMatch <=#Tp CalculatedCrcIn == JTAG_DR_IN[45:38];
962
          else
963
          if(RiscDebugScanChain)
964
            CrcMatch <=#Tp CalculatedCrcIn == JTAG_DR_IN[72:65];
965
          else
966
          if(WishboneScanChain)
967
            CrcMatch <=#Tp CalculatedCrcIn == JTAG_DR_IN[72:65];
968
        end
969 2 mohor
    end
970
end
971
 
972
 
973
// Active chain
974
assign RegisterScanChain   = Chain == `REGISTER_SCAN_CHAIN;
975
assign RiscDebugScanChain  = Chain == `RISC_DEBUG_CHAIN;
976 12 mohor
assign WishboneScanChain   = Chain == `WISHBONE_SCAN_CHAIN;
977 2 mohor
 
978
`ifdef TRACE_ENABLED
979
  assign TraceTestScanChain  = Chain == `TRACE_TEST_CHAIN;
980
`endif
981
 
982
/**********************************************************************************
983
*                                                                                 *
984
*   End: Connecting CRC module                                                    *
985
*                                                                                 *
986
**********************************************************************************/
987
 
988
/**********************************************************************************
989
*                                                                                 *
990
*   Connecting trace module                                                       *
991
*                                                                                 *
992
**********************************************************************************/
993
`ifdef TRACE_ENABLED
994 11 mohor
  dbg_trace dbgTrace1(.Wp(wp_i), .Bp(bp_i), .DataIn(risc_data_i), .OpSelect(opselect_trace),
995 9 mohor
                      .LsStatus(lsstatus_i), .IStatus(istatus_i), .RiscStall_O(RiscStall_trace),
996 18 mohor
                      .Mclk(risc_clk_i), .Reset(wb_rst_i), .TraceChain(TraceChain),
997 8 mohor
                      .ContinMode(ContinMode), .TraceEnable_reg(TraceEnable),
998 5 mohor
                      .WpTrigger(WpTrigger),
999 2 mohor
                      .BpTrigger(BpTrigger), .LSSTrigger(LSSTrigger), .ITrigger(ITrigger),
1000
                      .TriggerOper(TriggerOper), .WpQualif(WpQualif), .BpQualif(BpQualif),
1001
                      .LSSQualif(LSSQualif), .IQualif(IQualif), .QualifOper(QualifOper),
1002 5 mohor
                      .RecordPC(RecordPC), .RecordLSEA(RecordLSEA),
1003
                      .RecordLDATA(RecordLDATA), .RecordSDATA(RecordSDATA),
1004
                      .RecordReadSPR(RecordReadSPR), .RecordWriteSPR(RecordWriteSPR),
1005
                      .RecordINSTR(RecordINSTR),
1006 2 mohor
                      .WpTriggerValid(WpTriggerValid), .BpTriggerValid(BpTriggerValid),
1007
                      .LSSTriggerValid(LSSTriggerValid), .ITriggerValid(ITriggerValid),
1008
                      .WpQualifValid(WpQualifValid), .BpQualifValid(BpQualifValid),
1009
                      .LSSQualifValid(LSSQualifValid), .IQualifValid(IQualifValid),
1010 9 mohor
                      .ReadBuffer(ReadTraceBufferPulse),
1011 2 mohor
                      .WpStop(WpStop), .BpStop(BpStop), .LSSStop(LSSStop), .IStop(IStop),
1012
                      .StopOper(StopOper), .WpStopValid(WpStopValid), .BpStopValid(BpStopValid),
1013
                      .LSSStopValid(LSSStopValid), .IStopValid(IStopValid)
1014
                     );
1015
`endif
1016
/**********************************************************************************
1017
*                                                                                 *
1018
*   End: Connecting trace module                                                  *
1019
*                                                                                 *
1020
**********************************************************************************/
1021
 
1022
 
1023
 
1024 9 mohor
endmodule

powered by: WebSVN 2.1.0

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