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 90

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

powered by: WebSVN 2.1.0

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