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

Subversion Repositories dbg_interface

[/] [dbg_interface/] [tags/] [asyst_2/] [rtl/] [verilog/] [dbg_cpu.v] - Blame information for rev 141

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

Line No. Rev Author Line
1 100 mohor
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  dbg_cpu.v                                                   ////
4
////                                                              ////
5
////                                                              ////
6 139 igorm
////  This file is part of the SoC Debug Interface.               ////
7 100 mohor
////  http://www.opencores.org/projects/DebugInterface/           ////
8
////                                                              ////
9
////  Author(s):                                                  ////
10
////       Igor Mohor (igorm@opencores.org)                       ////
11
////                                                              ////
12
////                                                              ////
13
////  All additional information is avaliable in the README.txt   ////
14
////  file.                                                       ////
15
////                                                              ////
16
//////////////////////////////////////////////////////////////////////
17
////                                                              ////
18
//// Copyright (C) 2000 - 2004 Authors                            ////
19
////                                                              ////
20
//// This source file may be used and distributed without         ////
21
//// restriction provided that this copyright statement is not    ////
22
//// removed from the file and that any derivative work contains  ////
23
//// the original copyright notice and the associated disclaimer. ////
24
////                                                              ////
25
//// This source file is free software; you can redistribute it   ////
26
//// and/or modify it under the terms of the GNU Lesser General   ////
27
//// Public License as published by the Free Software Foundation; ////
28
//// either version 2.1 of the License, or (at your option) any   ////
29
//// later version.                                               ////
30
////                                                              ////
31
//// This source is distributed in the hope that it will be       ////
32
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
33
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
34
//// PURPOSE.  See the GNU Lesser General Public License for more ////
35
//// details.                                                     ////
36
////                                                              ////
37
//// You should have received a copy of the GNU Lesser General    ////
38
//// Public License along with this source; if not, download it   ////
39
//// from http://www.opencores.org/lgpl.shtml                     ////
40
////                                                              ////
41
//////////////////////////////////////////////////////////////////////
42
//
43
// CVS Revision History
44
//
45
// $Log: not supported by cvs2svn $
46 141 igorm
// Revision 1.8  2004/03/28 20:27:01  igorm
47
// New release of the debug interface (3rd. release).
48
//
49 139 igorm
// Revision 1.7  2004/01/25 14:04:18  mohor
50
// All flipflops are reset.
51
//
52 123 mohor
// Revision 1.6  2004/01/22 13:58:53  mohor
53
// Port signals are all set to zero after reset.
54
//
55 121 mohor
// Revision 1.5  2004/01/19 07:32:41  simons
56
// Reset values width added because of FV, a good sentence changed because some tools can not handle it.
57
//
58 108 simons
// Revision 1.4  2004/01/17 18:38:11  mohor
59
// cpu_tall_o is set with cpu_stb_o or register.
60
//
61 104 mohor
// Revision 1.3  2004/01/17 18:01:24  mohor
62
// New version.
63
//
64 102 mohor
// Revision 1.2  2004/01/17 17:01:14  mohor
65
// Almost finished.
66
//
67 101 mohor
// Revision 1.1  2004/01/16 14:53:31  mohor
68
// *** empty log message ***
69 100 mohor
//
70
//
71 101 mohor
//
72 139 igorm
 
73 100 mohor
// synopsys translate_off
74
`include "timescale.v"
75
// synopsys translate_on
76
`include "dbg_cpu_defines.v"
77
 
78
// Top module
79
module dbg_cpu(
80
                // JTAG signals
81
                tck_i,
82
                tdi_i,
83
                tdo_o,
84
 
85
                // TAP states
86
                shift_dr_i,
87
                pause_dr_i,
88
                update_dr_i,
89
 
90
                cpu_ce_i,
91
                crc_match_i,
92
                crc_en_o,
93
                shift_crc_o,
94
                rst_i,
95
 
96 139 igorm
                // CPU
97
                cpu_clk_i,
98
                cpu_addr_o, cpu_data_i, cpu_data_o, cpu_bp_i, cpu_stall_o,
99 101 mohor
                cpu_stb_o,
100 139 igorm
                cpu_we_o, cpu_ack_i, cpu_rst_o
101 100 mohor
 
102
              );
103
 
104
// JTAG signals
105
input         tck_i;
106
input         tdi_i;
107
output        tdo_o;
108
 
109
// TAP states
110
input         shift_dr_i;
111
input         pause_dr_i;
112
input         update_dr_i;
113
 
114
input         cpu_ce_i;
115
input         crc_match_i;
116
output        crc_en_o;
117
output        shift_crc_o;
118
input         rst_i;
119 101 mohor
 
120 139 igorm
// CPU
121
input         cpu_clk_i;
122
output [31:0] cpu_addr_o;
123 101 mohor
output [31:0] cpu_data_o;
124
input         cpu_bp_i;
125
output        cpu_stall_o;
126 139 igorm
input  [31:0] cpu_data_i;
127 101 mohor
output        cpu_stb_o;
128
output        cpu_we_o;
129
input         cpu_ack_i;
130
output        cpu_rst_o;
131
 
132 139 igorm
reg           cpu_stb_o;
133
wire          cpu_reg_stall;
134 100 mohor
reg           tdo_o;
135 139 igorm
reg           cpu_ack_q;
136
reg           cpu_ack_csff;
137
reg           cpu_ack_tck;
138 100 mohor
 
