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 5

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

Line No. Rev Author Line
1 2 mohor
 
2 5 mohor
// Potrebno racunati crc kadar je izbran trace. Ko delamo read iz bufferja
3 2 mohor
 
4
 
5
//////////////////////////////////////////////////////////////////////
6
////                                                              ////
7
////  dbg_top.v                                                   ////
8
////                                                              ////
9
////                                                              ////
10
////  This file is part of the SoC/OpenRISC Development Interface ////
11
////  http://www.opencores.org/cores/DebugInterface/              ////
12
////                                                              ////
13
////                                                              ////
14
////  Author(s):                                                  ////
15
////       Igor Mohor                                             ////
16
////       igorm@opencores.org                                    ////
17
////                                                              ////
18
////                                                              ////
19
////  All additional information is avaliable in the README.txt   ////
20
////  file.                                                       ////
21
////                                                              ////
22
//////////////////////////////////////////////////////////////////////
23
////                                                              ////
24
//// Copyright (C) 2000,2001 Authors                              ////
25
////                                                              ////
26
//// This source file may be used and distributed without         ////
27
//// restriction provided that this copyright statement is not    ////
28
//// removed from the file and that any derivative work contains  ////
29
//// the original copyright notice and the associated disclaimer. ////
30
////                                                              ////
31
//// This source file is free software; you can redistribute it   ////
32
//// and/or modify it under the terms of the GNU Lesser General   ////
33
//// Public License as published by the Free Software Foundation; ////
34
//// either version 2.1 of the License, or (at your option) any   ////
35
//// later version.                                               ////
36
////                                                              ////
37
//// This source is distributed in the hope that it will be       ////
38
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
39
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
40
//// PURPOSE.  See the GNU Lesser General Public License for more ////
41
//// details.                                                     ////
42
////                                                              ////
43
//// You should have received a copy of the GNU Lesser General    ////
44
//// Public License along with this source; if not, download it   ////
45
//// from http://www.opencores.org/lgpl.shtml                     ////
46
////                                                              ////
47
//////////////////////////////////////////////////////////////////////
48
//
49
// CVS Revision History
50
//
51
// $Log: not supported by cvs2svn $
52 5 mohor
// Revision 1.1.1.1  2001/09/13 13:49:19  mohor
53
// Initial official release.
54
//
55 2 mohor
// Revision 1.3  2001/06/01 22:22:35  mohor
56
// This is a backup. It is not a fully working version. Not for use, yet.
57
//
58
// Revision 1.2  2001/05/18 13:10:00  mohor
59
// Headers changed. All additional information is now avaliable in the README.txt file.
60
//
61
// Revision 1.1.1.1  2001/05/18 06:35:02  mohor
62
// Initial release
63
//
64
//
65
 
66
`include "dbg_timescale.v"
67
`include "dbg_defines.v"
68
 
69
// Top module
70
module dbg_top(P_TMS, P_TCK, P_TRST, P_TDI, P_TDO, P_PowerONReset, Mclk, RISC_ADDR, RISC_DATA_IN,
71 5 mohor
               RISC_DATA_OUT, RISC_CS, RISC_RW, Wp, Bp, OpSelect, LsStatus, IStatus,
72
               RISC_STALL_O, RISC_RESET_O, BS_CHAIN_I
73 2 mohor
              );
74
 
75
parameter Tp = 1;
76
 
77
input P_TMS, P_TCK;
78
input P_TRST, P_TDI;
79
input P_PowerONReset;
80
input Mclk;           // High speed clock (RISC clock)
81
input [31:0] RISC_DATA_IN;
82
input [10:0] Wp;
83
input Bp;
84
input [3:0] LsStatus;
85
input [1:0] IStatus;
86 5 mohor
input BS_CHAIN_I;
87 2 mohor
 
88
output P_TDO;
89
output [31:0] RISC_ADDR;
90
output [31:0] RISC_DATA_OUT;
91
output [`OPSELECTWIDTH-1:0] OpSelect;
92
output RISC_CS;              // CS for accessing RISC registers
93
output RISC_RW;              // RW for accessing RISC registers
94 5 mohor
output RISC_STALL_O;         // Stalls the RISC
95
output RISC_RESET_O;         // Resets the RISC
96 2 mohor
 
97
reg    [31:0] RISC_ADDR;
98
reg    [31:0] ADDR;
99
reg    [31:0] RISC_DATA_OUT;
100
reg    [31:0] DataOut;
101
 
102
wire TCK = P_TCK;
103
wire TMS = P_TMS;
104
wire TDI = P_TDI;
105
wire TRST= ~P_TRST;                   // P_TRST is active low
106
wire PowerONReset = ~P_PowerONReset;  // PowerOnReset is active low
107
 
108
reg TestLogicReset;
109
reg RunTestIdle;
110
reg SelectDRScan;
111
reg CaptureDR;
112
reg ShiftDR;
113
reg Exit1DR;
114
reg PauseDR;
115
reg Exit2DR;
116
reg UpdateDR;
117
 
118
reg SelectIRScan;
119
reg CaptureIR;
120
reg ShiftIR;
121
reg Exit1IR;
122
reg PauseIR;
123
reg Exit2IR;
124
reg UpdateIR;
125
 
126
reg EXTESTSelected;
127
reg SAMPLE_PRELOADSelected;
128
reg IDCODESelected;
129
reg CHAIN_SELECTSelected;
130
reg INTESTSelected;
131
reg CLAMPSelected;
132
reg CLAMPZSelected;
133
reg HIGHZSelected;
134
reg DEBUGSelected;
135
reg BYPASSSelected;
136
 
137
reg [`CHAIN_ID_LENGTH-1:0] Chain;         // Selected chain
138
reg [31:0] RISC_DATAINLatch;              // Data from DataIn is latched one Mclk clock cycle after RISC register is
139
                                          // accessed for reading
140
reg [31:0] RegisterReadLatch;             // Data when reading register is latched one TCK clock after the register is read.
141
 
142
wire[31:0] RegDataIn;                     // Data from registers (read data)
143
reg        RegAccessTck;                  // Indicates access to the registers (read or write)
144
reg        RISCAccessTck;                 // Indicates access to the RISC (read or write)
145
 
