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

Subversion Repositories dbg_interface

[/] [dbg_interface/] [tags/] [rel_15/] [rtl/] [verilog/] [dbg_wb.v] - Blame information for rev 102

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

Line No. Rev Author Line
1 82 mohor
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  dbg_wb.v                                                    ////
4
////                                                              ////
5
////                                                              ////
6
////  This file is part of the SoC/OpenRISC Development Interface ////
7
////  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 - 2003 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 102 mohor
// Revision 1.14  2004/01/16 14:51:33  mohor
47
// cpu registers added.
48
//
49 99 mohor
// Revision 1.13  2004/01/15 12:09:43  mohor
50
// Working.
51
//
52 97 mohor
// Revision 1.12  2004/01/14 22:59:18  mohor
53
// Temp version.
54
//
55 95 mohor
// Revision 1.11  2004/01/14 12:29:40  mohor
56
// temp version. Resets will be changed in next version.
57
//
58 94 mohor
// Revision 1.10  2004/01/13 11:28:14  mohor
59
// tmp version.
60
//
61 93 mohor
// Revision 1.9  2004/01/10 07:50:24  mohor
62
// temp version.
63
//
64 92 mohor
// Revision 1.8  2004/01/09 12:48:44  mohor
65
// tmp version.
66
//
67 91 mohor
// Revision 1.7  2004/01/08 17:53:36  mohor
68
// tmp version.
69
//
70 90 mohor
// Revision 1.6  2004/01/07 11:58:56  mohor
71
// temp4 version.
72
//
73 89 mohor
// Revision 1.5  2004/01/06 17:15:19  mohor
74
// temp3 version.
75
//
76 88 mohor
// Revision 1.4  2004/01/05 12:16:00  mohor
77
// tmp2 version.
78
//
79 87 mohor
// Revision 1.3  2003/12/23 16:22:46  mohor
80
// Tmp version.
81
//
82 86 mohor
// Revision 1.2  2003/12/23 15:26:26  mohor
83
// Small fix.
84
//
85 83 mohor
// Revision 1.1  2003/12/23 15:09:04  mohor
86
// New directory structure. New version of the debug interface.
87 82 mohor
//
88
//
89 83 mohor
//
90 82 mohor
 
91
// synopsys translate_off
92
`include "timescale.v"
93
// synopsys translate_on
94
`include "dbg_wb_defines.v"
95
 
96
// Top module
97
module dbg_wb(
98
                // JTAG signals
99
                tck_i,
100
                tdi_i,
101
                tdo_o,
102
 
103
                // TAP states
104
                shift_dr_i,
105
                pause_dr_i,
106
                update_dr_i,
107
 
108
                wishbone_ce_i,
109
                crc_match_i,
110
                crc_en_o,
111
                shift_crc_o,
112 95 mohor
                rst_i,
113 82 mohor
 
114
                // WISHBONE common signals
115 95 mohor
                wb_clk_i,
116 82 mohor
 
117
                // WISHBONE master interface
118
                wb_adr_o, wb_dat_o, wb_dat_i, wb_cyc_o, wb_stb_o, wb_sel_o,
119
                wb_we_o, wb_ack_i, wb_cab_o, wb_err_i, wb_cti_o, wb_bte_o
120
 
121
              );
122
 
123
// JTAG signals
124 97 mohor
input         tck_i;
125
input         tdi_i;
126
output        tdo_o;
127 82 mohor
 
128
// TAP states
129 97 mohor
input         shift_dr_i;
130
input         pause_dr_i;
131
input         update_dr_i;
132 82 mohor
 
133 97 mohor
input         wishbone_ce_i;
134
input         crc_match_i;
135
output        crc_en_o;
136
output        shift_crc_o;
137
input         rst_i;
138 82 mohor
// WISHBONE common signals
139 97 mohor
input         wb_clk_i;
140 82 mohor
 
141
// WISHBONE master interface
142
output [31:0] wb_adr_o;
143
output [31:0] wb_dat_o;
144
input  [31:0] wb_dat_i;
145
output        wb_cyc_o;
146
output        wb_stb_o;
147
output  [3:0] wb_sel_o;
148
output        wb_we_o;
149
input         wb_ack_i;
150
output        wb_cab_o;
151
input         wb_err_i;
152
output  [2:0] wb_cti_o;
153
output  [1:0] wb_bte_o;
154
 
155
reg           wb_cyc_o;
156
reg    [31:0] wb_adr_o;
157 88 mohor
reg    [31:0] wb_dat_o;
158 82 mohor
reg     [3:0] wb_sel_o;
159
 
160
reg           tdo_o;
161
 
162 88 mohor
reg    [50:0] dr;
163
wire          enable;
164 90 mohor
wire          cmd_cnt_en;
165 88 mohor
reg     [1:0] cmd_cnt;
166
wire          cmd_cnt_end;
167
reg           cmd_cnt_end_q;
168 90 mohor
wire          addr_len_cnt_en;
169 88 mohor
reg     [5:0] addr_len_cnt;
170
reg     [5:0] addr_len_cnt_limit;
171
wire          addr_len_cnt_end;
172 90 mohor
wire          crc_cnt_en;
173 88 mohor
reg     [5:0] crc_cnt;
174
wire          crc_cnt_end;
175
reg           crc_cnt_end_q;
176 90 mohor
wire          data_cnt_en;
177 88 mohor
reg    [18:0] data_cnt;
178
reg    [18:0] data_cnt_limit;
179
wire          data_cnt_end;
180 90 mohor
reg           data_cnt_end_q;
181 88 mohor
reg           status_reset_en;
182 82 mohor
 
