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

Subversion Repositories dbg_interface

[/] [dbg_interface/] [tags/] [asyst_3/] [rtl/] [verilog/] [dbg_cpu.v] - Blame information for rev 139

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

powered by: WebSVN 2.1.0

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