146
wire[`CRC_LENGTH-1:0] CalculatedCrcOut;   // CRC calculated in this module. This CRC is apended at the end of the TDO.
147
 
148
reg [7:0] BitCounter;                     // Counting bits in the ShiftDR and Exit1DR stages
149
reg RW;                                   // Read/Write bit
150
 
151
reg  CrcMatch;                            // The crc that is shifted in and the internaly calculated crc are equal
152
 
153
 
154
 
155
 
156
`ifdef TRACE_ENABLED
157
  wire [39:0] TraceChain;                   // Chain that comes from trace module
158
  reg  ReadBuffer_Tck;                      // Command for incrementing the trace read pointer (synchr with TCK)
159
  reg  ReadBuffer_Mclk;                     // Command for incrementing the trace read pointer (synchr with MClk)
160
  reg  DisableReadBuffer_Mclk;              // Incrementing trace read buffer can be active for one MClk clock. Then it is disabled.
161
 
162
  // Outputs from registers
163
  wire ContinMode;
164
  wire TraceEnable;
165
 
166
  wire [10:0] WpTrigger;
167
  wire        BpTrigger;
168
  wire [3:0]  LSSTrigger;
169
  wire [1:0]  ITrigger;
170
  wire [1:0]  TriggerOper;
171
 
172
  wire        WpTriggerValid;
173
  wire        BpTriggerValid;
174
  wire        LSSTriggerValid;
175
  wire        ITriggerValid;
176
 
177
  wire [10:0] WpQualif;
178
  wire        BpQualif;
179
  wire [3:0]  LSSQualif;
180
  wire [1:0]  IQualif;
181
  wire [1:0]  QualifOper;
182
 
183
  wire        WpQualifValid;
184
  wire        BpQualifValid;
185
  wire        LSSQualifValid;
186
  wire        IQualifValid;
187
 
188
  wire [10:0] WpStop;
189
  wire        BpStop;
190
  wire [3:0]  LSSStop;
191
  wire [1:0]  IStop;
192
  wire [1:0]  StopOper;
193
 
194
  wire WpStopValid;
195
  wire BpStopValid;
196
  wire LSSStopValid;
197
  wire IStopValid;
198
 
199 5 mohor
  wire RecordPC;
200
  wire RecordLSEA;
201
  wire RecordLDATA;
202
  wire RecordSDATA;
203
  wire RecordReadSPR;
204
  wire RecordWriteSPR;
205
  wire RecordINSTR;
206 2 mohor
 
207
  // End: Outputs from registers
208
 
209
  wire TraceTestScanChain;    // Trace Test Scan chain selected
210
  wire [47:0] Trace_Data;
211
 
212
`endif
213
 
214 5 mohor
wire RiscStall_reg;
215
wire RiscReset_reg;
216
wire RiscStall_trace;
217 2 mohor
 
218
 
219
wire RegisterScanChain;     // Register Scan chain selected
220
wire RiscDebugScanChain;    // Risc Debug Scan chain selected
221
 
222
 
223
/**********************************************************************************
224
*                                                                                 *
225
*   TAP State Machine: Fully JTAG compliant                                       *
226
*                                                                                 *
227
**********************************************************************************/
228
wire RESET = TRST | PowerONReset;
229
 
230
// TestLogicReset state
231
always @ (posedge TCK or posedge RESET)
232
begin
233
  if(RESET)
234
    TestLogicReset<=#Tp 1;
235
  else
236
    begin
237
      if(TMS & (TestLogicReset | SelectIRScan))
238
        TestLogicReset<=#Tp 1;
239
      else
240
        TestLogicReset<=#Tp 0;
241
    end
242
end
243
 
244
// RunTestIdle state
245
always @ (posedge TCK or posedge RESET)
246
begin
247
  if(RESET)
248
    RunTestIdle<=#Tp 0;
249
  else
250
    begin
251
      if(~TMS & (TestLogicReset | RunTestIdle | UpdateDR | UpdateIR))
252
        RunTestIdle<=#Tp 1;
253
      else
254
        RunTestIdle<=#Tp 0;
255
    end
256
end
257
 
258
// SelectDRScan state
259
always @ (posedge TCK or posedge RESET)
260
begin
261
  if(RESET)
262
    SelectDRScan<=#Tp 0;
263
  else
264
    begin
265
      if(TMS & (RunTestIdle | UpdateDR | UpdateIR))
266
        SelectDRScan<=#Tp 1;
267
      else
268
        SelectDRScan<=#Tp 0;
269
    end
270
end
271
 
272
// CaptureDR state
273
always @ (posedge TCK or posedge RESET)
274
begin
275
  if(RESET)
276
    CaptureDR<=#Tp 0;
277
  else
278
    begin
279
      if(~TMS & SelectDRScan)
280
        CaptureDR<=#Tp 1;
281
      else
282
        CaptureDR<=#Tp 0;
283
    end
284
end
285
 
286
// ShiftDR state
287
always @ (posedge TCK or posedge RESET)
288
begin
289
  if(RESET)
290
    ShiftDR<=#Tp 0;
291
  else
292
    begin
293
      if(~TMS & (CaptureDR | ShiftDR | Exit2DR))
294
        ShiftDR<=#Tp 1;
295
      else
296
        ShiftDR<=#Tp 0;
297
    end
298
end
299
 
300
// Exit1DR state
301
always @ (posedge TCK or posedge RESET)
302
begin
303
  if(RESET)
304
    Exit1DR<=#Tp 0;
305
  else
306
    begin
307
      if(TMS & (CaptureDR | ShiftDR))
308
        Exit1DR<=#Tp 1;
309
      else
310
        Exit1DR<=#Tp 0;
311
    end
312
end
313
 
314
// PauseDR state
315
always @ (posedge TCK or posedge RESET)
316
begin
317
  if(RESET)
318
    PauseDR<=#Tp 0;
319
  else
320
    begin
321
      if(~TMS & (Exit1DR | PauseDR))
322
        PauseDR<=#Tp 1;
323
      else
324
        PauseDR<=#Tp 0;
325
    end
326
end
327
 
328
// Exit2DR state
329
always @ (posedge TCK or posedge RESET)
330
begin
331
  if(RESET)
332
    Exit2DR<=#Tp 0;
333
  else
334
    begin
335
      if(TMS & PauseDR)
336
        Exit2DR<=#Tp 1;
337
      else
338
        Exit2DR<=#Tp 0;
339
    end
340
end
341
 
342
// UpdateDR state
343
always @ (posedge TCK or posedge RESET)
344
begin
345
  if(RESET)
346
    UpdateDR<=#Tp 0;
347
  else
348
    begin
349
      if(TMS & (Exit1DR | Exit2DR))
350
        UpdateDR<=#Tp 1;
351
      else
352
        UpdateDR<=#Tp 0;
353
    end
354
end
355
 
356
reg UpdateDR_q;
357
always @ (posedge TCK)
358
begin
359
  UpdateDR_q<=#Tp UpdateDR;
360
end
361
 
362
 
363
// SelectIRScan state
364
always @ (posedge TCK or posedge RESET)
365
begin
366
  if(RESET)
367
    SelectIRScan<=#Tp 0;
368
  else
369
    begin
370
      if(TMS & SelectDRScan)
371
        SelectIRScan<=#Tp 1;
372
      else
373
        SelectIRScan<=#Tp 0;
374
    end
375
end
376
 
377
// CaptureIR state
378
always @ (posedge TCK or posedge RESET)
379
begin
380
  if(RESET)
381
    CaptureIR<=#Tp 0;
382
  else
383
    begin
384
      if(~TMS & SelectIRScan)
385
        CaptureIR<=#Tp 1;
386
      else
387
        CaptureIR<=#Tp 0;
388
    end
389
end
390
 
391
// ShiftIR state
392
always @ (posedge TCK or posedge RESET)
393
begin
394
  if(RESET)
395
    ShiftIR<=#Tp 0;
396
  else
397
    begin
398
      if(~TMS & (CaptureIR | ShiftIR | Exit2IR))
399
        ShiftIR<=#Tp 1;
400
      else
401
        ShiftIR<=#Tp 0;
402
    end
403
end
404
 
405
// Exit1IR state
406
always @ (posedge TCK or posedge RESET)
407
begin
408
  if(RESET)
409
    Exit1IR<=#Tp 0;
410
  else
411
    begin
412
      if(TMS & (CaptureIR | ShiftIR))
413
        Exit1IR<=#Tp 1;
414
      else
415
        Exit1IR<=#Tp 0;
416
    end
417
end
418
 
419
// PauseIR state
420
always @ (posedge TCK or posedge RESET)
421
begin
422
  if(RESET)
423
    PauseIR<=#Tp 0;
424
  else
425
    begin
426
      if(~TMS & (Exit1IR | PauseIR))
427
        PauseIR<=#Tp 1;
428
      else
429
        PauseIR<=#Tp 0;
430
    end
431
end
432
 
433
// Exit2IR state
434
always @ (posedge TCK or posedge RESET)
435
begin
436
  if(RESET)
437
    Exit2IR<=#Tp 0;
438
  else
439
    begin
440
      if(TMS & PauseIR)
441
        Exit2IR<=#Tp 1;
442
      else
443
        Exit2IR<=#Tp 0;
444
    end
445
end
446
 
447
// UpdateIR state
448
always @ (posedge TCK or posedge RESET)
449
begin
450
  if(RESET)
451
    UpdateIR<=#Tp 0;
452
  else
453
    begin
454
      if(TMS & (Exit1IR | Exit2IR))
455
        UpdateIR<=#Tp 1;
456
      else
457
        UpdateIR<=#Tp 0;
458
    end
459
end
460
 
461
/**********************************************************************************
462
*                                                                                 *
463
*   End: TAP State Machine                                                        *
464
*                                                                                 *
465
**********************************************************************************/
466
 
467
 
468
 
469
/**********************************************************************************
470
*                                                                                 *
471
*   JTAG_IR:  JTAG Instruction Register                                           *
472
*                                                                                 *
473
**********************************************************************************/
474
wire [1:0]Status = 2'b10;   // Holds current chip status. Core should return this status. For now a constant is used.
475
 
476
reg [`IR_LENGTH-1:0]JTAG_IR;   // Instruction register
477
reg TDOInstruction;
478
 