183 90 mohor
reg           crc_match_reg;
184 82 mohor
 
185 92 mohor
reg     [2:0] cmd, cmd_old, dr_cmd_latched;
186
reg    [31:0] adr;
187
reg    [15:0] len;
188
reg           start_rd_tck;
189 97 mohor
reg           rd_tck_started;
190 92 mohor
reg           start_rd_sync1;
191
reg           start_wb_rd;
192
reg           start_wb_rd_q;
193
reg           start_wr_tck;
194
reg           start_wr_sync1;
195
reg           start_wb_wr;
196
reg           start_wb_wr_q;
197 88 mohor
 
198 92 mohor
wire          dr_read;
199
wire          dr_write;
200
wire          dr_go;
201 88 mohor
 
202 92 mohor
reg           dr_write_latched;
203
reg           dr_read_latched;
204
reg           dr_go_latched;
205 82 mohor
 
206 92 mohor
wire          status_cnt_end;
207 89 mohor
 
208 92 mohor
wire          byte, half, long;
209
reg           byte_q, half_q, long_q;
210 94 mohor
reg           byte_q2, half_q2, long_q2;
211 92 mohor
reg           cmd_read;
212
reg           cmd_write;
213
reg           cmd_go;
214 90 mohor
 
215 92 mohor
reg           status_cnt1, status_cnt2, status_cnt3, status_cnt4;
216 90 mohor
 
