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 93

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

powered by: WebSVN 2.1.0

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