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

Subversion Repositories pci

[/] [pci/] [tags/] [rel_3/] [rtl/] [verilog/] [pci_master32_sm_if.v] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 mihad
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  File name "pci_master32_sm_if.v"                            ////
4
////                                                              ////
5
////  This file is part of the "PCI bridge" project               ////
6
////  http://www.opencores.org/cores/pci/                         ////
7
////                                                              ////
8
////  Author(s):                                                  ////
9
////      - Miha Dolenc (mihad@opencores.org)                     ////
10
////                                                              ////
11
////  All additional information is avaliable in the README       ////
12
////  file.                                                       ////
13
////                                                              ////
14
////                                                              ////
15
//////////////////////////////////////////////////////////////////////
16
////                                                              ////
17
//// Copyright (C) 2001 Miha Dolenc, mihad@opencores.org          ////
18
////                                                              ////
19
//// This source file may be used and distributed without         ////
20
//// restriction provided that this copyright statement is not    ////
21
//// removed from the file and that any derivative work contains  ////
22
//// the original copyright notice and the associated disclaimer. ////
23
////                                                              ////
24
//// This source file is free software; you can redistribute it   ////
25
//// and/or modify it under the terms of the GNU Lesser General   ////
26
//// Public License as published by the Free Software Foundation; ////
27
//// either version 2.1 of the License, or (at your option) any   ////
28
//// later version.                                               ////
29
////                                                              ////
30
//// This source is distributed in the hope that it will be       ////
31
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
32
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
33
//// PURPOSE.  See the GNU Lesser General Public License for more ////
34
//// details.                                                     ////
35
////                                                              ////
36
//// You should have received a copy of the GNU Lesser General    ////
37
//// Public License along with this source; if not, download it   ////
38
//// from http://www.opencores.org/lgpl.shtml                     ////
39
////                                                              ////
40
//////////////////////////////////////////////////////////////////////
41
//
42
// CVS Revision History
43
//
44
// $Log: not supported by cvs2svn $
45
//
46
 
47
`include "constants.v"
48
`include "bus_commands.v"
49
 
50
/*====================================================================
51
Module provides interface between PCI bridge internals and PCI master
52
state machine
53
====================================================================*/
54
module PCI_MASTER32_SM_IF
55
(
56
    clk_in,
57
    reset_in,
58
 
59
    // interconnect to pci master state machine
60
    address_out,
61
    bc_out,
62
    data_out,
63
    data_in,
64
    be_out,
65
    req_out,
66
    rdy_out,
67
    last_out,
68
 
69
    next_data_out,
70
    next_be_out,
71
    next_last_out,
72
 
73
    // status inputs from master SM
74
    wait_in,
75
    wtransfer_in,
76
    rtransfer_in,
77
    retry_in,
78
    werror_in,
79
    rerror_in,
80
    first_in ,
81
    mabort_in,
82
 
83
 
84
    // WISHBONE WRITE fifo inputs and outputs
85
    wbw_renable_out,
86
    wbw_fifo_addr_data_in,
87
    wbw_fifo_cbe_in,
88
    wbw_fifo_control_in,
89
    wbw_fifo_empty_in,
90
    wbw_fifo_transaction_ready_in,
91
 
92
    // WISHBONE READ fifo inputs and outputs
93
    wbr_fifo_wenable_out,
94
    wbr_fifo_data_out,
95
    wbr_fifo_be_out,
96
    wbr_fifo_control_out,
97
 
98
    // delayed transaction control logic inputs and outputs
99
    del_wdata_in,
100
    del_complete_out,
101
    del_req_in,
102
    del_addr_in,
103
    del_bc_in,
104
    del_be_in,
105
    del_burst_in,
106
    del_error_out,
107
    del_rty_exp_out,
108
    del_we_in,
109
 
110
    // configuration space interconnect
111
    // error reporting
112
    err_addr_out,
113
    err_bc_out,
114
    err_signal_out,
115
    err_source_out,
116
    err_pending_in,
117
    err_rty_exp_out,
118
 
119
    cache_line_size_in,
120
 
121
    // two signals for pci control and status 
122
    mabort_received_out,
123
    tabort_received_out
124
);
125
 
126
// system inputs
127
input clk_in ;
128
input reset_in ;
129
 
130
// PCI master state machine interconnect
131
output  [31:0]  address_out ;   // address output
132
 