217 92 mohor
reg [`STATUS_LEN -1:0] status;
218
 
219 97 mohor
reg           wb_error, wb_error_sync, wb_error_tck;
220
reg           wb_overrun, wb_overrun_sync, wb_overrun_tck;
221
reg           underrun_tck;
222 92 mohor
 
223 97 mohor
reg           busy_wb;
224
reg           busy_tck;
225
reg           wb_end;
226
reg           wb_end_rst;
227
reg           wb_end_rst_sync;
228
reg           wb_end_sync;
229
reg           wb_end_tck, wb_end_tck_q;
230
reg           busy_sync;
231
reg   [799:0] tdo_text;
232
reg   [399:0] latching_data_text;
233
reg           latch_data;
234
reg   [199:0] status_text;
235 92 mohor
 
236 97 mohor
reg           set_addr, set_addr_sync, set_addr_wb, set_addr_wb_q;
237
reg           read_cycle;
238
reg           write_cycle;
239
reg     [2:0] rw_type;
240
wire   [31:0] input_data;
241 92 mohor
 
242 97 mohor
wire          len_eq_0;
243
wire          crc_cnt_31;
244 93 mohor
 
245 97 mohor
reg     [1:0] ptr;
246
reg     [2:0] fifo_cnt;
247
wire          fifo_full;
248
wire          fifo_empty;
249
reg     [7:0] mem [0:3];
250
reg     [2:0] mem_ptr;
251
reg           wishbone_ce_sync;
252
reg           wishbone_ce_rst;
253
wire          go_prelim;
254
 
255
 
256
 
257 82 mohor
assign enable = wishbone_ce_i & shift_dr_i;
258 90 mohor
assign crc_en_o = enable & crc_cnt_end & (~status_cnt_end);
259 89 mohor
assign shift_crc_o = enable & status_cnt_end;  // Signals dbg module to shift out the CRC
260 82 mohor
 
261
 
262 97 mohor
// Selecting where to take the data from 
263 82 mohor
always @ (posedge tck_i)
264
begin
265 93 mohor
  if (update_dr_i)
266
    ptr <= #1 2'h0;
267 95 mohor
  else if (read_cycle & crc_cnt_31) // first latch
268 93 mohor
    ptr <= #1 ptr + 1'b1;
269 95 mohor
  else if (read_cycle & byte & (~byte_q))
270 93 mohor
    ptr <= ptr + 1'd1;
271
end
272
 
273
 
274 97 mohor
// Shift register for shifting in and out the data
275 93 mohor
always @ (posedge tck_i)
276
begin
277 95 mohor
  if (read_cycle & crc_cnt_31)
278 90 mohor
    begin
279 93 mohor
      dr[31:0] <= #1 input_data[31:0];
280 97 mohor
      latch_data <= #1 1'b1;
281 99 mohor
      latching_data_text <= #1 "First latch";
282 93 mohor
    end
283
  else if (read_cycle & crc_cnt_end)
284
    begin
285 95 mohor
      case (rw_type)  // synthesis parallel_case full_case
286 90 mohor
        `WB_READ8 : begin
287
                      if(byte & (~byte_q))
288 92 mohor
                        begin
289 93 mohor
                          case (ptr)    // synthesis parallel_case
290
                            2'b00 : dr[31:24] <= #1 input_data[31:24];
291
                            2'b01 : dr[31:24] <= #1 input_data[23:16];
292
                            2'b10 : dr[31:24] <= #1 input_data[15:8];
293
                            2'b11 : dr[31:24] <= #1 input_data[7:0];
294
                          endcase
295 97 mohor
                          latch_data <= #1 1'b1;
296 99 mohor
                          latching_data_text <= #1 "8 bit latched";
297 92 mohor
                        end
298 90 mohor
                      else
299 92 mohor
                        begin
300 93 mohor
                          dr[31:24] <= #1 {dr[30:24], 1'b0};
301 97 mohor
                          latch_data <= #1 1'b0;
302 99 mohor
                          latching_data_text <= #1 "8 bit shifted";
303 92 mohor
                        end
304 90 mohor
                    end
305
        `WB_READ16: begin
306
                      if(half & (~half_q))
307 92 mohor
                        begin
308 93 mohor
                          if (ptr[1])
309 97 mohor
                            dr[31:16] <= #1 input_data[15:0];
310
                          else
311 93 mohor
                            dr[31:16] <= #1 input_data[31:16];
312 99 mohor
                          latching_data_text <= #1 "16 bit latched";
313 97 mohor
                          latch_data <= #1 1'b1;
314 92 mohor
                        end
315 90 mohor
                      else
316 92 mohor
                        begin
317 93 mohor
                          dr[31:16] <= #1 {dr[30:16], 1'b0};
318 97 mohor
                          latch_data <= #1 1'b0;
319 99 mohor
                          latching_data_text <= #1 "16 bit shifted";
320 92 mohor
                        end
321 90 mohor
                    end
322
        `WB_READ32: begin
323
                      if(long & (~long_q))
324 92 mohor
                        begin
325 93 mohor
                          dr[31:0] <= #1 input_data[31:0];
326 97 mohor
                          latch_data <= #1 1'b1;
327 99 mohor
                          latching_data_text <= #1 "32 bit latched";
328 92 mohor
                        end
329 90 mohor
                      else
330 92 mohor
                        begin
331 93 mohor
                          dr[31:0] <= #1 {dr[30:0], 1'b0};
332 97 mohor
                          latch_data <= #1 1'b0;
333 99 mohor
                          latching_data_text <= #1 "32 bit shifted";
334 92 mohor
                        end
335 90 mohor
                    end
336
      endcase
337
    end
338 94 mohor
  else if (enable & ((~addr_len_cnt_end) | (~cmd_cnt_end) | ((~data_cnt_end) & write_cycle)))
339 92 mohor
    begin
340 99 mohor
      dr <= #1 {dr[49:0], tdi_i};
341
      latch_data <= #1 1'b0;
342
      latching_data_text <= #1 "tdi shifted in";
343 92 mohor
    end
344 94 mohor
  else
345 99 mohor
    latching_data_text <= #1 "nothing";
346 82 mohor
end
347
 
348
 
349 90 mohor
assign cmd_cnt_en = enable & (~cmd_cnt_end);
350 88 mohor
 
351 97 mohor
 
352
// Command counter
353 95 mohor
always @ (posedge tck_i or posedge rst_i)
354 82 mohor
begin
355 95 mohor
  if (rst_i)
356 87 mohor
    cmd_cnt <= #1 'h0;
357 82 mohor
  else if (update_dr_i)
358 87 mohor
    cmd_cnt <= #1 'h0;
359 90 mohor
  else if (cmd_cnt_en)
360 87 mohor
    cmd_cnt <= #1 cmd_cnt + 1'b1;
361 82 mohor
end
362
 
363
 
364 90 mohor
assign addr_len_cnt_en = enable & cmd_cnt_end & (~addr_len_cnt_end);
365
 
366 97 mohor
 
367
// Address/length counter
368 95 mohor
always @ (posedge tck_i or posedge rst_i)
369 87 mohor
begin
370 95 mohor
  if (rst_i)
371 88 mohor
    addr_len_cnt <= #1 'h0;
372
  else if (update_dr_i)
373
    addr_len_cnt <= #1 'h0;
374 90 mohor
  else if (addr_len_cnt_en)
375 88 mohor
    addr_len_cnt <= #1 addr_len_cnt + 1'b1;
376
end
377
 
378
 
379 95 mohor
assign data_cnt_en = enable & (~data_cnt_end) & (cmd_cnt_end & write_cycle | crc_cnt_end & read_cycle);
380 90 mohor
 
381 97 mohor
 
382
// Data counter
383 95 mohor
always @ (posedge tck_i or posedge rst_i)
384 88 mohor
begin
385 95 mohor
  if (rst_i)
386 87 mohor
    data_cnt <= #1 'h0;
387
  else if (update_dr_i)
388
    data_cnt <= #1 'h0;
389 90 mohor
  else if (data_cnt_en)
390 87 mohor
    data_cnt <= #1 data_cnt + 1'b1;
391
end
392 82 mohor
 
393 87 mohor
 
394 88 mohor
 
395 93 mohor
assign byte = data_cnt[2:0] == 3'd7;
396
assign half = data_cnt[3:0] == 4'd15;
397
assign long = data_cnt[4:0] == 5'd31;
398 88 mohor
 
399
 
400
always @ (posedge tck_i)
401
begin
402 95 mohor
  byte_q <= #1 byte;
403
  half_q <= #1 half;
404
  long_q <= #1 long;
405
  byte_q2 <= #1 byte_q;
406
  half_q2 <= #1 half_q;
407
  long_q2 <= #1 long_q;
408 88 mohor
end
409
 
410
 
411 89 mohor
assign dr_read = (dr[2:0] == `WB_READ8) | (dr[2:0] == `WB_READ16) | (dr[2:0] == `WB_READ32);
412
assign dr_write = (dr[2:0] == `WB_WRITE8) | (dr[2:0] == `WB_WRITE16) | (dr[2:0] == `WB_WRITE32);
413
assign dr_go = dr[2:0] == `WB_GO;
414 88 mohor
 
415
 
416 97 mohor
// Latching instruction
417 88 mohor
always @ (posedge tck_i)
418
begin
419
  if (update_dr_i)
420 91 mohor
    begin
421 99 mohor
      dr_cmd_latched <= #1 3'h0;
422 91 mohor
      dr_read_latched  <= #1 1'b0;
423
      dr_write_latched  <= #1 1'b0;
424
      dr_go_latched  <= #1 1'b0;
425
    end
426 88 mohor
  else if (cmd_cnt_end & (~cmd_cnt_end_q))
427 91 mohor
    begin
428 99 mohor
      dr_cmd_latched <= #1 dr[2:0];
429 91 mohor
      dr_read_latched <= #1 dr_read;
430
      dr_write_latched <= #1 dr_write;
431
      dr_go_latched <= #1 dr_go;
432
    end
433 88 mohor
end
434
 
435
 
436 97 mohor
// Upper limit. Address/length counter counts until this value is reached
437 88 mohor
always @ (posedge tck_i)
438
begin
439 90 mohor
  if (cmd_cnt == 2'h2)
440 88 mohor
    begin
441 95 mohor
      if ((~dr[0])  & (~tdi_i))                                   // (current command is WB_STATUS or WB_GO)
442 99 mohor
        addr_len_cnt_limit <= #1 6'd0;
443 90 mohor
      else                                                        // (current command is WB_WRITEx or WB_READx)
444 99 mohor
        addr_len_cnt_limit <= #1 6'd48;
445 88 mohor
    end
446
end
447
 
448
 
449 94 mohor
assign go_prelim = (cmd_cnt == 2'h2) & dr[1] & (~dr[0]) & (~tdi_i);
450
 
451 88 mohor
 
452 97 mohor
// Upper limit. Data counter counts until this value is reached.
453 94 mohor
always @ (posedge tck_i)
454
begin
455
  if (update_dr_i)
456 99 mohor
    data_cnt_limit <= #1 {len, 3'b000};
457 94 mohor
end
458 88 mohor
 
459 90 mohor
 
460 94 mohor
assign crc_cnt_en = enable & (~crc_cnt_end) & (cmd_cnt_end & addr_len_cnt_end  & (~write_cycle) | (data_cnt_end & write_cycle));
461
 
462 97 mohor
 
463 82 mohor
// crc counter
464 95 mohor
always @ (posedge tck_i or posedge rst_i)
465 82 mohor
begin
466 95 mohor
  if (rst_i)
467 82 mohor
    crc_cnt <= #1 'h0;
468 90 mohor
  else if(crc_cnt_en)
469 82 mohor
    crc_cnt <= #1 crc_cnt + 1'b1;
470
  else if (update_dr_i)
471
    crc_cnt <= #1 'h0;
472
end
473
 
474 87 mohor
assign cmd_cnt_end  = cmd_cnt  == 2'h3;
475 88 mohor
assign addr_len_cnt_end = addr_len_cnt == addr_len_cnt_limit;
476 87 mohor
assign crc_cnt_end  = crc_cnt  == 6'd32;
477 93 mohor
assign crc_cnt_31 = crc_cnt  == 6'd31;
478 89 mohor
assign data_cnt_end = (data_cnt == data_cnt_limit);
479 82 mohor
 
480
always @ (posedge tck_i)
481
begin
482 90 mohor
  crc_cnt_end_q  <= #1 crc_cnt_end;
483
  cmd_cnt_end_q  <= #1 cmd_cnt_end;
484
  data_cnt_end_q <= #1 data_cnt_end;
485 82 mohor
end
486
 
487 90 mohor
 
488 97 mohor
// Status counter is made of 4 serialy connected registers
489 95 mohor
always @ (posedge tck_i or posedge rst_i)
490 82 mohor
begin
491 95 mohor
  if (rst_i)
492 90 mohor
    status_cnt1 <= #1 1'b0;
493 82 mohor
  else if (update_dr_i)
494 90 mohor
    status_cnt1 <= #1 1'b0;
495 94 mohor
  else if (data_cnt_end & read_cycle |
496 95 mohor
           crc_cnt_end & (~read_cycle)
497 90 mohor
          )
498
    status_cnt1 <= #1 1'b1;
499 82 mohor
end
500
 
501 90 mohor
 
502 95 mohor
always @ (posedge tck_i or posedge rst_i)
503 90 mohor
begin
504 95 mohor
  if (rst_i)
505 90 mohor
    begin
506
      status_cnt2 <= #1 1'b0;
507
      status_cnt3 <= #1 1'b0;
508
      status_cnt4 <= #1 1'b0;
509
    end
510
  else if (update_dr_i)
511
    begin
512
      status_cnt2 <= #1 1'b0;
513
      status_cnt3 <= #1 1'b0;
514
      status_cnt4 <= #1 1'b0;
515
    end
516
  else
517
    begin
518
      status_cnt2 <= #1 status_cnt1;
519
      status_cnt3 <= #1 status_cnt2;
520
      status_cnt4 <= #1 status_cnt3;
521
    end
522
end
523
 
524
 
525
assign status_cnt_end = status_cnt4;
526 82 mohor
 
527 97 mohor
 
528
// Status register
529 95 mohor
always @ (posedge tck_i or posedge rst_i)
530 82 mohor
begin
531 95 mohor
  if (rst_i)
532 92 mohor
    begin
533 82 mohor
    status <= #1 'h0;
534 92 mohor
    status_text <= #1 "reset";
535
    end
536
  else if(crc_cnt_end & (~crc_cnt_end_q) & (~read_cycle))
537
    begin
538 97 mohor
    status <= #1 {crc_match_i, wb_error_tck, wb_overrun_tck, busy_tck};
539 92 mohor
    status_text <= #1 "!!!READ";
540
    end
541
  else if (data_cnt_end & (~data_cnt_end_q) & read_cycle)
542
    begin
543 97 mohor
    status <= #1 {crc_match_reg, wb_error_tck, underrun_tck, busy_tck};
544 92 mohor
    status_text <= #1 "READ";
545
    end
546 82 mohor
  else if (shift_dr_i & (~status_cnt_end))
547 92 mohor
    begin
548 82 mohor
    status <= #1 {status[0], status[`STATUS_LEN -1:1]};
