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 158

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

powered by: WebSVN 2.1.0

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