133
output  [3:0]   bc_out ;        // bus command output
134
reg     [3:0]   bc_out ;
135
 
136
output  [31:0]  data_out ;      // data output for writes
137
reg     [31:0]  data_out ;
138
 
139
input   [31:0]  data_in ;       // data input for reads
140
output  [3:0]   be_out  ;       // byte enable output
141
reg     [3:0]   be_out  ;
142
 
143
output          req_out ;       // request output
144
 
145
output          rdy_out ;       // ready output
146
reg             rdy_out ;
147
 
148
output          last_out ;      // last data indicator output
149
 
150
output  [31:0]  next_data_out ; // next data output
151
output  [3:0]   next_be_out ;   // next byte enable output
152
output          next_last_out ; // next transfer last indicator
153
 
154
input           wait_in,
155
                wtransfer_in,
156
                rtransfer_in,
157
                retry_in,
158
                werror_in,
159
                rerror_in,
160
                first_in ,
161
                mabort_in ;
162
 
163
// WISHBONE write fifo interconnect
164
output          wbw_renable_out ;          // WBW_FIFO read enable signal
165
 
166
input   [31:0]  wbw_fifo_addr_data_in ;         // WBW_FIFO address/data bus
167
input   [3:0]   wbw_fifo_cbe_in ;               // WBW_FIFO command/byte enable bus
168
input   [3:0]   wbw_fifo_control_in ;           // WBW_FIFO control bus
169
input           wbw_fifo_empty_in ;             // WBW_FIFO's empty status indicator
170
input           wbw_fifo_transaction_ready_in ; // WBW_FIFO transaction ready indicator
171
 
172
// WISHBONE read FIFO interconnect
173
output          wbr_fifo_wenable_out ;          // write enable for WBR_FIFO
174
 
175
output  [31:0]  wbr_fifo_data_out ;             // data output to WBR_FIFO
176
 
177
output  [3:0]   wbr_fifo_be_out ;               // byte enable output for WBR_FIFO
178
 
179
output  [3:0]   wbr_fifo_control_out ;          // WBR_FIFO control output
180
 
181
// delayed transaction control logic inputs and outputs
182
input   [31:0]  del_wdata_in ;                  // delayed write data input
183
output          del_complete_out ;              // delayed transaction completed output
184
 
185
input           del_req_in ;                    // delayed transaction request
186
input   [31:0]  del_addr_in ;                   // delayed transaction address
187
input   [3:0]   del_bc_in ;                     // delayed transaction bus command input
188
input   [3:0]   del_be_in ;                     // delayed transaction byte enables input
189
input           del_burst_in ;                  // delayed transaction burst req. indicator
190
output          del_error_out ;                 // delayed transation error termination signal
191
 
192
output          del_rty_exp_out ;               // retry expired output for delayed transactions
193
 
194
input           del_we_in ;                     // delayed write request indicator
195
 
196
output  [31:0]  err_addr_out ;                  // erroneous address output
197
output  [3:0]   err_bc_out ;                    // erroneous bus command output
198
 
199
output          err_signal_out ;                // error signalization
200
 
201
output          err_source_out ;                // error source indicator
202
 
203
input           err_pending_in ;
204
 
205
input   [7:0]   cache_line_size_in ;            // cache line size value input
206
 
207
output          err_rty_exp_out ;               // retry expired error output
208
 
209
output          mabort_received_out ;           // master abort signaled to status register
210
output          tabort_received_out ;           // target abort signaled to status register
211
 
212
 
213
assign err_bc_out   = bc_out ;
214
 
215
// assign read outputs
216
/*==================================================================================================================
217
WISHBONE read FIFO data outputs - just link them to SM data outputs and delayed BE input
218
==================================================================================================================*/
219
assign wbr_fifo_data_out = data_in ;
220
assign wbr_fifo_be_out   = del_be_in ;
221
 