549 92 mohor
    status_text <= #1 "shift";
550
    end
551 82 mohor
end
552 88 mohor
// Following status is shifted out:
553 82 mohor
// 1. bit:          1 if crc is OK, else 0
554 86 mohor
// 2. bit:          1 while WB access is in progress (busy_tck), else 0
555 88 mohor
// 3. bit:          1 if overrun occured during write (data couldn't be written fast enough)
556 97 mohor
//                    or underrun occured during read (data couldn't be read fast enough)
557 82 mohor
// 4. bit:          1 if WB error occured, else 0
558
 
559
 
560 97 mohor
// TDO multiplexer
561 102 mohor
always @ (pause_dr_i or busy_tck or crc_cnt_end or crc_cnt_end_q or crc_match_i or
562
          data_cnt_end or data_cnt_end_q or read_cycle or crc_match_reg or status or dr)
563 82 mohor
begin
564
  if (pause_dr_i)
565 87 mohor
    begin
566 82 mohor
    tdo_o = busy_tck;
567 97 mohor
    tdo_text = "busy_tck";
568 87 mohor
    end
569 95 mohor
  else if (crc_cnt_end & (~crc_cnt_end_q) & (~(read_cycle)))
570 87 mohor
    begin
571
      tdo_o = crc_match_i;