139 139 igorm
reg    [31:0] cpu_dat_tmp, cpu_data_dsff;
140
reg    [31:0] cpu_addr_dsff;
141
reg           cpu_we_dsff;
142
reg    [`DBG_CPU_DR_LEN -1 :0] dr;
143
wire          enable;
144 100 mohor
wire          cmd_cnt_en;
145 139 igorm
reg     [`DBG_CPU_CMD_CNT_WIDTH -1:0] cmd_cnt;
146 100 mohor
wire          cmd_cnt_end;
147
reg           cmd_cnt_end_q;
148 139 igorm
reg           addr_len_cnt_en;
149
reg     [5:0] addr_len_cnt;
150
wire          addr_len_cnt_end;
151
reg           addr_len_cnt_end_q;
152
reg           crc_cnt_en;
153
reg     [`DBG_CPU_CRC_CNT_WIDTH -1:0] crc_cnt;
154 100 mohor
wire          crc_cnt_end;
155
reg           crc_cnt_end_q;
156 139 igorm
reg           data_cnt_en;
157
reg    [`DBG_CPU_DATA_CNT_WIDTH:0] data_cnt;
158 141 igorm
reg    [`DBG_CPU_DATA_CNT_LIM_WIDTH:0] data_cnt_limit;
159 100 mohor
wire          data_cnt_end;
160
reg           data_cnt_end_q;
161 139 igorm
reg           crc_match_reg;
162
 
163
reg    [`DBG_CPU_ACC_TYPE_LEN -1:0] acc_type;
164
reg    [`DBG_CPU_ADR_LEN -1:0] adr;
165
reg    [`DBG_CPU_LEN_LEN -1:0] len;
166
reg    [`DBG_CPU_LEN_LEN:0]    len_var;
167
wire   [`DBG_CPU_CTRL_LEN -1:0]ctrl_reg;
168
reg           start_rd_tck;
169
reg           rd_tck_started;
170
reg           start_rd_csff;
171
reg           start_cpu_rd;
172
reg           start_cpu_rd_q;
173
reg           start_wr_tck;
174
reg           start_wr_csff;
175
reg           start_cpu_wr;
176
reg           start_cpu_wr_q;
177
 
178
reg           status_cnt_en;
179 100 mohor
wire          status_cnt_end;
180
 
181 139 igorm
wire          half, long;
182
reg           half_q, long_q;
183 100 mohor
 
184 139 igorm
reg [`DBG_CPU_STATUS_CNT_WIDTH -1:0] status_cnt;
185 100 mohor
 
186 139 igorm
reg [`DBG_CPU_STATUS_LEN -1:0] status;
187 100 mohor
 
188 139 igorm
reg           cpu_overrun, cpu_overrun_csff, cpu_overrun_tck;
189
reg           underrun_tck;
190 100 mohor
 
191 139 igorm
reg           busy_cpu;
192
reg           busy_tck;
193
reg           cpu_end;
194
reg           cpu_end_rst;
195
reg           cpu_end_rst_csff;
196
reg           cpu_end_csff;
197
reg           cpu_end_tck, cpu_end_tck_q;
198
reg           busy_csff;
199
reg           latch_data;
200
reg           update_dr_csff, update_dr_cpu;
201
wire [`DBG_CPU_CTRL_LEN -1:0] cpu_reg_data_i;
202
wire                          cpu_reg_we;
203 101 mohor
 
204 139 igorm
reg           set_addr, set_addr_csff, set_addr_cpu, set_addr_cpu_q;
205
wire   [31:0] input_data;
206
 
207
wire          len_eq_0;
208 100 mohor
wire          crc_cnt_31;
209
 
210 139 igorm
reg           fifo_full;
211
reg     [7:0] mem [0:3];
212
reg           cpu_ce_csff;
213
reg           mem_ptr_init;
214
reg [`DBG_CPU_CMD_LEN -1: 0] curr_cmd;
215
wire          curr_cmd_go;
216
reg           curr_cmd_go_q;
217
wire          curr_cmd_wr_comm;
218
wire          curr_cmd_wr_ctrl;
219
wire          curr_cmd_rd_comm;
220
wire          curr_cmd_rd_ctrl;
221
wire          acc_type_read;
222
wire          acc_type_write;
223 100 mohor
 
224 101 mohor
 
225 100 mohor
assign enable = cpu_ce_i & shift_dr_i;
226
assign crc_en_o = enable & crc_cnt_end & (~status_cnt_end);
227
assign shift_crc_o = enable & status_cnt_end;  // Signals dbg module to shift out the CRC
228
 