479
always @ (posedge TCK or posedge RESET)
480
begin
481
  if(RESET)
482
    JTAG_IR[`IR_LENGTH-1:0] <= #Tp 0;
483
  else
484
    begin
485
      if(CaptureIR)
486
        begin
487
          JTAG_IR[1:0] <= #Tp 2'b01;       // This value is fixed for easier fault detection
488
          JTAG_IR[3:2] <= #Tp Status[1:0]; // Current status of chip
489
        end
490
      else
491
        begin
492
          if(ShiftIR)
493
            begin
494
              JTAG_IR[`IR_LENGTH-1:0] <= #Tp {TDI, JTAG_IR[`IR_LENGTH-1:1]};
495
            end
496
        end
497
    end
498
end
499
 
500
 
501
//TDO is changing on the falling edge of TCK
502
always @ (negedge TCK)
503
begin
504
  if(ShiftIR)
505
    TDOInstruction <= #Tp JTAG_IR[0];
506
end
507
 
508
/**********************************************************************************
509
*                                                                                 *
510
*   End: JTAG_IR                                                                  *
511
*                                                                                 *
512
**********************************************************************************/
513
 
514
 
515
/**********************************************************************************
516
*                                                                                 *
517
*   JTAG_DR:  JTAG Data Register                                                  *
518
*                                                                                 *
519
**********************************************************************************/
520
wire [31:0] IDCodeValue = `IDCODE_VALUE;  // IDCODE value is 32-bit long.
521
 
522
reg [`DR_LENGTH-1:0]JTAG_DR_IN;    // Data register
523
reg TDOData;
524
 
525
 
526
always @ (posedge TCK or posedge RESET)
527
begin
528
  if(RESET)