572 97 mohor
      tdo_text = "crc_match_i";
573 87 mohor
    end
574 93 mohor
  else if (read_cycle & crc_cnt_end & (~data_cnt_end))
575
    begin
576
    tdo_o = dr[31];
577 97 mohor
    tdo_text = "read data";
578 93 mohor
    end
579 94 mohor
  else if (read_cycle & data_cnt_end & (~data_cnt_end_q))     // cmd is already updated
580 87 mohor
    begin
581 90 mohor
      tdo_o = crc_match_reg;
582 97 mohor
      tdo_text = "crc_match_reg";
583 90 mohor
    end
584 92 mohor
  else if (crc_cnt_end & data_cnt_end)  // cmd is already updated
585 90 mohor
    begin
586 87 mohor
      tdo_o = status[0];
587 97 mohor
      tdo_text = "status";
588 87 mohor
    end
589 82 mohor
  else
590 87 mohor
    begin
591
      tdo_o = 1'b0;
592 97 mohor
      tdo_text = "zero while CRC is shifted in";
593 87 mohor
    end
594 82 mohor
end
595
 
596
 
597
 
598
always @ (posedge tck_i)
599
begin
600 90 mohor
  if(crc_cnt_end & (~crc_cnt_end_q))
601
    crc_match_reg <= #1 crc_match_i;
602
end
603
 
604
 
605 97 mohor
// Latching instruction
606 95 mohor
always @ (posedge tck_i or posedge rst_i)
607 91 mohor
begin
608 95 mohor
  if (rst_i)
609 91 mohor
    begin
610
      cmd <= #1 'h0;
611
      cmd_old <= #1 'h0;
612
      cmd_read <= #1 1'b0;
613
      cmd_write <= #1 1'b0;
614
      cmd_go <= #1 1'b0;
615
    end
616
  else if(crc_cnt_end & (~crc_cnt_end_q) & crc_match_i)
617
    begin
618
      cmd <= #1 dr_cmd_latched;
619
      cmd_old <= #1 cmd;
620
      cmd_read <= #1 dr_read_latched;
621
      cmd_write <= #1 dr_write_latched;
622
      cmd_go <= #1 dr_go_latched;
623
    end
624
end
625 90 mohor
 
626 91 mohor
 
627 97 mohor
// Latching address
628 90 mohor
always @ (posedge tck_i)
629
begin
630 82 mohor
  if(crc_cnt_end & (~crc_cnt_end_q) & crc_match_i)
631
    begin
632 90 mohor
      if (dr_write_latched | dr_read_latched)
633 88 mohor
        begin
634
          adr <= #1 dr[47:16];
635
          set_addr <= #1 1'b1;
636
        end
637 82 mohor
    end
638
  else
639 88 mohor
    set_addr <= #1 1'b0;
640
end
641
 
642 93 mohor
 
643 97 mohor
// Length counter
644 93 mohor
always @ (posedge tck_i)
645
begin
646
  if(crc_cnt_end & (~crc_cnt_end_q) & crc_match_i & (dr_write_latched | dr_read_latched))
647
    len <= #1 dr[15:0];
648 95 mohor
  else if (start_rd_tck)
649 93 mohor
    begin
650 95 mohor
      case (rw_type)  // synthesis parallel_case full_case
651 93 mohor
        `WB_READ8 : len <= #1 len - 1'd1;
652
        `WB_READ16: len <= #1 len - 2'd2;