229 139 igorm
assign curr_cmd_go      = (curr_cmd == `DBG_CPU_GO) && cmd_cnt_end;
230
assign curr_cmd_wr_comm = (curr_cmd == `DBG_CPU_WR_COMM) && cmd_cnt_end;
231
assign curr_cmd_wr_ctrl = (curr_cmd == `DBG_CPU_WR_CTRL) && cmd_cnt_end;
232
assign curr_cmd_rd_comm = (curr_cmd == `DBG_CPU_RD_COMM) && cmd_cnt_end;
233
assign curr_cmd_rd_ctrl = (curr_cmd == `DBG_CPU_RD_CTRL) && cmd_cnt_end;
234 100 mohor
 
235 139 igorm
assign acc_type_read    = (acc_type == `DBG_CPU_READ);
236
assign acc_type_write   = (acc_type == `DBG_CPU_WRITE);
237
 
238
 
239
 
240
reg [799:0] dr_text;
241
// Shift register for shifting in and out the data
242
always @ (posedge tck_i or posedge rst_i)
243
begin
244
  if (rst_i)
245
    begin
246
      latch_data <= #1 1'b0;
247
      dr <= #1 {`DBG_CPU_DR_LEN{1'b0}};
248
      dr_text = "reset";
249
    end
250
  else if (curr_cmd_rd_comm && crc_cnt_31)  // Latching data (from internal regs)
251
    begin
252
      dr[`DBG_CPU_ACC_TYPE_LEN + `DBG_CPU_ADR_LEN + `DBG_CPU_LEN_LEN -1:0] <= #1 {acc_type, adr, len};
253
      dr_text = "latch reg data";
254
    end
255
  else if (curr_cmd_rd_ctrl && crc_cnt_31)  // Latching data (from control regs)
256
    begin
257
      dr[`DBG_CPU_DR_LEN -1:`DBG_CPU_DR_LEN -`DBG_CPU_CTRL_LEN] <= #1 ctrl_reg;
258
      dr_text = "latch ctrl reg data";
259
    end
260
  else if (acc_type_read && curr_cmd_go && crc_cnt_31)  // Latchind first data (from WB)
261
    begin
262
      dr[31:0] <= #1 input_data[31:0];
263
      latch_data <= #1 1'b1;
264
      dr_text = "latch first data";
265
    end
266
  else if (acc_type_read && curr_cmd_go && crc_cnt_end) // Latching data (from WB)
267
    begin
268
      case (acc_type)  // synthesis parallel_case full_case
269
        `DBG_CPU_READ: begin
270
                      if(long & (~long_q))
271
                        begin
272
                          dr[31:0] <= #1 input_data[31:0];
273
                          latch_data <= #1 1'b1;
274
                          dr_text = "latch_data word";
275
                        end
276
                      else
277
                        begin
278
                          dr[31:0] <= #1 {dr[30:0], 1'b0};
279
                          latch_data <= #1 1'b0;
280
                          dr_text = "shift word";
281
                        end
282
                    end
283
      endcase
284
    end
285
  else if (enable && (!addr_len_cnt_end))
286
    begin
287
      dr <= #1 {dr[`DBG_CPU_DR_LEN -2:0], tdi_i};
288
      dr_text = "shift dr";
289
    end
290
end
291
 
292
 
293
 
294 100 mohor
assign cmd_cnt_en = enable & (~cmd_cnt_end);
295
 
296
 
297
// Command counter
298
always @ (posedge tck_i or posedge rst_i)
299
begin
300
  if (rst_i)
301 139 igorm
    cmd_cnt <= #1 {`DBG_CPU_CMD_CNT_WIDTH{1'b0}};
302 100 mohor
  else if (update_dr_i)
303 139 igorm
    cmd_cnt <= #1 {`DBG_CPU_CMD_CNT_WIDTH{1'b0}};
304 100 mohor
  else if (cmd_cnt_en)
305
    cmd_cnt <= #1 cmd_cnt + 1'b1;
306
end
307
 
308
 
309 139 igorm
// Assigning current command
310
always @ (posedge tck_i or posedge rst_i)
311
begin
312
  if (rst_i)
313
    curr_cmd <= #1 {`DBG_CPU_CMD_LEN{1'b0}};
314
  else if (update_dr_i)
315
    curr_cmd <= #1 {`DBG_CPU_CMD_LEN{1'b0}};
316
  else if (cmd_cnt == (`DBG_CPU_CMD_LEN -1))
317
    curr_cmd <= #1 {dr[`DBG_CPU_CMD_LEN-2 :0], tdi_i};
318
end
319 100 mohor
 
320
 
321 139 igorm
// Assigning current command
322
always @ (posedge tck_i or posedge rst_i)
323
begin
324
  if (rst_i)
325
    curr_cmd_go_q <= #1 1'b0;
326
  else
327
    curr_cmd_go_q <= #1 curr_cmd_go;
328
end
329
 
330
 
331
always @ (enable or cmd_cnt_end or addr_len_cnt_end or curr_cmd_wr_comm or curr_cmd_wr_ctrl or curr_cmd_rd_comm or curr_cmd_rd_ctrl or crc_cnt_end)
332
begin
333
  if (enable && (!addr_len_cnt_end))
334
    begin
335
      if (cmd_cnt_end && (curr_cmd_wr_comm || curr_cmd_wr_ctrl))
336
        addr_len_cnt_en = 1'b1;
337
      else if (crc_cnt_end && (curr_cmd_rd_comm || curr_cmd_rd_ctrl))
338
        addr_len_cnt_en = 1'b1;
339
      else
340
        addr_len_cnt_en = 1'b0;
341
    end
342
  else
343
    addr_len_cnt_en = 1'b0;
344
end
345
 
346
 
347 100 mohor
// Address/length counter
348
always @ (posedge tck_i or posedge rst_i)
349
begin
350
  if (rst_i)
351 139 igorm
    addr_len_cnt <= #1 6'h0;
352 100 mohor
  else if (update_dr_i)
353 139 igorm
    addr_len_cnt <= #1 6'h0;
354
  else if (addr_len_cnt_en)
355
    addr_len_cnt <= #1 addr_len_cnt + 1'b1;
356 100 mohor
end
357
 
358
 
359 139 igorm
always @ (enable or data_cnt_end or cmd_cnt_end or curr_cmd_go or acc_type_write or acc_type_read or crc_cnt_end)
360
begin
361
  if (enable && (!data_cnt_end))
362
    begin
363
      if (cmd_cnt_end && curr_cmd_go && acc_type_write)
364
        data_cnt_en = 1'b1;
365
      else if (crc_cnt_end && curr_cmd_go && acc_type_read)
366
        data_cnt_en = 1'b1;
367
      else
368
        data_cnt_en = 1'b0;
369
    end
370
  else
371
    data_cnt_en = 1'b0;
372
end
373 100 mohor
 
374
 
