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

Subversion Repositories dbg_interface

[/] [dbg_interface/] [tags/] [rel_19/] [rtl/] [verilog/] [dbg_wb.v] - Blame information for rev 97

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

powered by: WebSVN 2.1.0

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