653
        `WB_READ32: len <= #1 len - 3'd4;
654
      endcase
655
    end
656
end
657
 
658
 
659
assign len_eq_0 = len == 16'h0;
660
 
661
 
662 89 mohor
// Start wishbone read cycle
663 88 mohor
always @ (posedge tck_i)
664
begin
665 95 mohor
  if (read_cycle & (~dr_go_latched) & (~len_eq_0))              // First read after cmd is entered
666 89 mohor
    start_rd_tck <= #1 1'b1;
667 97 mohor
  else if ((~start_rd_tck) & read_cycle & (~len_eq_0) & (~fifo_full) & (~rd_tck_started))
668 93 mohor
    start_rd_tck <= #1 1'b1;
669 89 mohor
  else
670
    start_rd_tck <= #1 1'b0;
671
end
672
 
673
 
674 92 mohor
always @ (posedge tck_i)
675
begin
676
  if (update_dr_i)
677 97 mohor
    rd_tck_started <= #1 1'b0;
678
  else if (start_rd_tck)
679
    rd_tck_started <= #1 1'b1;
680
  else if (wb_end_tck & (~wb_end_tck_q))
681
    rd_tck_started <= #1 1'b0;
682
end
683
 
684
 
685
always @ (posedge tck_i)
686
begin
687
  if (update_dr_i)
688 92 mohor
    read_cycle <= #1 1'b0;
689 94 mohor
  else if (cmd_read & go_prelim)
690 92 mohor
    read_cycle <= #1 1'b1;
691
end
692 89 mohor
 
693 92 mohor
 
694
always @ (posedge tck_i)
695
begin
696 95 mohor
  if ((cmd_read | cmd_write) & go_prelim)
697
    rw_type <= #1 cmd;
698 92 mohor
end
699
 
700
 
701 94 mohor
always @ (posedge tck_i)
702
begin
703
  if (update_dr_i)
704
    write_cycle <= #1 1'b0;
705
  else if (cmd_write & go_prelim)
706
    write_cycle <= #1 1'b1;
707
end
708 92 mohor
 
709
 
710 89 mohor
// Start wishbone write cycle
711
always @ (posedge tck_i)
712
begin
713 95 mohor
  if (write_cycle)
714 88 mohor
    begin
715 95 mohor
      case (rw_type)  // synthesis parallel_case full_case
716 88 mohor
        `WB_WRITE8  : begin
717 94 mohor
                        if (byte_q & (~byte_q2))
718 88 mohor
                          begin
719 89 mohor
                            start_wr_tck <= #1 1'b1;
720 88 mohor
                            wb_dat_o <= #1 {4{dr[7:0]}};
721
                          end
722
                        else
723
                          begin
724 89 mohor
                            start_wr_tck <= #1 1'b0;
725 88 mohor
                          end
726
                      end
727
        `WB_WRITE16 : begin
728 94 mohor
                        if (half_q & (~half_q2))
729 88 mohor
                          begin
730 89 mohor
                            start_wr_tck <= #1 1'b1;
731 88 mohor
                            wb_dat_o <= #1 {2{dr[15:0]}};
732
                          end
733
                        else
734
                          begin
735 89 mohor
                            start_wr_tck <= #1 1'b0;
736 88 mohor
                          end
737
                      end
738
        `WB_WRITE32 : begin
739 94 mohor
                        if (long_q & (~long_q2))
740 88 mohor
                          begin
741 89 mohor
                            start_wr_tck <= #1 1'b1;
742 88 mohor
                            wb_dat_o <= #1 dr[31:0];
743
                          end
744
                        else
745
                          begin
746 89 mohor
                            start_wr_tck <= #1 1'b0;
747 88 mohor
                          end
748
                      end
749
      endcase
750
    end
751
  else
752 89 mohor
    start_wr_tck <= #1 1'b0;
753 82 mohor
end
754
 
755
 
756
always @ (posedge wb_clk_i)
757
begin
758 89 mohor
  start_rd_sync1  <= #1 start_rd_tck;
759
  start_wb_rd     <= #1 start_rd_sync1;
760
  start_wb_rd_q   <= #1 start_wb_rd;
761
 
762
  start_wr_sync1  <= #1 start_wr_tck;
763
  start_wb_wr     <= #1 start_wr_sync1;
764
  start_wb_wr_q   <= #1 start_wb_wr;
765
 
766
  set_addr_sync   <= #1 set_addr;
767
  set_addr_wb     <= #1 set_addr_sync;
768
  set_addr_wb_q   <= #1 set_addr_wb;
769 82 mohor
end
770
 
771
 
772 97 mohor
// wb_cyc_o
773 95 mohor
always @ (posedge wb_clk_i or posedge rst_i)
774 82 mohor
begin
775 95 mohor
  if (rst_i)
776 82 mohor
    wb_cyc_o <= #1 1'b0;
777 89 mohor
  else if ((start_wb_wr & (~start_wb_wr_q)) | (start_wb_rd & (~start_wb_rd_q)))
778 82 mohor
    wb_cyc_o <= #1 1'b1;
779 88 mohor
  else if (wb_ack_i | wb_err_i)
780 82 mohor
    wb_cyc_o <= #1 1'b0;
781
end
782
 
783
 
784 97 mohor
// wb_adr_o logic
785 82 mohor
always @ (posedge wb_clk_i)
786
begin
787 88 mohor
  if (set_addr_wb & (~set_addr_wb_q)) // Setting starting address
788 82 mohor
    wb_adr_o <= #1 adr;
789
  else if (wb_ack_i)
790
    begin
791 95 mohor
      if ((rw_type == `WB_WRITE8) | (rw_type == `WB_READ8))
792 82 mohor
        wb_adr_o <= #1 wb_adr_o + 1'd1;
793 95 mohor
      else if ((rw_type == `WB_WRITE16) | (rw_type == `WB_READ16))
794 82 mohor
        wb_adr_o <= #1 wb_adr_o + 2'd2;
795
      else
796
        wb_adr_o <= #1 wb_adr_o + 3'd4;
797
    end
798
end
799
 
800
 
801 89 mohor
 
802 88 mohor
//    adr   byte  |  short  |  long
803
//     0    1000     1100      1111
804
//     1    0100     err       err
805
//     2    0010     0011      err
806
//     3    0001     err       err
807 97 mohor
// wb_sel_o logic
808 95 mohor
always @ (posedge wb_clk_i or posedge rst_i)
809 82 mohor
begin
810 95 mohor
  if (rst_i)