529
    JTAG_DR_IN[`DR_LENGTH-1:0]<=#Tp 0;
530
  else
531
  if(ShiftDR)
532
    JTAG_DR_IN[BitCounter]<=#Tp TDI;
533
end
534
 
535
wire [72:0] RISC_Data;
536
wire [45:0] Register_Data;
537
 
538
assign RISC_Data      = {CalculatedCrcOut, RISC_DATAINLatch, 33'h0};
539
assign Register_Data  = {CalculatedCrcOut, RegisterReadLatch, 6'h0};
540
 
541
`ifdef TRACE_ENABLED
542
  assign Trace_Data     = {CalculatedCrcOut, TraceChain};
543
`endif
544
 
545
//TDO is changing on the falling edge of TCK
546
always @ (negedge TCK or posedge RESET)
547
begin
548
  if(RESET)
549
    begin
550
      TDOData <= #Tp 0;
551
      `ifdef TRACE_ENABLED
552
      ReadBuffer_Tck<=#Tp 0;
553
      `endif
554
    end
555
  else
556
  if(UpdateDR)
557
    begin
558
      TDOData <= #Tp CrcMatch;
559
      `ifdef TRACE_ENABLED
560
      if(DEBUGSelected & TraceTestScanChain & TraceChain[0])  // Sample is valid
561
        ReadBuffer_Tck<=#Tp 1;    // Increment read pointer
562
      `endif
563
    end
564
  else
565
    begin
566
      if(ShiftDR)
567
        begin
568
          if(IDCODESelected)
569
            TDOData <= #Tp IDCodeValue[BitCounter];
570
          else
571
          if(CHAIN_SELECTSelected)
572
            TDOData <= #Tp 0;
573
          else
574
          if(DEBUGSelected)
575
            begin
576
              if(RiscDebugScanChain)
577
                TDOData <= #Tp RISC_Data[BitCounter];
578
              else
579
              if(RegisterScanChain)
580
                TDOData <= #Tp Register_Data[BitCounter];
581
              `ifdef TRACE_ENABLED
582
              else
583
              if(TraceTestScanChain)
584
                TDOData <= #Tp Trace_Data[BitCounter];
585
              `endif
586
            end
587
        end
588
      else
589
        begin
590
          TDOData <= #Tp 0;
591
          `ifdef TRACE_ENABLED
592
          ReadBuffer_Tck<=#Tp 0;
593
          `endif
594
        end
595
    end
596
end
597
 
598
/**********************************************************************************
599
*                                                                                 *
600
*   End: JTAG_DR                                                                  *
601
*                                                                                 *
602
**********************************************************************************/
603
 
604
 
605
 
606
/**********************************************************************************
607
*                                                                                 *
608
*   CHAIN_SELECT logic                                                            *
609
*                                                                                 *
610
**********************************************************************************/
611
always @ (posedge TCK or posedge RESET)
612
begin
613
  if(RESET)
614
    Chain[`CHAIN_ID_LENGTH-1:0]<=#Tp `GLOBAL_BS_CHAIN;
615
  else
616
  if(UpdateDR & CHAIN_SELECTSelected & CrcMatch)