375
// Data counter
376
always @ (posedge tck_i or posedge rst_i)
377
begin
378
  if (rst_i)
379 139 igorm
    data_cnt <= #1 {`DBG_CPU_DATA_CNT_WIDTH{1'b0}};
380 100 mohor
  else if (update_dr_i)
381 139 igorm
    data_cnt <= #1 {`DBG_CPU_DATA_CNT_WIDTH{1'b0}};
382 100 mohor
  else if (data_cnt_en)
383
    data_cnt <= #1 data_cnt + 1'b1;
384
end
385
 
386
 
387
 
388 139 igorm
// Upper limit. Data counter counts until this value is reached.
389 100 mohor
always @ (posedge tck_i or posedge rst_i)
390
begin
391
  if (rst_i)
392 141 igorm
    data_cnt_limit <= #1 {`DBG_CPU_DATA_CNT_LIM_WIDTH{1'b0}};
393 100 mohor
  else if (update_dr_i)
394 141 igorm
    data_cnt_limit <= #1 len + 1'b1;
395 100 mohor
end
396
 
397
 
398 139 igorm
always @ (enable or crc_cnt_end or curr_cmd_rd_comm or curr_cmd_rd_ctrl or curr_cmd_wr_comm or curr_cmd_wr_ctrl or curr_cmd_go or addr_len_cnt_end or data_cnt_end or acc_type_write or acc_type_read or cmd_cnt_end)
399 100 mohor
begin
400 139 igorm
  if (enable && (!crc_cnt_end) && cmd_cnt_end)
401 100 mohor
    begin
402 139 igorm
      if (addr_len_cnt_end && (curr_cmd_wr_comm || curr_cmd_wr_ctrl))
403
        crc_cnt_en = 1'b1;
404
      else if (data_cnt_end && curr_cmd_go && acc_type_write)
405
        crc_cnt_en = 1'b1;
406
      else if (cmd_cnt_end && (curr_cmd_go && acc_type_read || curr_cmd_rd_comm || curr_cmd_rd_ctrl))
407
        crc_cnt_en = 1'b1;
408
      else
409
        crc_cnt_en = 1'b0;
410 100 mohor
    end
411 139 igorm
  else
412
    crc_cnt_en = 1'b0;
413 100 mohor
end
414
 
415
 
416 139 igorm
// crc counter
417 123 mohor
always @ (posedge tck_i or posedge rst_i)
418 100 mohor
begin
419 123 mohor
  if (rst_i)
420 139 igorm
    crc_cnt <= #1 {`DBG_CPU_CRC_CNT_WIDTH{1'b0}};
421
  else if(crc_cnt_en)
422
    crc_cnt <= #1 crc_cnt + 1'b1;
423
  else if (update_dr_i)
424
    crc_cnt <= #1 {`DBG_CPU_CRC_CNT_WIDTH{1'b0}};
425
end
426
 