811 91 mohor
    wb_sel_o[3:0] <= #1 4'h0;
812 95 mohor
  else
813 88 mohor
    begin
814 95 mohor
      wb_sel_o[0] <= #1 (rw_type[1:0] == 2'b11) & (wb_adr_o[1:0] == 2'b00) | (rw_type[1:0] == 2'b01) & (wb_adr_o[1:0] == 2'b11) |
815
                        (rw_type[1:0] == 2'b10) & (wb_adr_o[1:0] == 2'b10);
816
      wb_sel_o[1] <= #1 (rw_type[1:0] == 2'b11) & (wb_adr_o[1:0] == 2'b00) | (rw_type[1] ^ rw_type[0]) & (wb_adr_o[1:0] == 2'b10);
817
      wb_sel_o[2] <= #1 (rw_type[1]) & (wb_adr_o[1:0] == 2'b00) | (rw_type[1:0] == 2'b01) & (wb_adr_o[1:0] == 2'b01);
818 88 mohor
      wb_sel_o[3] <= #1 (wb_adr_o[1:0] == 2'b00);
819
    end
820 82 mohor
end
821
 
822
 
823 95 mohor
assign wb_we_o = write_cycle;
824 82 mohor
assign wb_cab_o = 1'b0;
825
assign wb_stb_o = wb_cyc_o;
826
assign wb_cti_o = 3'h0;     // always performing single access
827
assign wb_bte_o = 2'h0;     // always performing single access
828
 
829
 
830 97 mohor
// Logic for detecting end of transaction
831 95 mohor
always @ (posedge wb_clk_i or posedge rst_i)
832 82 mohor
begin
833 95 mohor
  if (rst_i)
834 86 mohor
    wb_end <= #1 1'b0;
835 88 mohor
  else if (wb_ack_i | wb_err_i)
836 86 mohor
    wb_end <= #1 1'b1;
837
  else if (wb_end_rst)
838
    wb_end <= #1 1'b0;
839 82 mohor
end
840
 
841
 
842 95 mohor
always @ (posedge tck_i or posedge rst_i)
843 82 mohor
begin
844 95 mohor
  if (rst_i)
845 82 mohor
    begin
846 86 mohor
      wb_end_sync <= #1 1'b0;
847 93 mohor
      wb_end_tck  <= #1 1'b0;
848
      wb_end_tck_q<= #1 1'b0;
849 82 mohor
    end
850
  else
851
    begin
852 86 mohor
      wb_end_sync <= #1 wb_end;
853
      wb_end_tck  <= #1 wb_end_sync;
854 93 mohor
      wb_end_tck_q<= #1 wb_end_tck;
855 82 mohor
    end
856
end
857
 
858
 
859 95 mohor
always @ (posedge wb_clk_i or posedge rst_i)
860 82 mohor
begin
861 95 mohor
  if (rst_i)
862 82 mohor
    busy_wb <= #1 1'b0;
863 86 mohor
  else if (wb_end_rst)
864 82 mohor
    busy_wb <= #1 1'b0;
865
  else if (wb_cyc_o)
866
    busy_wb <= #1 1'b1;
867
end
868
 
869
 
870 95 mohor
always @ (posedge tck_i or posedge rst_i)
871 82 mohor
begin
872 95 mohor
  if (rst_i)
873 82 mohor
    begin
874
      busy_sync <= #1 1'b0;
875
      busy_tck <= #1 1'b0;
876
    end
877
  else
878
    begin
879
      busy_sync <= #1 busy_wb;
880
      busy_tck <= #1 busy_sync;
881
    end
882
end
883
 
884
 
885
always @ (posedge wb_clk_i)
886
begin
887 86 mohor
  wb_end_rst_sync <= #1 wb_end_tck;
888
  wb_end_rst  <= #1 wb_end_rst_sync;
889 82 mohor
end
890
 
891
 
892 97 mohor
// Detecting WB error
893 95 mohor
always @ (posedge wb_clk_i or posedge rst_i)
894 82 mohor
begin
895 95 mohor
  if (rst_i)
896 82 mohor
    wb_error <= #1 1'b0;
897
  else if(wb_err_i)
898
    wb_error <= #1 1'b1;
899 88 mohor
  else if(wb_ack_i & status_reset_en) // error remains active until STATUS read is performed
900 82 mohor
    wb_error <= #1 1'b0;
901
end
902 97 mohor
 
903
 
904 82 mohor
always @ (posedge tck_i)
905
begin
906
  wb_error_sync <= #1 wb_error;
907
  wb_error_tck  <= #1 wb_error_sync;
908
end
909
 
910
 
911 97 mohor
// Detecting overrun when write operation.
912 95 mohor
always @ (posedge wb_clk_i or posedge rst_i)
913 82 mohor
begin
914 95 mohor
  if (rst_i)
915 88 mohor
    wb_overrun <= #1 1'b0;
916 89 mohor
  else if(start_wb_wr & (~start_wb_wr_q) & wb_cyc_o)
917 88 mohor
    wb_overrun <= #1 1'b1;
918
  else if((wb_ack_i | wb_err_i) & status_reset_en) // error remains active until STATUS read is performed
919
    wb_overrun <= #1 1'b0;
920 82 mohor
end
921
 
922
always @ (posedge tck_i)
923
begin
924 88 mohor
  wb_overrun_sync <= #1 wb_overrun;
925
  wb_overrun_tck  <= #1 wb_overrun_sync;
926 82 mohor
end
927
 
