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 94

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

powered by: WebSVN 2.1.0

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