427
assign cmd_cnt_end      = cmd_cnt      == `DBG_CPU_CMD_LEN;
428
assign addr_len_cnt_end = addr_len_cnt == `DBG_CPU_DR_LEN;
429
assign crc_cnt_end      = crc_cnt      == `DBG_CPU_CRC_CNT_WIDTH'd32;
430
assign crc_cnt_31       = crc_cnt      == `DBG_CPU_CRC_CNT_WIDTH'd31;
431 141 igorm
assign data_cnt_end     = (data_cnt    == {data_cnt_limit, 3'b000});
432 139 igorm
 
433
always @ (posedge tck_i or posedge rst_i)
434
begin
435
  if (rst_i)
436 123 mohor
    begin
437 139 igorm
      crc_cnt_end_q       <= #1 1'b0;
438
      cmd_cnt_end_q       <= #1 1'b0;
439
      data_cnt_end_q      <= #1 1'b0;
440
      addr_len_cnt_end_q  <= #1 1'b0;
441 123 mohor
    end
442
  else
443
    begin
444 139 igorm
      crc_cnt_end_q       <= #1 crc_cnt_end;
445
      cmd_cnt_end_q       <= #1 cmd_cnt_end;
446
      data_cnt_end_q      <= #1 data_cnt_end;
447
      addr_len_cnt_end_q  <= #1 addr_len_cnt_end;
448 123 mohor
    end
449 100 mohor
end
450
 
451
 
452
// Status counter is made of 4 serialy connected registers
453
always @ (posedge tck_i or posedge rst_i)
454
begin
455
  if (rst_i)
456 139 igorm
    status_cnt <= #1 {`DBG_CPU_STATUS_CNT_WIDTH{1'b0}};
457 100 mohor
  else if (update_dr_i)
458 139 igorm
    status_cnt <= #1 {`DBG_CPU_STATUS_CNT_WIDTH{1'b0}};
459
  else if (status_cnt_en)
460
    status_cnt <= #1 status_cnt + 1'b1;
461 100 mohor
end
462
 
463
 
464 141 igorm
always @ (enable or status_cnt_end or crc_cnt_end or curr_cmd_rd_comm or curr_cmd_rd_ctrl or
465
          curr_cmd_wr_comm or curr_cmd_wr_ctrl or curr_cmd_go or acc_type_write or
466
          acc_type_read or data_cnt_end or addr_len_cnt_end)
467 139 igorm
begin
468
  if (enable && (!status_cnt_end))
469
    begin
470
      if (crc_cnt_end && (curr_cmd_wr_comm || curr_cmd_wr_ctrl))
471
        status_cnt_en = 1'b1;
472
      else if (crc_cnt_end && curr_cmd_go && acc_type_write)
473
        status_cnt_en = 1'b1;
474
      else if (data_cnt_end && curr_cmd_go && acc_type_read)
475
        status_cnt_en = 1'b1;
476
      else if (addr_len_cnt_end && (curr_cmd_rd_comm || curr_cmd_rd_ctrl))
477
        status_cnt_en = 1'b1;
478
      else
479
        status_cnt_en = 1'b0;
480
    end
481
  else
482
    status_cnt_en = 1'b0;
483
end
484
 
485
 
486
assign status_cnt_end = status_cnt == `DBG_CPU_STATUS_LEN;
487
 
488
 
489
// Latching acc_type, address and length
490 100 mohor
always @ (posedge tck_i or posedge rst_i)
491
begin
492
  if (rst_i)
493
    begin
494 139 igorm
      acc_type  <= #1 {`DBG_CPU_ACC_TYPE_LEN{1'b0}};
495
      adr       <= #1 {`DBG_CPU_ADR_LEN{1'b0}};
496
      len       <= #1 {`DBG_CPU_LEN_LEN{1'b0}};
497
      set_addr  <= #1 1'b0;
498 100 mohor
    end
499 139 igorm
  else if(crc_cnt_end && (!crc_cnt_end_q) && crc_match_i && curr_cmd_wr_comm)
500 100 mohor
    begin
501 139 igorm
      acc_type  <= #1 dr[`DBG_CPU_ACC_TYPE_LEN + `DBG_CPU_ADR_LEN + `DBG_CPU_LEN_LEN -1 : `DBG_CPU_ADR_LEN + `DBG_CPU_LEN_LEN];
502
      adr       <= #1 dr[`DBG_CPU_ADR_LEN + `DBG_CPU_LEN_LEN -1 : `DBG_CPU_LEN_LEN];
503
      len       <= #1 dr[`DBG_CPU_LEN_LEN -1:0];
504
      set_addr  <= #1 1'b1;
505 100 mohor
    end
506 139 igorm
  else if(cpu_end_tck)               // Writing back the address
507 100 mohor
    begin
508 139 igorm
      adr  <= #1 cpu_addr_dsff;
509 100 mohor
    end
510 139 igorm
  else
511
    set_addr <= #1 1'b0;
512 100 mohor
end
513
 
514
 
515 121 mohor
always @ (posedge tck_i or posedge rst_i)
516 100 mohor
begin
517 121 mohor
  if (rst_i)
518 139 igorm
    crc_match_reg <= #1 1'b0;
519
  else if(crc_cnt_end & (~crc_cnt_end_q))
520
    crc_match_reg <= #1 crc_match_i;
521 100 mohor
end
522
 
523
 
524 139 igorm
// Length counter
525 121 mohor
always @ (posedge tck_i or posedge rst_i)
526 100 mohor
begin
527 121 mohor
  if (rst_i)
528 139 igorm
    len_var <= #1 {1'b0, {`DBG_CPU_LEN_LEN{1'b0}}};
529
  else if(update_dr_i)
530
    len_var <= #1 len + 1'b1;
531
  else if (start_rd_tck)
532 101 mohor
    begin
533 139 igorm
      if (len_var > 'd4)
534
        len_var <= #1 len_var - 3'd4;
535 101 mohor
      else
536 139 igorm
        len_var <= #1 {1'b0, {`DBG_CPU_LEN_LEN{1'b0}}};
537 101 mohor
    end
538 100 mohor
end
539
 
540
 
541 139 igorm
assign len_eq_0 = len_var == 'h0;
542 100 mohor
 
543
 
544 139 igorm
assign half = data_cnt[3:0] == 4'd15;
545
assign long = data_cnt[4:0] == 5'd31;
546
 
547
 
548 123 mohor
always @ (posedge tck_i or posedge rst_i)
549 100 mohor
begin
550 123 mohor
  if (rst_i)
551 100 mohor
    begin
552 139 igorm
      half_q <= #1  1'b0;
553
      long_q <= #1  1'b0;
554 100 mohor
    end
555 139 igorm
  else
556 123 mohor
    begin
557 139 igorm
      half_q <= #1 half;
558
      long_q <= #1 long;
559 123 mohor
    end
560 100 mohor
end
561
 
562 139 igorm
 
563
// Start cpu write cycle
564 100 mohor
always @ (posedge tck_i or posedge rst_i)
565
begin
566
  if (rst_i)
567
    begin
568 139 igorm
      start_wr_tck <= #1 1'b0;
569
      cpu_dat_tmp <= #1 32'h0;
570 100 mohor
    end
571 139 igorm
  else if (curr_cmd_go && acc_type_write)
572 100 mohor
    begin
573 139 igorm
      if (long_q)
574
        begin
575
          start_wr_tck <= #1 1'b1;
576
          cpu_dat_tmp <= #1 dr[31:0];
577
        end
578
      else
579
        begin
580
          start_wr_tck <= #1 1'b0;
581
        end
582 100 mohor
    end
583 139 igorm
  else
584
    start_wr_tck <= #1 1'b0;
585 100 mohor
end
586
 
587
 
588 139 igorm
// cpu_data_o in WB clk domain
589
always @ (posedge cpu_clk_i)
590 100 mohor
begin
591 139 igorm
  cpu_data_dsff <= #1 cpu_dat_tmp;
592 100 mohor
end
593
 
594 139 igorm
assign cpu_data_o = cpu_data_dsff;
595 100 mohor
 
596
 
597 139 igorm
// Start cpu read cycle
598 123 mohor
always @ (posedge tck_i or posedge rst_i)
599 100 mohor
begin
600 123 mohor
  if (rst_i)
601 139 igorm
    start_rd_tck <= #1 1'b0;
602
  else if (curr_cmd_go && (!curr_cmd_go_q) && acc_type_read)              // First read after cmd is entered
603
    start_rd_tck <= #1 1'b1;
604
  else if ((!start_rd_tck) && curr_cmd_go && acc_type_read  && (!len_eq_0) && (!fifo_full) && (!rd_tck_started) && (!cpu_ack_tck))
605
    start_rd_tck <= #1 1'b1;
606
  else
607
    start_rd_tck <= #1 1'b0;
608 100 mohor
end
609
 
610
 
611 123 mohor
always @ (posedge tck_i or posedge rst_i)
612 100 mohor
begin
613 123 mohor
  if (rst_i)
614 139 igorm
    rd_tck_started <= #1 1'b0;
615
  else if (update_dr_i || cpu_end_tck && (!cpu_end_tck_q))
616
    rd_tck_started <= #1 1'b0;
617
  else if (start_rd_tck)
618
    rd_tck_started <= #1 1'b1;
619 100 mohor
end
620
 
621
 
622 139 igorm
 
623
always @ (posedge cpu_clk_i or posedge rst_i)
624 100 mohor
begin
625 123 mohor
  if (rst_i)
626
    begin
627 139 igorm
      start_rd_csff   <= #1 1'b0;
628
      start_cpu_rd    <= #1 1'b0;
629
      start_cpu_rd_q  <= #1 1'b0;
630
 
631
      start_wr_csff   <= #1 1'b0;
632
      start_cpu_wr    <= #1 1'b0;
633
      start_cpu_wr_q  <= #1 1'b0;
634
 
635
      set_addr_csff   <= #1 1'b0;
636
      set_addr_cpu    <= #1 1'b0;
637
      set_addr_cpu_q  <= #1 1'b0;
638
 
639
      cpu_ack_q       <= #1 1'b0;
640 123 mohor
    end
641
  else
642
    begin
643 139 igorm
      start_rd_csff   <= #1 start_rd_tck;
644
      start_cpu_rd    <= #1 start_rd_csff;
645
      start_cpu_rd_q  <= #1 start_cpu_rd;
646
 
647
      start_wr_csff   <= #1 start_wr_tck;
648
      start_cpu_wr    <= #1 start_wr_csff;
649
      start_cpu_wr_q  <= #1 start_cpu_wr;
650
 
651
      set_addr_csff   <= #1 set_addr;
652
      set_addr_cpu    <= #1 set_addr_csff;
653
      set_addr_cpu_q  <= #1 set_addr_cpu;
654
 
655
      cpu_ack_q       <= #1 cpu_ack_i;
656 123 mohor
    end
657 101 mohor
end
658
 
659
 
660 139 igorm
// cpu_stb_o
661
always @ (posedge cpu_clk_i or posedge rst_i)
662 101 mohor
begin
663 123 mohor
  if (rst_i)
664 139 igorm
    cpu_stb_o <= #1 1'b0;
665
  else if (cpu_ack_i)
666
    cpu_stb_o <= #1 1'b0;
667
  else if ((start_cpu_wr && (!start_cpu_wr_q)) || (start_cpu_rd && (!start_cpu_rd_q)))
668
    cpu_stb_o <= #1 1'b1;
669 100 mohor
end
670
 
671
 
672 139 igorm
assign cpu_stall_o = cpu_stb_o | cpu_reg_stall;
673
 
674
 
675
// cpu_addr_o logic
676
always @ (posedge cpu_clk_i or posedge rst_i)
677 100 mohor
begin
678 121 mohor
  if (rst_i)
679 139 igorm
    cpu_addr_dsff <= #1 32'h0;
680
  else if (set_addr_cpu && (!set_addr_cpu_q)) // Setting starting address
681
    cpu_addr_dsff <= #1 adr;
682
  else if (cpu_ack_i && (!cpu_ack_q))
683
    cpu_addr_dsff <= #1 cpu_addr_dsff + 3'd4;
684 100 mohor
end
685
 
686
 
687 139 igorm
assign cpu_addr_o = cpu_addr_dsff;
688 100 mohor
 
689
 
690 139 igorm
always @ (posedge cpu_clk_i)
691
begin
692
  cpu_we_dsff <= #1 curr_cmd_go && acc_type_write;
693
end
694 101 mohor
 
695 139 igorm
 
696
assign cpu_we_o = cpu_we_dsff;
697
 
698
 
699
 
700
// Logic for detecting end of transaction
701
always @ (posedge cpu_clk_i or posedge rst_i)
702
begin
703
  if (rst_i)
704
    cpu_end <= #1 1'b0;
705
  else if (cpu_ack_i && (!cpu_ack_q))
706
    cpu_end <= #1 1'b1;
707
  else if (cpu_end_rst)
708
    cpu_end <= #1 1'b0;
709
end
710
 
711
 
712 123 mohor
always @ (posedge tck_i or posedge rst_i)
713 100 mohor
begin
714 123 mohor
  if (rst_i)
715 139 igorm
    begin
716
      cpu_end_csff  <= #1 1'b0;
717
      cpu_end_tck   <= #1 1'b0;
718
      cpu_end_tck_q <= #1 1'b0;
719
    end
720 100 mohor
  else
721 139 igorm
    begin
722
      cpu_end_csff  <= #1 cpu_end;
723
      cpu_end_tck   <= #1 cpu_end_csff;
724
      cpu_end_tck_q <= #1 cpu_end_tck;
725
    end
726 100 mohor
end
727
 
728
 
729 139 igorm
always @ (posedge cpu_clk_i or posedge rst_i)
730
begin
731
  if (rst_i)
732
    begin
733
      cpu_end_rst_csff <= #1 1'b0;
734
      cpu_end_rst      <= #1 1'b0;
735
    end
736
  else
737
    begin
738
      cpu_end_rst_csff <= #1 cpu_end_tck;
739
      cpu_end_rst      <= #1 cpu_end_rst_csff;
740
    end
741
end
742 100 mohor
 
743
 
744 139 igorm
always @ (posedge cpu_clk_i or posedge rst_i)
745
begin
746
  if (rst_i)
747
    busy_cpu <= #1 1'b0;
748
  else if (cpu_end_rst)
749
    busy_cpu <= #1 1'b0;
750
  else if (cpu_stb_o)
751
    busy_cpu <= #1 1'b1;
752
end
753 100 mohor
 
754
 
755 123 mohor
always @ (posedge tck_i or posedge rst_i)
756 101 mohor
begin
757 123 mohor
  if (rst_i)
758
    begin
759 139 igorm
      busy_csff       <= #1 1'b0;
760
      busy_tck        <= #1 1'b0;
761
 
762
      update_dr_csff  <= #1 1'b0;
763
      update_dr_cpu   <= #1 1'b0;
764 123 mohor
    end
765
  else
766
    begin
767 139 igorm
      busy_csff       <= #1 busy_cpu;
768
      busy_tck        <= #1 busy_csff;
769
 
770
      update_dr_csff  <= #1 update_dr_i;
771
      update_dr_cpu   <= #1 update_dr_csff;
772 123 mohor
    end
773 101 mohor
end
774
 
775
 
776 139 igorm
// Detecting overrun when write operation.
777
always @ (posedge cpu_clk_i or posedge rst_i)
778
begin
779
  if (rst_i)
780
    cpu_overrun <= #1 1'b0;
781
  else if(start_cpu_wr && (!start_cpu_wr_q) && cpu_ack_i)
782
    cpu_overrun <= #1 1'b1;
783
  else if(update_dr_cpu) // error remains active until update_dr arrives
784
    cpu_overrun <= #1 1'b0;
785
end
786 101 mohor
 
787 139 igorm
 
788
// Detecting underrun when read operation
789 121 mohor
always @ (posedge tck_i or posedge rst_i)
790 101 mohor
begin
791 121 mohor
  if (rst_i)
792 139 igorm
    underrun_tck <= #1 1'b0;
793
  else if(latch_data && (!fifo_full) && (!data_cnt_end))
794
    underrun_tck <= #1 1'b1;
795
  else if(update_dr_i) // error remains active until update_dr arrives
796
    underrun_tck <= #1 1'b0;
797 101 mohor
end
798
 
799
 
800 139 igorm
always @ (posedge tck_i or posedge rst_i)
801
begin
802
  if (rst_i)
803
    begin
804
      cpu_overrun_csff <= #1 1'b0;
805
      cpu_overrun_tck  <= #1 1'b0;
806 101 mohor
 
807 139 igorm
      cpu_ack_csff     <= #1 1'b0;
808
      cpu_ack_tck      <= #1 1'b0;
809
    end
810
  else
811
    begin
812
      cpu_overrun_csff <= #1 cpu_overrun;
813
      cpu_overrun_tck  <= #1 cpu_overrun_csff;
814
 
815
      cpu_ack_csff     <= #1 cpu_ack_i;
816
      cpu_ack_tck      <= #1 cpu_ack_csff;
817
    end
818
end
819
 
820
 
821
 
822 123 mohor
always @ (posedge cpu_clk_i or posedge rst_i)
823 101 mohor
begin
824 123 mohor
  if (rst_i)
825
    begin
826 139 igorm
      cpu_ce_csff  <= #1 1'b0;
827
      mem_ptr_init      <= #1 1'b0;
828 123 mohor
    end
829
  else
830
    begin
831 139 igorm
      cpu_ce_csff  <= #1  cpu_ce_i;
832
      mem_ptr_init      <= #1 ~cpu_ce_csff;
833 123 mohor
    end
834 101 mohor
end
835
 
836
 
837 139 igorm
// Logic for latching data that is read from cpu
838
always @ (posedge cpu_clk_i)
839 102 mohor
begin
840 139 igorm
  if (cpu_ack_i && (!cpu_ack_q))
841
    begin
842
      mem[0] <= #1 cpu_data_i[31:24];
843
      mem[1] <= #1 cpu_data_i[23:16];
844
      mem[2] <= #1 cpu_data_i[15:08];
845
      mem[3] <= #1 cpu_data_i[07:00];
846
    end
847 102 mohor
end
848 101 mohor
 
849
 
850 139 igorm
assign input_data = {mem[0], mem[1], mem[2], mem[3]};
851 101 mohor
 
852 139 igorm
 
853
// Fifo counter and empty/full detection
854 102 mohor
always @ (posedge tck_i or posedge rst_i)
855
begin
856
  if (rst_i)
857 139 igorm
    fifo_full <= #1 1'h0;
858
  else if (update_dr_i)
859
    fifo_full <= #1 1'h0;
860
  else if (cpu_end_tck && (!cpu_end_tck_q) && (!latch_data) && (!fifo_full))  // incrementing
861
    fifo_full <= #1 1'b1;
862
  else if (!(cpu_end_tck && (!cpu_end_tck_q)) && latch_data && (fifo_full))  // decrementing
863
    fifo_full <= #1 1'h0;
864 102 mohor
end
865 101 mohor
 
866 102 mohor
 
867 139 igorm
reg [799:0] tdo_text;
868 102 mohor
 
869
// TDO multiplexer
870 139 igorm
always @ (pause_dr_i or busy_tck or crc_cnt_end or crc_cnt_end_q or curr_cmd_wr_comm or curr_cmd_wr_ctrl or curr_cmd_go or acc_type_write or acc_type_read or crc_match_i or data_cnt_end or dr or data_cnt_end_q or crc_match_reg or status_cnt_en or status or addr_len_cnt_end or addr_len_cnt_end_q or curr_cmd_rd_comm or curr_cmd_rd_ctrl)
871 102 mohor
begin
872 139 igorm
  if (pause_dr_i)
873 102 mohor
    begin
874 139 igorm
    tdo_o = busy_tck;
875
    tdo_text = "busy_tck";
876 102 mohor
    end
877 139 igorm
  else if (crc_cnt_end && (!crc_cnt_end_q) && (curr_cmd_wr_comm || curr_cmd_wr_ctrl || curr_cmd_go && acc_type_write ))
878 102 mohor
    begin
879 139 igorm
      tdo_o = ~crc_match_i;
880
      tdo_text = "crc_match_i";
881 102 mohor
    end
882 139 igorm
  else if (curr_cmd_go && acc_type_read && crc_cnt_end && (!data_cnt_end))
883 102 mohor
    begin
884 139 igorm
      tdo_o = dr[31];
885
      tdo_text = "dr[31]";
886 102 mohor
    end
887 139 igorm
  else if (curr_cmd_go && acc_type_read && data_cnt_end && (!data_cnt_end_q))
888 102 mohor
    begin
889 139 igorm
      tdo_o = ~crc_match_reg;
890
      tdo_text = "crc_match_reg";
891 102 mohor
    end
892 139 igorm
  else if ((curr_cmd_rd_comm || curr_cmd_rd_ctrl) && addr_len_cnt_end && (!addr_len_cnt_end_q))
893
    begin
894
      tdo_o = ~crc_match_reg;
895
      tdo_text = "crc_match_reg_rd_comm";
896
    end
897
  else if ((curr_cmd_rd_comm || curr_cmd_rd_ctrl) && crc_cnt_end && (!addr_len_cnt_end))
898
    begin
899
      tdo_o = dr[`DBG_CPU_ACC_TYPE_LEN + `DBG_CPU_ADR_LEN + `DBG_CPU_LEN_LEN -1];
900
      tdo_text = "rd_comm | rd_ctrl data";
901
    end
902
  else if (status_cnt_en)
903
    begin
904
      tdo_o = status[3];
905
      tdo_text = "status";
906
    end
907 102 mohor
  else
908
    begin
909
      tdo_o = 1'b0;
910 139 igorm
      tdo_text = "zero";
911 102 mohor
    end
912
end
913
 
914 139 igorm
reg [799:0] status_text;
915
// Status register
916
always @ (posedge tck_i or posedge rst_i)
917
begin
918
  if (rst_i)
919
    begin
920
    status <= #1 {`DBG_CPU_STATUS_LEN{1'b0}};
921
    status_text = "reset";
922
    end
923
  else if(crc_cnt_end && (!crc_cnt_end_q) && (!(curr_cmd_go && acc_type_read)))
924
    begin
925
    status <= #1 {1'b0, 1'b0, cpu_overrun_tck, crc_match_i};
926
    status_text = "latch ni read";
927
    end
928
  else if (data_cnt_end && (!data_cnt_end_q) && curr_cmd_go && acc_type_read)
929
    begin
930
    status <= #1 {1'b0, 1'b0, underrun_tck, crc_match_reg};
931
    status_text = "latch read";
932
    end
933
  else if (addr_len_cnt_end && (!addr_len_cnt_end) && (curr_cmd_rd_comm || curr_cmd_rd_ctrl))
934
    begin
935
    status <= #1 {1'b0, 1'b0, 1'b0, crc_match_reg};
936
    status_text = "rd_comm | rd_ctrl";
937
    end
938
  else if (shift_dr_i && (!status_cnt_end))
939
    begin
940
    status <= #1 {status[`DBG_CPU_STATUS_LEN -2:0], status[`DBG_CPU_STATUS_LEN -1]};
941
    status_text = "shifting";
942
    end
943
end
944
// Following status is shifted out (MSB first):
945
// 3. bit:          1 if crc is OK, else 0
946
// 2. bit:          1'b0
947
// 1. bit:          0
948
// 0. bit:          1 if overrun occured during write (data couldn't be written fast enough)
949
//                    or underrun occured during read (data couldn't be read fast enough)
950 102 mohor
 
951
 
952
 
953 139 igorm
// Connecting cpu registers
954
assign cpu_reg_we = crc_cnt_end && (!crc_cnt_end_q) && crc_match_i && curr_cmd_wr_ctrl;
955
assign cpu_reg_data_i = dr[`DBG_CPU_DR_LEN -1:`DBG_CPU_DR_LEN -`DBG_CPU_CTRL_LEN];
956 102 mohor
 
957 139 igorm
dbg_cpu_registers i_dbg_cpu_registers
958
  (
959
    .data_i          (cpu_reg_data_i),
960
    .we_i            (cpu_reg_we),
961
    .tck_i           (tck_i),
962
    .bp_i            (cpu_bp_i),
963
    .rst_i           (rst_i),
964
    .cpu_clk_i       (cpu_clk_i),
965
    .ctrl_reg_o      (ctrl_reg),
966
    .cpu_stall_o     (cpu_reg_stall),
967
    .cpu_rst_o       (cpu_rst_o)
968
  );
969 102 mohor
 
970
 
971 139 igorm
 
972
 
973
 
974 100 mohor
endmodule
975
 

powered by: WebSVN 2.1.0

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