928
 
929 97 mohor
// Detecting underrun when read operation
930
always @ (posedge tck_i or posedge rst_i)
931
begin
932
  if (rst_i)
933
    underrun_tck <= #1 1'b0;
934
  else if(latch_data & fifo_empty & (~data_cnt_end))
935
    underrun_tck <= #1 1'b1;
936
  else if(read_cycle & status_reset_en) // error remains active until STATUS read is performed
937
    underrun_tck <= #1 1'b0;
938
end
939
 
940 87 mohor
 
941 88 mohor
 
942
// wb_error is locked until WB_STATUS is performed
943 95 mohor
always @ (posedge tck_i or posedge rst_i)
944 87 mohor
begin
945 95 mohor
  if (rst_i)
946 87 mohor
    status_reset_en <= 1'b0;
947
  else if((cmd_old == `WB_STATUS) & (cmd !== `WB_STATUS))
948
    status_reset_en <= #1 1'b1;
949
  else
950
    status_reset_en <= #1 1'b0;
951
end
952 88 mohor
 
953 95 mohor
 
954 92 mohor
always @ (posedge wb_clk_i)
955
begin
956
  wishbone_ce_sync <= #1  wishbone_ce_i;
957
  wishbone_ce_rst  <= #1 ~wishbone_ce_sync;
958
end
959 88 mohor
 
960
 
961 97 mohor
// Logic for latching data that is read from wishbone
962 92 mohor
always @ (posedge wb_clk_i)
963
begin
964
  if(wishbone_ce_rst)
965
    mem_ptr <= #1 'h0;
966
  else if (wb_ack_i)
967
    begin
968 95 mohor
      if (rw_type == `WB_READ8)
969 92 mohor
        mem_ptr <= #1 mem_ptr + 1'd1;
970 95 mohor
      else if (rw_type == `WB_READ16)
971 92 mohor
        mem_ptr <= #1 mem_ptr + 2'd2;
972
    end
973
end
974 88 mohor
 
975
 
976 97 mohor
// Logic for latching data that is read from wishbone
977 92 mohor
always @ (posedge wb_clk_i)
978
begin
979
  if (wb_ack_i)
980
    begin
981
      case (wb_sel_o)    // synthesis parallel_case full_case 
982
        4'b1000  :  mem[mem_ptr[1:0]] <= #1 wb_dat_i[31:24];            // byte 
983
        4'b0100  :  mem[mem_ptr[1:0]] <= #1 wb_dat_i[23:16];            // byte
984
        4'b0010  :  mem[mem_ptr[1:0]] <= #1 wb_dat_i[15:08];            // byte
985 93 mohor
        4'b0001  :  mem[mem_ptr[1:0]] <= #1 wb_dat_i[07:00];            // byte
986 88 mohor
 
987 92 mohor
        4'b1100  :                                                      // half
988
                    begin
989
                      mem[mem_ptr[1:0]]      <= #1 wb_dat_i[31:24];
990
                      mem[mem_ptr[1:0]+1'b1] <= #1 wb_dat_i[23:16];
991
                    end
992
        4'b0011  :                                                      // half
993
                    begin
994
                      mem[mem_ptr[1:0]]      <= #1 wb_dat_i[15:08];
995 93 mohor
                      mem[mem_ptr[1:0]+1'b1] <= #1 wb_dat_i[07:00];
996 92 mohor
                    end
997
        4'b1111  :                                                      // long
998
                    begin
999
                      mem[0] <= #1 wb_dat_i[31:24];
1000
                      mem[1] <= #1 wb_dat_i[23:16];
1001
                      mem[2] <= #1 wb_dat_i[15:08];
1002 93 mohor
                      mem[3] <= #1 wb_dat_i[07:00];
1003 92 mohor
                    end
1004
      endcase
1005
    end
1006
end
1007 88 mohor
 
1008 97 mohor
 
1009 92 mohor
assign input_data = {mem[0], mem[1], mem[2], mem[3]};
1010 88 mohor
 
1011 92 mohor
 
1012 97 mohor
// Fifo counter and empty/full detection
1013
always @ (posedge tck_i)
1014
begin
1015
  if (update_dr_i)
1016
    fifo_cnt <= #1 'h0;
1017
  else if (wb_end_tck & (~wb_end_tck_q) & (~latch_data))  // incrementing
1018
    begin
1019
      case (rw_type)  // synthesis parallel_case full_case
1020
        `WB_READ8 : fifo_cnt <= #1 fifo_cnt + 1'd1;
1021
        `WB_READ16: fifo_cnt <= #1 fifo_cnt + 2'd2;
1022
        `WB_READ32: fifo_cnt <= #1 fifo_cnt + 3'd4;
1023
      endcase
1024
    end
1025
  else if (~(wb_end_tck & (~wb_end_tck_q)) & latch_data)  // decrementing
1026
    begin
1027
      case (rw_type)  // synthesis parallel_case full_case
1028
        `WB_READ8 : fifo_cnt <= #1 fifo_cnt - 1'd1;
1029
        `WB_READ16: fifo_cnt <= #1 fifo_cnt - 2'd2;
1030
        `WB_READ32: fifo_cnt <= #1 fifo_cnt - 3'd4;
1031
      endcase
1032
    end
1033
end
1034 92 mohor
 
1035
 
1036 97 mohor
assign fifo_full = fifo_cnt == 3'h4;
1037
assign fifo_empty = fifo_cnt == 3'h0;
1038 92 mohor
 
1039
 
1040
 
1041 97 mohor
 
1042 82 mohor
endmodule
1043
 

powered by: WebSVN 2.1.0

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