222
// decode if current bus command is configuration command
223
wire conf_cyc_bc = ( bc_out[3:1] == `BC_CONF_RW ) ;
224
 
225
// register for indicating that current data is also last in transfer
226
reg current_last ;
227
 
228
// register indicating that last data was transfered OK
229
reg last_transfered ;
230
always@(posedge reset_in or posedge clk_in)
231
begin
232
    if (reset_in)
233
        last_transfered <= #`FF_DELAY 1'b0 ;
234
    else
235
        last_transfered <= #`FF_DELAY ~wait_in && last_out && wtransfer_in ;
236
end
237
 
238
// status signals output assignement
239
assign mabort_received_out = mabort_in ;
240
 
241
wire tabort_ff_in = ~wait_in && rerror_in ;
242
 
243
reg    tabort_received_out ;
244
always@(posedge reset_in or posedge clk_in)
245
begin
246
    if ( reset_in )
247
        tabort_received_out <= #`FF_DELAY 1'b0 ;
248
    else
249
        tabort_received_out <= #`FF_DELAY tabort_ff_in ;
250
end
251
 
252
// error recovery indicator
253
reg err_recovery ;
254
 
255
// operation is locked until error recovery is in progress or error bit is not cleared in configuration space
256
wire err_lock = err_recovery || err_pending_in ;
257
 
258
// three requests are possible - posted write, delayed write and delayed read
259
reg del_write_req ;
260
reg posted_write_req ;
261
reg del_read_req ;
262
 
263
// assign request output
264
assign req_out = del_write_req || posted_write_req || del_read_req ;
265
 
266
// write requests are staged, so data is read from source into current data register and next data register
267
reg write_req_int ;
268
always@(posedge reset_in or posedge clk_in)
269
begin
270
    if ( reset_in )
271
        write_req_int <= #`FF_DELAY 1'b0 ;
272
    else
273
        write_req_int <= #`FF_DELAY posted_write_req || del_write_req ;
274
 
275
end
276
 
277
// ready output is generated one clock after request for reads and two after for writes
278
always@(posedge reset_in or posedge clk_in)
279
begin
280
    if (reset_in)
281
        rdy_out <= #`FF_DELAY 1'b0 ;
282
    else
283
        rdy_out <= #`FF_DELAY del_read_req || ( (posted_write_req || del_write_req) && write_req_int) ;
284
end
285
 
286
// wires with logic used as inputs to request FFs
287
wire do_posted_write = ( wbw_fifo_transaction_ready_in && ~wbw_fifo_empty_in && ~err_lock ) ;
288
wire do_del          = ( del_req_in && ~err_lock && wbw_fifo_empty_in ) ;
289
wire do_del_write    = do_del &&  del_we_in ;
290
wire do_del_read     = do_del && ~del_we_in ;
291
 
292
// register for indicating current operation's data source
293
parameter DELAYED_WRITE = 1'b1 ;
294
parameter POSTED_WRITE  = 1'b0 ;
295
 
296
// new data source - depending on which transaction will be processed next - delayed read is here because source of byte enables must
297
// be specified for delayed reads also - data source is not relevant for delayed reads, so value is don't care anyway
298
wire new_data_source = (do_del_write || do_del_read) ? DELAYED_WRITE : POSTED_WRITE ; // input to data source register
299
wire data_source_change = ~req_out ;    // change (enable) for data source register - when no requests are in progress
300
 
301
reg data_source ;           // data source value
302
always@(posedge reset_in or posedge clk_in)
303
begin
304
    if (reset_in)
305
        // default value is posted write source - wbw_fifo
306
        data_source <= #`FF_DELAY POSTED_WRITE ;
307
    else
308
    if (data_source_change)
309
        // change data source on rising clock edge
310
        data_source <= #`FF_DELAY new_data_source ;
311
end
312
 
313
// multiplexer for data output to PCI MASTER state machine
314
reg [31:0] source_data ;
315
reg [3:0]  source_be ;
316
always@(data_source or wbw_fifo_addr_data_in or wbw_fifo_cbe_in or del_wdata_in or del_be_in)
317
begin
318
    case (data_source)
319
        POSTED_WRITE:   begin
320
                            source_data = wbw_fifo_addr_data_in ;
321
                            source_be   = wbw_fifo_cbe_in ;
322
                        end
323
        DELAYED_WRITE:  begin
324
                            source_data = del_wdata_in ;
325
                            source_be   = ~del_be_in ;
326
                        end
327
    endcase
328
end
329
 
330
wire            waddr =  wbw_fifo_control_in[`ADDR_CTRL_BIT] ;
331
 
332
// address change indicator - address is allowed to be loaded only when no transaction is in progress!
333
wire            address_change = ~req_out ; // address change - whenever there is no request in progress
334
 
335
// new address - input to register storing address of current request - if posted write request will be next,
336
// load address and bus command from wbw_fifo, else load data from delayed transaction logic
337
wire     [31:0] new_address = ( ~req_out && do_posted_write ) ? wbw_fifo_addr_data_in[31:0] : del_addr_in[31:0] ;
338
wire     [3:0]  new_bc      = ( ~req_out && do_posted_write ) ? wbw_fifo_cbe_in : del_bc_in ;
339
 
340
// address counter enable - only for posted writes when data is actually transfered
341
wire addr_count_en = ~wait_in && posted_write_req && wtransfer_in ;
342
 
343
always@(posedge reset_in or posedge clk_in)
344
begin
345
    if (reset_in)
346
        bc_out <= #`FF_DELAY `BC_RESERVED0 ;
347
    else
348
    if (address_change)
349
        bc_out <= #`FF_DELAY new_bc ;
350
end
351
 
352
reg [31:2] current_dword_address ;
353
 
354
// DWORD address counter with load
355
always@(posedge reset_in or posedge clk_in)
356
begin
357
    if (reset_in)
358
        current_dword_address <= #`FF_DELAY 30'h0000_0000 ;
359
    else
360
    if (address_change)
361
        current_dword_address <= #`FF_DELAY new_address[31:2] ;
362
    else
363
    if (addr_count_en)
364
        current_dword_address <= #`FF_DELAY current_dword_address + 1'b1 ;
365
end
366
 
367
reg [1:0] current_byte_address ;
368
always@(posedge reset_in or posedge clk_in)
369
begin
370
    if (reset_in)
371
        current_byte_address <= #`FF_DELAY 2'b00 ;
372
    else
373
    if (address_change)
374
        current_byte_address <= #`FF_DELAY new_address[1:0] ;
375
end
376
 
377
// address output to PCI master state machine assignement
378
assign address_out  = { current_dword_address, current_byte_address } ;
379
 
380
// the same for erroneous address assignement
381
assign err_addr_out = { current_dword_address, current_byte_address } ;
382
 
383
// cacheline size counter - for read transaction length control
384
// cache line count is enabled during burst reads when data is actually transfered
385
wire read_count_enable = ~wait_in && del_read_req && del_burst_in && wtransfer_in  ;
386
 
387
// cache line counter is loaded when del read request is not in progress
388
wire read_count_load   = ~del_read_req ;
389
 
390
reg [8:0] max_read_count ;
391
always@(cache_line_size_in or del_bc_in)
392
begin
393
    if ( (cache_line_size_in >= `WBR_DEPTH) || (~del_bc_in[1] && ~del_bc_in[0]) )
394
        max_read_count = `WBR_DEPTH - 1'b1;
395
    else
396
        max_read_count = cache_line_size_in ;
397
end
398
 
399
reg [8:0] read_count ;
400
 
401
// cache line bound indicator - it signals when data for one complete cacheline was read
402
wire read_bound_comb = ~|(read_count[8:2]) ;
403
reg  read_bound ;
404
always@(posedge clk_in)
405
begin
406
    if (read_count_load)
407
        read_bound <= #`FF_DELAY 1'b0 ;
408
    else if ( read_count_enable )
409
        read_bound <= #`FF_DELAY read_bound_comb ;
410
end
411
 
412
// down counter with load
413
always@(posedge reset_in or posedge clk_in)
414
begin
415
    if (reset_in)
416
        read_count <= #`FF_DELAY 8'h00 ;
417
    else
418
    if (read_count_load)
419
        read_count <= #`FF_DELAY max_read_count ;
420
    else
421
    if (read_count_enable)
422
        read_count <= #`FF_DELAY read_count - 1'b1 ;
423
 
424
end
425
 
426
// flip flop indicating error recovery is in progress
427
reg err_recovery_in ;
428
always@(posedge reset_in or posedge clk_in)
429
begin
430
    if (reset_in)
431
        err_recovery <= #`FF_DELAY 1'b0 ;
432
    else
433
        err_recovery <= #`FF_DELAY err_recovery_in ;
434
end
435
 
436
/*// retry counter implementation
437
reg [7:0] retry_count ;
438
 
439
wire retry_expired = ~|(retry_count[7:1]) ;
440
 
441
// loading of retry counter - whenever no request is present or other termination than retry or wait is signalled
442
wire retry_load = ~req_out || (~wait_in && rtransfer_in) ;
443
 
444
// retry DOWN counter with load
445
always@(posedge reset_in or posedge clk_in)
446
begin
447
    if (reset_in)
448
        retry_count <= #`FF_DELAY 8'hFF ;
449
    else
450
    if ( retry_load )
451
        retry_count <= #`FF_DELAY `PCI_RTY_CNT_MAX ;
452
    else
453
    if (retry_in)
454
        retry_count <= #`FF_DELAY retry_count - 1'b1 ;
455
end*/
456
 
457
/*==================================================================================================================
458
Delayed write requests are always single transfers!
459
Delayed write request starts, when no request is currently beeing processed and it is signaled from other side
460
of the bridge.
461
==================================================================================================================*/
462
// delayed write request FF input control
463
reg del_write_req_input ;
464
 
465
always@(
466
    do_del_write or
467
    del_write_req or
468
    posted_write_req or
469
    del_read_req or
470
    wait_in or
471
    //retry_in or 
472
    //retry_expired or
473
    rtransfer_in or
474
    rerror_in or
475
    mabort_in
476
)
477
begin
478
    if (~del_write_req)
479
    begin
480
        // delayed write is not in progress and is requested
481
        // delayed write can be requested when no other request is in progress
482
        del_write_req_input = ~posted_write_req && ~del_read_req && do_del_write ;
483
    end
484
    else
485
    begin
486
        // delayed write request is in progress - assign input
487
        del_write_req_input = wait_in ||
488
                              ( /*~( retry_in && retry_expired) &&*/
489
                                ~rtransfer_in && ~rerror_in && ~mabort_in
490
                              );
491
    end
492
end
493
 
494
// delayed write request FLIP-FLOP
495
always@(posedge reset_in or posedge clk_in)
496
begin
497
    if (reset_in)
498
        del_write_req <= #`FF_DELAY 1'b0 ;
499
    else
500
        del_write_req <= #`FF_DELAY del_write_req_input ;
501
end
502
 
503
/*================================================================================================
504
Posted write request indicator.
505
Posted write starts whenever no request is in progress and one whole posted write is
506
stored in WBW_FIFO. It ends on error terminations ( master, target abort, retry expired) or
507
data transfer terminations if last data is on top of FIFO.
508
Continues on wait, retry, and disconnect without data.
509
================================================================================================*/
510
// posted write request FF input control
511
reg posted_write_req_input ;
512
always@(
513
    do_posted_write or
514
    del_write_req or
515
    posted_write_req or
516
    del_read_req or
517
    wait_in or
518
    //retry_in or 
519
    rerror_in or
520
    mabort_in or
521
    //retry_expired or 
522
    rtransfer_in or
523
    last_transfered
524
)
525
begin
526
    if (~posted_write_req)
527
    begin
528
        // posted write is not in progress
529
        posted_write_req_input = ~del_write_req && ~del_read_req && do_posted_write ;
530
    end
531
    else
532
    begin
533
        posted_write_req_input = wait_in ||
534
                                 (/*~(retry_in && retry_expired && ~rtransfer_in) &&*/
535
                                  ~rerror_in && ~mabort_in &&
536
                                  ~(last_transfered)
537
                                 ) ;
538
 
539
    end
540
end
541
 
542
// posted write request flip flop
543
always@(posedge reset_in or posedge clk_in)
544
begin
545
    if (reset_in)
546
        posted_write_req <= #`FF_DELAY 1'b0 ;
547
    else
548
        posted_write_req <= #`FF_DELAY posted_write_req_input ;
549
 
550
end
551
 
552
/*================================================================================================
553
Delayed read request indicator.
554
Delayed read starts whenever no request is in progress and delayed read request is signaled from
555
other side of bridge. It ends on error terminations ( master, target abort, retry expired) or
556
data transfer terminations if it is not burst transfer or on cache line bounds on burst transfer.
557
It also ends on disconnects.
558
Continues on wait and retry.
559
================================================================================================*/
560
// delayed read FF input control
561
reg del_read_req_input ;
562
always@(
563
    do_del_read or
564
    del_write_req or
565
    posted_write_req or
566
    del_read_req or
567
    last_transfered or
568
    wait_in or
569
    retry_in or
570
    //retry_expired or 
571
    mabort_in or
572
    rtransfer_in or
573
    rerror_in or
574
    first_in or
575
    del_complete_out
576
)
577
begin
578
    if (~del_read_req)
579
    begin
580
        del_read_req_input = ~del_write_req && ~posted_write_req && ~del_complete_out && do_del_read ;
581
    end
582
    else
583
    begin
584
        del_read_req_input = wait_in ||
585
                             ( ~(retry_in && (~first_in /*|| retry_expired */)) &&
586
                               ~mabort_in && ~rerror_in &&
587
                               ~(last_transfered)
588
                             ) ;
589
    end
590
end
591
 
592
// delayed read request FF
593
always@(posedge reset_in or posedge clk_in)
594
begin
595
    if (reset_in)
596
        del_read_req <= #`FF_DELAY 1'b0 ;
597
    else
598
        del_read_req <= #`FF_DELAY del_read_req_input ;
599
end
600
 
601
// wire indicating last entry of transaction on top of fifo
602
wire wlast = wbw_fifo_control_in[`LAST_CTRL_BIT] ;
603
 
604
wire last_int = posted_write_req && wlast || del_write_req ;
605
 
606
// intermidiate data, byte enable and last registers
607
reg [31:0] intermediate_data ;
608
reg  [3:0] intermediate_be ;
609
reg        intermediate_last ;
610
 
611
wire intermediate_enable = ( posted_write_req || del_write_req ) && ( ~write_req_int || (( ~rdy_out || ~wait_in && rtransfer_in ) && ~intermediate_last)) ;
612
 
613
always@(posedge reset_in or posedge clk_in)
614
begin
615
    if ( reset_in )
616
    begin
617
        intermediate_data <= #`FF_DELAY 32'h0000_0000 ;
618
        intermediate_be   <= #`FF_DELAY 4'h0 ;
619
        intermediate_last <= #`FF_DELAY 1'b0 ;
620
    end
621
    else
622
    if ( intermediate_enable )
623
    begin
624
        intermediate_data <= #`FF_DELAY source_data ;
625
        intermediate_be   <= #`FF_DELAY source_be ;
626
        intermediate_last <= #`FF_DELAY last_int ;
627
    end
628
end
629
 
630
// multiplexer for next data
631
reg [31:0] next_data_out ;
632
reg [3:0] next_be_out   ;
633
reg write_next_last ;
634
reg [3:0] write_next_be ;
635
 
636
always@(rtransfer_in or intermediate_data or intermediate_be or intermediate_last or wbw_fifo_addr_data_in or wbw_fifo_cbe_in or wlast)
637
begin
638
    if( rtransfer_in )
639
    begin
640
        next_data_out   = wbw_fifo_addr_data_in ;
641
        write_next_last = wlast ;
642
        write_next_be   = wbw_fifo_cbe_in ;
643
    end
644
    else
645
    begin
646
        next_data_out   = intermediate_data ;
647
        write_next_last = intermediate_last ;
648
        write_next_be   = intermediate_be ;
649
    end
650
end
651
 
652
always@(del_read_req or source_be or write_next_be)
653
begin
654
    if (del_read_req)
655
        next_be_out = source_be ;
656
    else
657
        next_be_out = write_next_be ;
658
end
659
/*================================================================================================
660
WBW_FIFO read enable - read from WBW_FIFO is performed on posted writes, when data transfer
661
termination is received - transfer or disconnect with data. Reads are enabled during error
662
recovery also, since erroneous transaction must be pulled out of FIFO!
663
================================================================================================*/
664
// wbw_fifo read enable input control
665
 
666
assign wbw_renable_out = ~req_out && (do_posted_write || err_recovery) ||
667
                              posted_write_req && ( ~write_req_int || (~rdy_out && ~intermediate_last) || (~wait_in && rtransfer_in && ~intermediate_last)) ;
668
 
669
/*================================================================================================
670
WBR_FIFO write enable control -
671
writes to FIFO are possible only when delayed read request is in progress and data transfer
672
or error termination is signalled. It is not enabled on retry or disconnect without data.
673
================================================================================================*/
674
// wbr_fifo write enable control - enabled when transfer is in progress and data is transfered or error is signalled
675
assign wbr_fifo_wenable_out = del_read_req && ~wait_in && ( rtransfer_in || mabort_in || rerror_in ) ;
676
 
677
/*================================================================================================
678
WBR_FIFO control output for identifying data entries.
679
This is necesary because of prefetched reads, which partially succeed. On error, error entry
680
gets in to signal it on WISHBONE bus if WISHBONE master reads up to this entry.
681
================================================================================================*/
682
assign wbr_fifo_control_out[`ADDR_CTRL_BIT]       = 1'b0 ;
683
assign wbr_fifo_control_out[`LAST_CTRL_BIT]       = last_transfered ;
684
assign wbr_fifo_control_out[`DATA_ERROR_CTRL_BIT] = rerror_in || (mabort_in && ~conf_cyc_bc) ;
685
assign wbr_fifo_control_out[`UNUSED_CTRL_BIT]     = 1'b0 ;
686
 
687
// retry expired error for posted writes control
688
//assign err_rty_exp_out = posted_write_req && ~wait_in && retry_in && retry_expired && ~rtransfer_in;
689
assign err_rty_exp_out = 1'b0 ;
690
 
691
// error source and error signal output control logic - only for posted writes
692
assign err_source_out = mabort_in /*|| err_rty_exp_out*/ ;
693
 
694
assign err_signal_out = /*err_rty_exp_out || */ posted_write_req && ~wait_in && (mabort_in || rerror_in) ;
695
 
696
//assign del_rty_exp_out = (~wait_in && (del_read_req || del_write_req)) && (retry_in && retry_expired && ~rtransfer_in) ;
697
assign del_rty_exp_out = 1'b0 ;
698
 
699
assign del_error_out   = ~wait_in && (del_write_req || del_read_req) && ( (mabort_in && ~conf_cyc_bc) || rerror_in ) ;
700
 
701
wire   del_write_complete = del_write_req && ( rtransfer_in || rerror_in || mabort_in ) ;
702
wire   del_read_complete  = del_read_req  && ( rerror_in || mabort_in || ( last_transfered ) || ( retry_in && ~first_in ) ) ;
703
 
704
assign del_complete_out = ~wait_in && ( del_write_complete || del_read_complete ) ;
705
 
706
 
707
// next last output generation
708
assign next_last_out = del_write_req || del_read_req && ( ~del_burst_in || read_bound ) || posted_write_req && ( write_next_last ) ;
709
/*==================================================================================================================
710
Error recovery FF gets a value of one, when during posted write error occurs. It is cleared when all the data provided
711
for erroneous transaction is pulled out of WBW_FIFO
712
==================================================================================================================*/
713
 
714
// error recovery flip flop input - used when posted write is terminated with an error
715
always@(
716
    err_recovery or
717
    last_out or
718
    wlast or
719
    err_signal_out or
720
    intermediate_last
721
)
722
begin
723
    // when error recovery is not set - drive its input so it gets set
724
    if ( ~err_recovery )
725
        err_recovery_in = ~last_out && ~intermediate_last && err_signal_out ;
726
    else
727
        // when error recovery is set, wbw_fifo is enabled - clear err_recovery when last data entry of erroneous transaction is pulled out of fifo
728
        err_recovery_in = ~wlast ;
729
end
730
 
731
wire data_load_slow = (req_out && ~rdy_out) && (del_read_req || write_req_int) ;
732
wire data_load_en   = posted_write_req && ~last_out && ~wait_in ;
733
wire data_be_load = data_load_slow || (data_load_en && wtransfer_in) ;
734
 
735
wire last_load  = req_out && ( ~rdy_out || ~wait_in && wtransfer_in ) ;
736
 
737
always@(posedge reset_in or posedge clk_in)
738
begin
739
    if (reset_in)
740
    begin
741
        be_out   <= #`FF_DELAY 4'hF ;
742
        data_out <= #`FF_DELAY 32'h0000_0000 ;
743
    end
744
    else
745
    if ( data_be_load )
746
    begin
747
        data_out <= #`FF_DELAY next_data_out ;
748
        be_out   <= #`FF_DELAY next_be_out ;
749
    end
750
end
751
 
752
always@(posedge reset_in or posedge clk_in)
753
begin
754
    if (reset_in)
755
        current_last <= #`FF_DELAY 1'b0 ;
756
    else
757
    if ( last_load )
758
        current_last <= #`FF_DELAY next_last_out ;
759
end
760
 
761
assign last_out = current_last ;
762
endmodule

powered by: WebSVN 2.1.0

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