617
    Chain[`CHAIN_ID_LENGTH-1:0]<=#Tp JTAG_DR_IN[3:0];
618
end
619
 
620
 
621
 
622
/**********************************************************************************
623
*                                                                                 *
624
*   Register read/write logic                                                     *
625
*   RISC registers read/write logic                                               *
626
*                                                                                 *
627
**********************************************************************************/
628
 
629
always @ (posedge TCK or posedge RESET)
630
begin
631
  if(RESET)
632
    begin
633
      ADDR[31:0]        <=#Tp 32'h0;
634
      DataOut[31:0]     <=#Tp 32'h0;
635
      RW                <=#Tp 1'b0;
636
      RegAccessTck      <=#Tp 1'b0;
637
      RISCAccessTck     <=#Tp 1'b0;
638
    end
639
  else
640
  if(UpdateDR & DEBUGSelected & CrcMatch)
641
    begin
642
      if(RegisterScanChain)
643
        begin
644
          ADDR[4:0]         <=#Tp JTAG_DR_IN[4:0];    // Latching address for register access
645
          RW                <=#Tp JTAG_DR_IN[5];      // latch R/W bit
646
          DataOut[31:0]     <=#Tp JTAG_DR_IN[37:6];   // latch data for write
647
          RegAccessTck      <=#Tp 1'b1;
648
        end
649
      else
650
      if(RiscDebugScanChain)
651
        begin
652
          ADDR[31:0]        <=#Tp JTAG_DR_IN[31:0];   // Latching address for RISC register access
653
          RW                <=#Tp JTAG_DR_IN[32];     // latch R/W bit
654
          DataOut[31:0]     <=#Tp JTAG_DR_IN[64:33];  // latch data for write
655
          RISCAccessTck     <=#Tp 1'b1;
656
        end
657
    end
658
  else
659
    begin
660
      RegAccessTck      <=#Tp 1'b0;       // This signals are valid for one TCK clock period only
661
      RISCAccessTck     <=#Tp 1'b0;
662
    end
663
end
664
 
665
integer ii, jj, kk;
666
// Relocating bits because RISC works in big endian mode
667
always @(ADDR)
668
begin
669
  for(ii=0; ii<32; ii=ii+1)
670
    RISC_ADDR[ii] = ADDR[31-ii];
671
end
672
 
673
 
674
// Relocating bits because RISC works in big endian mode
675
always @(DataOut)
676
begin
677
  for(jj=0; jj<32; jj=jj+1)
678
    RISC_DATA_OUT[jj] = DataOut[31-jj];
679
end
680
 
681
// Synchronizing the RegAccess signal to Mclk clock
682
dbg_sync_clk1_clk2 syn1 (.clk1(Mclk),         .clk2(TCK),           .reset1(RESET),  .reset2(RESET),
683
                         .set2(RegAccessTck), .sync_out(RegAccess)
684
                        );
685
 
686
// Synchronizing the RISCAccess signal to Mclk clock
687
dbg_sync_clk1_clk2 syn2 (.clk1(Mclk),         .clk2(TCK),           .reset1(RESET),  .reset2(RESET),
688
                         .set2(RISCAccessTck), .sync_out(RISCAccess)
689
                        );
690
 
691
reg RegAccess_q;
692
reg RegAccess_q2;
693
reg RISCAccess_q;
694
reg RISCAccess_q2;
695
 
696
always @ (posedge Mclk or posedge RESET)
697
begin
698
  if(RESET)
699
    begin
700
      RegAccess_q   <=#Tp 1'b0;
701
      RegAccess_q2  <=#Tp 1'b0;
702
      RISCAccess_q  <=#Tp 1'b0;
703
      RISCAccess_q2 <=#Tp 1'b0;
704
    end
705
  else
706
    begin
707
      RegAccess_q   <=#Tp RegAccess;
708
      RegAccess_q2  <=#Tp RegAccess_q;
709
      RISCAccess_q  <=#Tp RISCAccess;
710
      RISCAccess_q2 <=#Tp RISCAccess_q;
711
    end
712
end
713
 
714
// Latching data read from registers
715
always @ (posedge Mclk or posedge RESET)
716
begin
717
  if(RESET)
718
    RegisterReadLatch[31:0]<=#Tp 0;
719
  else
720
  if(RegAccess_q & ~RegAccess_q2)
721
    RegisterReadLatch[31:0]<=#Tp RegDataIn[31:0];
722
end
723
 
724
 
725
assign RISC_CS = RISCAccess & ~RISCAccess_q;
726
assign RISC_RW = RW;
727
 
728
 
729 5 mohor
`ifdef TRACE_ENABLED
730
  assign RISC_STALL_O = RISC_CS | RiscStall_reg | RiscStall_trace ;
731
`else
732
  assign RISC_STALL_O = RISC_CS | RiscStall_reg;
733
`endif
734
 
735
assign RISC_RESET_O = RiscReset_reg;
736
 
737
 
738 2 mohor
reg [31:0] RISC_DATA_IN_TEMP;
739
// Latching data read from RISC
740
always @ (posedge Mclk or posedge RESET)
741
begin
742
  if(RESET)
743
    RISC_DATAINLatch[31:0]<=#Tp 0;
744
  else
745
  if(RISCAccess_q & ~RISCAccess_q2)
746
    RISC_DATAINLatch[31:0]<=#Tp RISC_DATA_IN_TEMP[31:0];
747
end
748
 
749
 
750
// Relocating bits because RISC works in big endian mode
751
always @(RISC_DATA_IN)
752
begin
753
  for(kk=0; kk<32; kk=kk+1)
754
    RISC_DATA_IN_TEMP[kk] = RISC_DATA_IN[31-kk];
755
end
756
 
757
 
758
 
759
/**********************************************************************************
760
*                                                                                 *
761
*   Read Trace buffer logic                                                       *
762
*                                                                                 *
763
**********************************************************************************/
764
`ifdef TRACE_ENABLED
765
  wire Reset_ReadBuffer_Mclk = ReadBuffer_Mclk | DisableReadBuffer_Mclk | RESET;
766
 
767
  always @(posedge Mclk)
768
  begin
769
    if(Reset_ReadBuffer_Mclk)
770
      ReadBuffer_Mclk<=#Tp 0;
771
    else
772
    if(ReadBuffer_Tck)
773
      ReadBuffer_Mclk<=#Tp 1;
774
  end
775
 
776
  always @(posedge Mclk)
777
  begin
778
    if(ReadBuffer_Mclk)
779
      DisableReadBuffer_Mclk<=#Tp 1;
780
    else
781
    if(~ReadBuffer_Tck)
782
      DisableReadBuffer_Mclk<=#Tp 0;
783
  end
784
`endif
785
 
786
/**********************************************************************************
787
*                                                                                 *
788
*   End: Read Trace buffer logic                                                  *
789
*                                                                                 *
790
**********************************************************************************/
791
 
792
 
793
/**********************************************************************************
794
*                                                                                 *
795
*   Bypass logic                                                                  *
796
*                                                                                 *
797
**********************************************************************************/
798
reg BypassRegister;
799
reg TDOBypassed;
800
 
801
always @ (posedge TCK)
802
begin
803
  if(ShiftDR)
804
    BypassRegister<=#Tp TDI;
805
end
806
 
807
always @ (negedge TCK)
808
begin
809
    TDOBypassed<=#Tp BypassRegister;
810
end
811
/**********************************************************************************
812
*                                                                                 *
813
*   End: Bypass logic                                                             *
814
*                                                                                 *
815
**********************************************************************************/
816
 
817
 
818
 
819
 
820
 
821
/**********************************************************************************
822
*                                                                                 *
823
*   Activating Instructions                                                       *
824
*                                                                                 *
825
**********************************************************************************/
826
 
827
// Updating JTAG_IR (Instruction Register)
828
always @ (posedge TCK or posedge RESET)
829
begin
830
  if(RESET)
831
    begin
832
      EXTESTSelected<=#Tp 0;
833
      SAMPLE_PRELOADSelected<=#Tp 0;
834
      IDCODESelected<=#Tp 1;          // After reset IDCODE is selected
835
      CHAIN_SELECTSelected<=#Tp 0;
836
      INTESTSelected<=#Tp 0;
837
      CLAMPSelected<=#Tp 0;
838
      CLAMPZSelected<=#Tp 0;
839
      HIGHZSelected<=#Tp 0;
840
      DEBUGSelected<=#Tp 0;
841
      BYPASSSelected<=#Tp 0;
842
    end
843
  else
844
  begin
845
    if(UpdateIR)
846
      begin
847
        case(JTAG_IR)
848
          `EXTEST: // External test
849
            begin
850
              EXTESTSelected<=#Tp 1;
851
              SAMPLE_PRELOADSelected<=#Tp 0;
852
              IDCODESelected<=#Tp 0;
853
              CHAIN_SELECTSelected<=#Tp 0;
854
              INTESTSelected<=#Tp 0;
855
              CLAMPSelected<=#Tp 0;
856
              CLAMPZSelected<=#Tp 0;
857
              HIGHZSelected<=#Tp 0;
858
              DEBUGSelected<=#Tp 0;
859
              BYPASSSelected<=#Tp 0;
860
            end
861
          `SAMPLE_PRELOAD: // Sample preload
862
            begin
863
              EXTESTSelected<=#Tp 0;
864
              SAMPLE_PRELOADSelected<=#Tp 1;
865
              IDCODESelected<=#Tp 0;
866
              CHAIN_SELECTSelected<=#Tp 0;
867
              INTESTSelected<=#Tp 0;
868
              CLAMPSelected<=#Tp 0;
869
              CLAMPZSelected<=#Tp 0;
870
              HIGHZSelected<=#Tp 0;
871
              DEBUGSelected<=#Tp 0;
872
              BYPASSSelected<=#Tp 0;
873
            end
874
          `IDCODE:  // ID Code
875
            begin
876
              EXTESTSelected<=#Tp 0;
877
              SAMPLE_PRELOADSelected<=#Tp 0;
878
              IDCODESelected<=#Tp 1;
879
              CHAIN_SELECTSelected<=#Tp 0;
880
              INTESTSelected<=#Tp 0;
881
              CLAMPSelected<=#Tp 0;
882
              CLAMPZSelected<=#Tp 0;
883
              HIGHZSelected<=#Tp 0;
884
              DEBUGSelected<=#Tp 0;
885
              BYPASSSelected<=#Tp 0;
886
            end
887
          `CHAIN_SELECT: // Chain select
888
            begin
889
              EXTESTSelected<=#Tp 0;
890
              SAMPLE_PRELOADSelected<=#Tp 0;
891
              IDCODESelected<=#Tp 0;
892
              CHAIN_SELECTSelected<=#Tp 1;
893
              INTESTSelected<=#Tp 0;
894
              CLAMPSelected<=#Tp 0;
895
              CLAMPZSelected<=#Tp 0;
896
              HIGHZSelected<=#Tp 0;
897
              DEBUGSelected<=#Tp 0;
898
              BYPASSSelected<=#Tp 0;
899
            end
900
          `INTEST: // Internal test
901
            begin
902
              EXTESTSelected<=#Tp 0;
903
              SAMPLE_PRELOADSelected<=#Tp 0;
904
              IDCODESelected<=#Tp 0;
905
              CHAIN_SELECTSelected<=#Tp 0;
906
              INTESTSelected<=#Tp 1;
907
              CLAMPSelected<=#Tp 0;
908
              CLAMPZSelected<=#Tp 0;
909
              HIGHZSelected<=#Tp 0;
910
              DEBUGSelected<=#Tp 0;
911
              BYPASSSelected<=#Tp 0;
912
            end
913
          `CLAMP: // Clamp
914
            begin
915
              EXTESTSelected<=#Tp 0;
916
              SAMPLE_PRELOADSelected<=#Tp 0;
917
              IDCODESelected<=#Tp 0;
918
              CHAIN_SELECTSelected<=#Tp 0;
919
              INTESTSelected<=#Tp 0;
920
              CLAMPSelected<=#Tp 1;
921
              CLAMPZSelected<=#Tp 0;
922
              HIGHZSelected<=#Tp 0;
923
              DEBUGSelected<=#Tp 0;
924
              BYPASSSelected<=#Tp 0;
925
            end
926
          `CLAMPZ: // ClampZ
927
            begin
928
              EXTESTSelected<=#Tp 0;
929
              SAMPLE_PRELOADSelected<=#Tp 0;
930
              IDCODESelected<=#Tp 0;
931
              CHAIN_SELECTSelected<=#Tp 0;
932
              INTESTSelected<=#Tp 0;
933
              CLAMPSelected<=#Tp 0;
934
              CLAMPZSelected<=#Tp 1;
935
              HIGHZSelected<=#Tp 0;
936
              DEBUGSelected<=#Tp 0;
937
              BYPASSSelected<=#Tp 0;
938
            end
939
          `HIGHZ: // High Z
940
            begin
941
              EXTESTSelected<=#Tp 0;
942
              SAMPLE_PRELOADSelected<=#Tp 0;
943
              IDCODESelected<=#Tp 0;
944
              CHAIN_SELECTSelected<=#Tp 0;
945
              INTESTSelected<=#Tp 0;
946
              CLAMPSelected<=#Tp 0;
947
              CLAMPZSelected<=#Tp 0;
948
              HIGHZSelected<=#Tp 1;
949
              DEBUGSelected<=#Tp 0;
950
              BYPASSSelected<=#Tp 0;
951
            end
952
          `DEBUG: // Debug
953
            begin
954
              EXTESTSelected<=#Tp 0;
955
              SAMPLE_PRELOADSelected<=#Tp 0;
956
              IDCODESelected<=#Tp 0;
957
              CHAIN_SELECTSelected<=#Tp 0;
958
              INTESTSelected<=#Tp 0;
959
              CLAMPSelected<=#Tp 0;
960
              CLAMPZSelected<=#Tp 0;
961
              HIGHZSelected<=#Tp 0;
962
              DEBUGSelected<=#Tp 1;
963
              BYPASSSelected<=#Tp 0;
964
            end
965
          `BYPASS: // BYPASS
966
            begin
967
              EXTESTSelected<=#Tp 0;
968
              SAMPLE_PRELOADSelected<=#Tp 0;
969
              IDCODESelected<=#Tp 0;
970
              CHAIN_SELECTSelected<=#Tp 0;
971
              INTESTSelected<=#Tp 0;
972
              CLAMPSelected<=#Tp 0;
973
              CLAMPZSelected<=#Tp 0;
974
              HIGHZSelected<=#Tp 0;
975
              DEBUGSelected<=#Tp 0;
976
              BYPASSSelected<=#Tp 1;
977
            end
978
          default:  // BYPASS
979
            begin
980
              EXTESTSelected<=#Tp 0;
981
              SAMPLE_PRELOADSelected<=#Tp 0;
982
              IDCODESelected<=#Tp 0;
983
              CHAIN_SELECTSelected<=#Tp 0;
984
              INTESTSelected<=#Tp 0;
985
              CLAMPSelected<=#Tp 0;
986
              CLAMPZSelected<=#Tp 0;
987
              HIGHZSelected<=#Tp 0;
988
              DEBUGSelected<=#Tp 0;
989
              BYPASSSelected<=#Tp 1;
990
            end
991
        endcase
992
      end
993
  end
994
end
995
 
996
 
997 5 mohor
/**********************************************************************************
998
*                                                                                                                                                                                                                                                                                                                                       *
999
*               Multiplexing TDO and Tristate control                                                                                                                                                                   *
1000
*                                                                                                                                                                                                                                                                                                                                       *
1001
**********************************************************************************/
1002
wire TDOShifted;
1003
assign TDOShifted = (ShiftIR | Exit1IR)? TDOInstruction : TDOData;
1004
/**********************************************************************************
1005
*                                                                                                                                                                                                                                                                                                                                       *
1006
*               End:    Multiplexing TDO and Tristate control                                                                                                                                           *
1007
*                                                                                                                                                                                                                                                                                                                                       *
1008
**********************************************************************************/
1009
 
1010
 
1011
 
1012 2 mohor
// This multiplexing can be expanded with number of user registers
1013 5 mohor
reg TDOMuxed;
1014 2 mohor
always @ (JTAG_IR or TDOShifted or TDOBypassed)
1015
begin
1016
  case(JTAG_IR)
1017
    `IDCODE: // Reading ID code
1018
      begin
1019
        TDOMuxed<=#Tp TDOShifted;
1020
      end
1021
    `CHAIN_SELECT: // Selecting the chain
1022
      begin
1023
        TDOMuxed<=#Tp TDOShifted;
1024
      end
1025
    `DEBUG: // Debug
1026
      begin
1027
        TDOMuxed<=#Tp TDOShifted;
1028
      end
1029 5 mohor
                `SAMPLE_PRELOAD:        // Sampling/Preloading
1030
                        begin
1031
                                TDOMuxed<=#Tp BS_CHAIN_I;
1032
                        end
1033
                `EXTEST:        // External test
1034
                        begin
1035
                                TDOMuxed<=#Tp BS_CHAIN_I;
1036
                        end
1037 2 mohor
    default:  // BYPASS instruction
1038
      begin
1039
        TDOMuxed<=#Tp TDOBypassed;
1040
      end
1041
  endcase
1042
end
1043
 
1044 5 mohor
// Tristate control for P_TDO pin
1045
assign P_TDO = (ShiftIR | ShiftDR | Exit1IR | Exit1DR | UpdateDR)? TDOMuxed : 1'bz;
1046 2 mohor
 
1047
/**********************************************************************************
1048
*                                                                                 *
1049
*   End: Activating Instructions                                                  *
1050
*                                                                                 *
1051
**********************************************************************************/
1052
 
1053
/**********************************************************************************
1054
*                                                                                 *
1055
*   Bit counter                                                                   *
1056
*                                                                                 *
1057
**********************************************************************************/
1058
 
1059
 
1060
always @ (posedge TCK or posedge RESET)
1061
begin
1062
  if(RESET)
1063
    BitCounter[7:0]<=#Tp 0;
1064
  else
1065
  if(ShiftDR)
1066
    BitCounter[7:0]<=#Tp BitCounter[7:0]+1;
1067
  else
1068
  if(UpdateDR)
1069
    BitCounter[7:0]<=#Tp 0;
1070
end
1071
 
1072
 
1073
 
1074
/**********************************************************************************
1075
*                                                                                 *
1076
*   End: Bit counter                                                              *
1077
*                                                                                 *
1078
**********************************************************************************/
1079
 
1080
 
1081
 
1082
/**********************************************************************************
1083
*                                                                                 *
1084
*   Connecting Registers                                                          *
1085
*                                                                                 *
1086
**********************************************************************************/
1087
dbg_registers dbgregs(.DataIn(DataOut[31:0]), .DataOut(RegDataIn[31:0]),
1088
                      .Address(ADDR[4:0]), .RW(RW), .Access(RegAccess & ~RegAccess_q), .Clk(Mclk),
1089 5 mohor
                      .Reset(PowerONReset),
1090 2 mohor
                      `ifdef TRACE_ENABLED
1091 5 mohor
                      .ContinMode(ContinMode), .TraceEnable(TraceEnable),
1092 2 mohor
                      .WpTrigger(WpTrigger), .BpTrigger(BpTrigger), .LSSTrigger(LSSTrigger),
1093
                      .ITrigger(ITrigger), .TriggerOper(TriggerOper), .WpQualif(WpQualif),
1094
                      .BpQualif(BpQualif), .LSSQualif(LSSQualif), .IQualif(IQualif),
1095 5 mohor
                      .QualifOper(QualifOper), .RecordPC(RecordPC),
1096
                      .RecordLSEA(RecordLSEA), .RecordLDATA(RecordLDATA),
1097
                      .RecordSDATA(RecordSDATA), .RecordReadSPR(RecordReadSPR),
1098
                      .RecordWriteSPR(RecordWriteSPR), .RecordINSTR(RecordINSTR),
1099
                      .WpTriggerValid(WpTriggerValid),
1100 2 mohor
                      .BpTriggerValid(BpTriggerValid), .LSSTriggerValid(LSSTriggerValid),
1101
                      .ITriggerValid(ITriggerValid), .WpQualifValid(WpQualifValid),
1102
                      .BpQualifValid(BpQualifValid), .LSSQualifValid(LSSQualifValid),
1103
                      .IQualifValid(IQualifValid),
1104
                      .WpStop(WpStop), .BpStop(BpStop), .LSSStop(LSSStop), .IStop(IStop),
1105 5 mohor
                      .StopOper(StopOper), .WpStopValid(WpStopValid), .BpStopValid(BpStopValid),
1106
                      .LSSStopValid(LSSStopValid), .IStopValid(IStopValid),
1107 2 mohor
                      `endif
1108 5 mohor
                      .RiscStall(RiscStall_reg), .RiscReset(RiscReset_reg)
1109
 
1110 2 mohor
                     );
1111
 
1112
/**********************************************************************************
1113
*                                                                                 *
1114
*   End: Connecting Registers                                                     *
1115
*                                                                                 *
1116
**********************************************************************************/
1117
 
1118
 
1119
/**********************************************************************************
1120
*                                                                                 *
1121
*   Connecting CRC module                                                         *
1122
*                                                                                 *
1123
**********************************************************************************/
1124
wire ResetCrc = RESET | UpdateDR_q;   // igor !!! Ta asinhroni reset popraviti
1125
wire [7:0] CalculatedCrcIn;     // crc calculated from the input data (shifted in)
1126
 
1127
wire EnableCrcIn = ShiftDR &
1128
                 (  (CHAIN_SELECTSelected                 & (BitCounter<4))  |
1129
                    ((DEBUGSelected & RegisterScanChain)  & (BitCounter<38)) |
1130
                    ((DEBUGSelected & RiscDebugScanChain) & (BitCounter<65))
1131
                 );
1132
 
1133
wire EnableCrcOut= ShiftDR &
1134
//                 (  (CHAIN_SELECTSelected                 & (BitCounter<4))  |  Crc is not generated because crc of data that is equal to 0 is 0.
1135
                 (
1136
                    ((DEBUGSelected & RegisterScanChain)  & (BitCounter<38)) |
1137
                    ((DEBUGSelected & RiscDebugScanChain) & (BitCounter<65))
1138
                    `ifdef TRACE_ENABLED
1139
                                                                             |
1140
                    ((DEBUGSelected & TraceTestScanChain) & (BitCounter<40))
1141
                    `endif
1142
                 );
1143
 
1144
// Calculating crc for input data
1145
dbg_crc8_d1 crc1 (.Data(TDI), .EnableCrc(EnableCrcIn), .ResetCrc(ResetCrc),
1146
                  .CrcOut(CalculatedCrcIn), .Clk(TCK));
1147
 
1148
// Calculating crc for output data
1149
dbg_crc8_d1 crc2 (.Data(TDOData), .EnableCrc(EnableCrcOut), .ResetCrc(ResetCrc),
1150
                  .CrcOut(CalculatedCrcOut), .Clk(TCK));
1151
 
1152
 
1153
// Generating CrcMatch signal
1154
always @ (posedge TCK or posedge RESET)
1155
begin
1156
  if(RESET)
1157
    CrcMatch <=#Tp 1'b0;
1158
  else
1159
  if(Exit1DR)
1160
    begin
1161
      if(CHAIN_SELECTSelected)
1162
        CrcMatch <=#Tp CalculatedCrcIn == JTAG_DR_IN[11:4];
1163
      else
1164
      if(RegisterScanChain & ~CHAIN_SELECTSelected)
1165
        CrcMatch <=#Tp CalculatedCrcIn == JTAG_DR_IN[45:38];
1166
      else
1167
      if(RiscDebugScanChain & ~CHAIN_SELECTSelected)
1168
        CrcMatch <=#Tp CalculatedCrcIn == JTAG_DR_IN[72:65];
1169
    end
1170
end
1171
 
1172
 
1173
// Active chain
1174
assign RegisterScanChain   = Chain == `REGISTER_SCAN_CHAIN;
1175
assign RiscDebugScanChain  = Chain == `RISC_DEBUG_CHAIN;
1176
 
1177
`ifdef TRACE_ENABLED
1178
  assign TraceTestScanChain  = Chain == `TRACE_TEST_CHAIN;
1179
`endif
1180
 
1181
/**********************************************************************************
1182
*                                                                                 *
1183
*   End: Connecting CRC module                                                    *
1184
*                                                                                 *
1185
**********************************************************************************/
1186
 
1187
/**********************************************************************************
1188
*                                                                                 *
1189
*   Connecting trace module                                                       *
1190
*                                                                                 *
1191
**********************************************************************************/
1192
`ifdef TRACE_ENABLED
1193 5 mohor
  dbg_trace dbgTrace1(.Wp(Wp), .Bp(Bp), .DataIn(RISC_DATA_IN), .OpSelect(OpSelect),
1194
                      .LsStatus(LsStatus), .IStatus(IStatus), .RiscStall(RiscStall_trace),
1195 2 mohor
                      .Mclk(Mclk), .Reset(RESET), .TraceChain(TraceChain),
1196
                      .ContinMode(ContinMode), .TraceEnable(TraceEnable),
1197 5 mohor
                      .WpTrigger(WpTrigger),
1198 2 mohor
                      .BpTrigger(BpTrigger), .LSSTrigger(LSSTrigger), .ITrigger(ITrigger),
1199
                      .TriggerOper(TriggerOper), .WpQualif(WpQualif), .BpQualif(BpQualif),
1200
                      .LSSQualif(LSSQualif), .IQualif(IQualif), .QualifOper(QualifOper),
1201 5 mohor
                      .RecordPC(RecordPC), .RecordLSEA(RecordLSEA),
1202
                      .RecordLDATA(RecordLDATA), .RecordSDATA(RecordSDATA),
1203
                      .RecordReadSPR(RecordReadSPR), .RecordWriteSPR(RecordWriteSPR),
1204
                      .RecordINSTR(RecordINSTR),
1205 2 mohor
                      .WpTriggerValid(WpTriggerValid), .BpTriggerValid(BpTriggerValid),
1206
                      .LSSTriggerValid(LSSTriggerValid), .ITriggerValid(ITriggerValid),
1207
                      .WpQualifValid(WpQualifValid), .BpQualifValid(BpQualifValid),
1208
                      .LSSQualifValid(LSSQualifValid), .IQualifValid(IQualifValid),
1209
                      .ReadBuffer(ReadBuffer_Mclk),
1210
                      .WpStop(WpStop), .BpStop(BpStop), .LSSStop(LSSStop), .IStop(IStop),
1211
                      .StopOper(StopOper), .WpStopValid(WpStopValid), .BpStopValid(BpStopValid),
1212
                      .LSSStopValid(LSSStopValid), .IStopValid(IStopValid)
1213
                     );
1214
`endif
1215
/**********************************************************************************
1216
*                                                                                 *
1217
*   End: Connecting trace module                                                  *
1218
*                                                                                 *
1219
**********************************************************************************/
1220
 
1221
 
1222
 
1223
endmodule // TAP

powered by: WebSVN 2.1.0

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