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

Subversion Repositories pci

[/] [pci/] [tags/] [asyst_3/] [rtl/] [verilog/] [pci_wb_master.v] - Blame information for rev 81

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

Line No. Rev Author Line
1 77 mihad
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  File name: wb_master.v                                      ////
4
////                                                              ////
5
////  This file is part of the "PCI bridge" project               ////
6
////  http://www.opencores.org/cores/pci/                         ////
7
////                                                              ////
8
////  Author(s):                                                  ////
9
////      - Tadej Markovic, tadej@opencores.org                   ////
10
////                                                              ////
11
////  All additional information is avaliable in the README.txt   ////
12
////  file.                                                       ////
13
////                                                              ////
14
////                                                              ////
15
//////////////////////////////////////////////////////////////////////
16
////                                                              ////
17
//// Copyright (C) 2000 Tadej Markovic, tadej@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 81 mihad
// Revision 1.1  2003/01/27 16:49:31  mihad
46
// Changed module and file names. Updated scripts accordingly. FIFO synchronizations changed.
47
//
48 77 mihad
// Revision 1.7  2002/12/05 12:19:23  mihad
49
// *** empty log message ***
50
//
51
// Revision 1.6  2002/10/11 14:15:29  mihad
52
// Cleaned up non-blocking assignments in combinatinal logic statements
53
//
54
// Revision 1.5  2002/03/05 11:53:47  mihad
55
// Added some testcases, removed un-needed fifo signals
56
//
57
// Revision 1.4  2002/02/19 16:32:37  mihad
58
// Modified testbench and fixed some bugs
59
//
60
// Revision 1.3  2002/02/01 15:25:13  mihad
61
// Repaired a few bugs, updated specification, added test bench files and design document
62
//
63
// Revision 1.2  2001/10/05 08:14:30  mihad
64
// Updated all files with inclusion of timescale file for simulation purposes.
65
//
66
// Revision 1.1.1.1  2001/10/02 15:33:47  mihad
67
// New project directory structure
68
//
69
//
70
 
71
`define WB_FSM_BITS 3 // number of bits needed for FSM states
72
 
73
 
74
`include "bus_commands.v"
75
`include "pci_constants.v"
76
//synopsys translate_off
77
`include "timescale.v"
78
//synopsys translate_on
79
 
80
module pci_wb_master
81
                 (  wb_clock_in,        // CLK_I
82
                    reset_in,           // RST_I
83
 
84
                    pci_tar_read_request,
85
                    pci_tar_address,
86
                    pci_tar_cmd,
87
                    pci_tar_be,
88
                    pci_tar_burst_ok,
89
                    pci_cache_line_size,
90
                    cache_lsize_not_zero,
91
                    wb_read_done_out,
92
                    w_attempt,
93
 
94
                    pcir_fifo_wenable_out,
95
                    pcir_fifo_data_out,
96
                    pcir_fifo_be_out,
97
                    pcir_fifo_control_out,
98
                    //pcir_fifo_renable_out,            for PCI Target !!!
99
                    //pcir_fifo_data_in,                for PCI Target !!!
100
                    //pcir_fifo_be_in,                  for PCI Target !!!
101
                    //pcir_fifo_control_in,             for PCI Target !!!
102
                    //pcir_fifo_flush_out,              for PCI Target !!!
103
                    //pcir_fifo_almost_empty_in,        for PCI Target !!!
104
                    //pcir_fifo_empty_in,               NOT used
105
                    //pcir_fifo_transaction_ready_in,   NOT used
106
                    //pciw_fifo_wenable_out,            for PCI Target !!!
107
                    //pciw_fifo_addr_data_out,          for PCI Target !!!   
108
                    //pciw_fifo_cbe_out,                for PCI Target !!!
109
                    //pciw_fifo_control_out,            for PCI Target !!!       
110
                    pciw_fifo_renable_out,
111
                    pciw_fifo_addr_data_in,
112
                    pciw_fifo_cbe_in,
113
                    pciw_fifo_control_in,
114
                    //pciw_fifo_flush_out,              NOT used
115
                    //pciw_fifo_almost_full_in,         for PCI Target !!!
116
                    //pciw_fifo_full_in,                for PCI Target !!!
117
                    pciw_fifo_almost_empty_in,
118
                    pciw_fifo_empty_in,
119
                    pciw_fifo_transaction_ready_in,
120
 
121
                    pci_error_sig_out,
122
                    pci_error_bc,
123
                    write_rty_cnt_exp_out,
124
                    error_source_out,
125
                    read_rty_cnt_exp_out,
126
 
127
                    CYC_O,
128
                    STB_O,
129
                    WE_O,
130
                    SEL_O,
131
                    ADR_O,
132
                    MDATA_I,
133
                    MDATA_O,
134
                    ACK_I,
135
                    RTY_I,
136
                    ERR_I,
137
                    CAB_O
138
                );
139
 
140
/*----------------------------------------------------------------------------------------------------------------------
141
Various parameters needed for state machine and other stuff
142
----------------------------------------------------------------------------------------------------------------------*/
143
parameter       S_IDLE          = `WB_FSM_BITS'h0 ;
144
parameter       S_WRITE         = `WB_FSM_BITS'h1 ;
145
parameter       S_WRITE_ERR_RTY = `WB_FSM_BITS'h2 ;
146
parameter       S_READ          = `WB_FSM_BITS'h3 ;
147
parameter       S_READ_RTY      = `WB_FSM_BITS'h4 ;
148
parameter       S_TURN_ARROUND  = `WB_FSM_BITS'h5 ;
149
 
150
/*----------------------------------------------------------------------------------------------------------------------
151
System signals inputs
152
wb_clock_in - WISHBONE bus clock input
153
reset_in    - system reset input controlled by bridge's reset logic
154
----------------------------------------------------------------------------------------------------------------------*/
155
input           wb_clock_in ;
156
input           reset_in ;
157
 
158
/*----------------------------------------------------------------------------------------------------------------------
159
Control signals from PCI Target for READS to PCIR_FIFO
160
---------------------------------------------------------------------------------------------------------------------*/
161
input           pci_tar_read_request ;      // read request from PCI Target
162
input   [31:0]  pci_tar_address ;           // address for requested read from PCI Target                   
163
input   [3:0]   pci_tar_cmd ;               // command for requested read from PCI Target                   
164
input   [3:0]   pci_tar_be ;                // byte enables for requested read from PCI Target              
165
input           pci_tar_burst_ok ;
166
input   [7:0]   pci_cache_line_size ;       // CACHE line size register value for burst length   
167
input           cache_lsize_not_zero ;
168
output          wb_read_done_out ;              // read done and PCIR_FIFO has data ready
169
output          w_attempt ;
170
 
171
reg             wb_read_done_out ;
172
reg             wb_read_done ;
173
 
174
/*----------------------------------------------------------------------------------------------------------------------
175
PCIR_FIFO control signals used for sinking data into PCIR_FIFO and status monitoring
176
---------------------------------------------------------------------------------------------------------------------*/
177
output          pcir_fifo_wenable_out ;     // PCIR_FIFO write enable output
178
output  [31:0]  pcir_fifo_data_out ;        // data output to PCIR_FIFO
179
output  [3:0]   pcir_fifo_be_out ;          // byte enable output to PCIR_FIFO
180
output  [3:0]   pcir_fifo_control_out ;     // control bus output to PCIR_FIFO
181
 
182
reg     [31:0]  pcir_fifo_data_out ;
183
reg             pcir_fifo_wenable_out ;
184
reg             pcir_fifo_wenable ;
185
reg     [3:0]   pcir_fifo_control_out ;
186
reg     [3:0]   pcir_fifo_control ;
187
 
188
/*----------------------------------------------------------------------------------------------------------------------
189
PCIW_FIFO control signals used for fetching data from PCIW_FIFO and status monitoring
190
---------------------------------------------------------------------------------------------------------------------*/
191
output          pciw_fifo_renable_out ;     // read enable for PCIW_FIFO output
192
input   [31:0]  pciw_fifo_addr_data_in ;    // address and data input from PCIW_FIFO
193
input   [3:0]   pciw_fifo_cbe_in ;          // command and byte_enables from PCIW_FIFO
194
input   [3:0]   pciw_fifo_control_in ;      // control bus input from PCIW_FIFO
195
input           pciw_fifo_almost_empty_in ; // almost empty status indicator from PCIW_FIFO
196
input           pciw_fifo_empty_in ;        // empty status indicator from PCIW_FIFO
197
input           pciw_fifo_transaction_ready_in ;    // write transaction is ready in PCIW_FIFO
198
 
199
reg             pciw_fifo_renable_out ;
200
reg             pciw_fifo_renable ;
201
 
202
/*----------------------------------------------------------------------------------------------------------------------
203
Control INPUT / OUTPUT signals for configuration space reporting registers !!!
204
---------------------------------------------------------------------------------------------------------------------*/
205
output          pci_error_sig_out ;         // When error occures (on WB bus, retry counter, etc.)
206
output  [3:0]   pci_error_bc ;              // bus command at which error occured !
207
output          write_rty_cnt_exp_out ;     // Signaling that RETRY counter has expired during write transaction!
208
output          read_rty_cnt_exp_out ;      // Signaling that RETRY counter has expired during read transaction!
209
                                            //  if error_source is '0' other side didn't respond
210
                                            //  if error_source is '1' other side RETRIED for max retry counter value
211
output          error_source_out ;          // Signaling error source - '0' other WB side signaled error OR didn't respond
212
                                            //   if '1' wridge counted max value in retry counter because of RTY responds
213
reg             pci_error_sig_out ;
214
reg             write_rty_cnt_exp_out ;
215
reg             read_rty_cnt_exp_out ;
216
reg             error_source_out ;
217
 
218
/*----------------------------------------------------------------------------------------------------------------------
219
WISHBONE bus interface signals - can be connected directly to WISHBONE bus
220
---------------------------------------------------------------------------------------------------------------------*/
221
output          CYC_O ;         // cycle indicator output
222
output          STB_O ;         // strobe output - data is valid when strobe and cycle indicator are high
223
output          WE_O  ;         // write enable output - 1 - write operation, 0 - read operation
224
output  [3:0]   SEL_O ;         // Byte select outputs
225
output  [31:0]  ADR_O ;         // WISHBONE address output
226
input   [31:0]  MDATA_I ;       // WISHBONE slave interface input data bus
227
output  [31:0]  MDATA_O ;       // WISHBONE slave interface output data bus
228
input           ACK_I ;         // Acknowledge input - qualifies valid data on data output bus or received data on data input bus
229
input           RTY_I ;         // retry input - signals from WISHBONE slave that cycle should be terminated and retried later
230
input           ERR_I ;         // Signals from WISHBONE slave that access resulted in an error
231
output          CAB_O ;         // consecutive address burst output - indicated that master will do a serial address transfer in current cycle
232
 
233
reg             CYC_O ;
234
reg             STB_O ;
235
reg             WE_O  ;
236
reg     [3:0]   SEL_O ;
237
reg     [31:0]  MDATA_O ;
238
reg             CAB_O ;
239
 
240
 
241
/*###########################################################################################################
242
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
243
    LOGIC, COUNTERS, STATE MACHINE and some control register bits
244
    =============================================================
245
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
246
###########################################################################################################*/
247
 
248
reg             last_data_transferred ; // signal is set by STATE MACHINE after each complete transfere !
249
 
250
// wire for write attempt - 1 when PCI Target attempt to write and PCIW_FIFO has a write transaction ready
251
`ifdef REGISTER_WBM_OUTPUTS
252
    reg     w_attempt;
253
    always@(posedge wb_clock_in or posedge reset_in)
254
    begin
255
        if (reset_in)
256
            w_attempt <= #`FF_DELAY 1'b0;
257
        else
258
        begin
259
            if (pciw_fifo_transaction_ready_in && ~pciw_fifo_empty_in)
260
                w_attempt <= #`FF_DELAY 1'b1;
261
            else
262
                if (last_data_transferred)
263
                    w_attempt <= #`FF_DELAY 1'b0;
264
        end
265
    end
266
`else
267
    assign w_attempt = ( pciw_fifo_transaction_ready_in && ~pciw_fifo_empty_in ) ;
268
`endif
269
 
270
// wire for read attempt - 1 when PCI Target is attempting a read and PCIR_FIFO is not full !
271
// because of transaction ordering, PCI Master must not start read untill all writes are done -> at that
272
//   moment PCIW_FIFO is empty !!! (when read is pending PCI Target will block new reads and writes)
273 81 mihad
wire r_attempt = ( pci_tar_read_request && !w_attempt && pciw_fifo_empty_in ) ;
274 77 mihad
 
275
// Signal is used for reads on WB, when there is retry!
276
reg             first_wb_data_access ;
277
 
278
reg             last_data_from_pciw_fifo ;  // signal tells when there is last data in pciw_fifo
279
reg             last_data_from_pciw_fifo_reg ;
280
reg             last_data_to_pcir_fifo ;    // signal tells when there will be last data for pcir_fifo
281
 
282
// Logic used in State Machine logic implemented out of State Machine because of less delay!
283
always@(pciw_fifo_control_in or pciw_fifo_almost_empty_in)
284
begin
285
    if (pciw_fifo_control_in[`LAST_CTRL_BIT] || pciw_fifo_almost_empty_in) // if last data is going to be transfered
286
        last_data_from_pciw_fifo = 1'b1 ; // signal for last data from PCIW_FIFO
287
    else
288
        last_data_from_pciw_fifo = 1'b0 ;
289
end
290
 
291
    reg read_count_load;
292
    reg read_count_enable;
293
 
294
    reg [(`PCIR_ADDR_LENGTH - 1):0] max_read_count ;
295
    always@(pci_cache_line_size or cache_lsize_not_zero or pci_tar_cmd)
296
    begin
297
        if (cache_lsize_not_zero)
298
            if ( (pci_cache_line_size >= `PCIR_DEPTH) || (~pci_tar_cmd[1] && ~pci_tar_cmd[0]) )
299
                // If cache line size is larger than FIFO or BC_MEM_READ_MUL command is performed!
300
                max_read_count = `PCIR_DEPTH - 1'b1;
301
            else
302
                max_read_count = pci_cache_line_size ;
303
        else
304
            max_read_count = 1'b1;
305
    end
306
 
307
    reg [(`PCIR_ADDR_LENGTH - 1):0] read_count ;
308
 
309
    // cache line bound indicator - it signals when data for one complete cacheline was read
310
    wire read_bound_comb = ~|( { read_count[(`PCIR_ADDR_LENGTH - 1):2], read_count[0] } ) ;
311
 
312
    reg  read_bound ;
313
    always@(posedge wb_clock_in or posedge reset_in)
314
    begin
315
        if ( reset_in )
316
            read_bound <= #`FF_DELAY 1'b0 ;
317
        else if (read_count_load)
318
            read_bound <= #`FF_DELAY 1'b0 ;
319
        else if ( read_count_enable )
320
            read_bound <= #`FF_DELAY read_bound_comb ;
321
    end
322
 
323
    // down counter with load
324
    always@(posedge reset_in or posedge wb_clock_in)
325
    begin
326
        if (reset_in)
327
            read_count <= #`FF_DELAY 0 ;
328
        else
329
        if (read_count_load)
330
            read_count <= #`FF_DELAY max_read_count ;
331
        else
332
        if (read_count_enable)
333
            read_count <= #`FF_DELAY read_count - 1'b1 ;
334
    end
335
 
336
// Logic used in State Machine logic implemented out of State Machine because of less delay!
337
//   definition of signal telling, when there is last data written into FIFO
338
always@(pci_tar_cmd or pci_tar_burst_ok or read_bound)
339
begin
340
    // burst is OK for reads when there is ((MEM_READ_LN or MEM_READ_MUL) and AD[1:0]==2'b00) OR
341
    //   (MEM_READ and Prefetchable_IMAGE and AD[1:0]==2'b00) -> pci_tar_burst_ok
342
    case ({pci_tar_cmd, pci_tar_burst_ok})
343
    {`BC_MEM_READ, 1'b1},
344
    {`BC_MEM_READ_LN, 1'b1} :
345
    begin   // when burst cycle
346
        if (read_bound)
347
            last_data_to_pcir_fifo = 1'b1 ;
348
        else
349
            last_data_to_pcir_fifo = 1'b0 ;
350
    end
351
    {`BC_MEM_READ_MUL, 1'b1} :
352
    begin   // when burst cycle
353
        if (read_bound)
354
            last_data_to_pcir_fifo = 1'b1 ;
355
        else
356
            last_data_to_pcir_fifo = 1'b0 ;
357
    end
358
    default :
359
    // {`BC_IO_READ, 1'b0},
360
    // {`BC_IO_READ, 1'b1},
361
    // {`BC_MEM_READ, 1'b0},
362
    // {`BC_MEM_READ_LN, 1'b0},
363
    // {`BC_MEM_READ_MUL, 1'b0}:
364
    begin   // when single cycle
365
        last_data_to_pcir_fifo = 1'b1 ;
366
    end
367
    endcase
368
end
369
 
370
reg     [3:0]   wb_no_response_cnt ;
371
reg     [3:0]   wb_response_value ;
372
reg             wait_for_wb_response ;
373
reg             set_retry ; // 
374
 
375
// internal WB no response retry generator counter!
376
always@(posedge reset_in or posedge wb_clock_in)
377
begin
378
    if (reset_in)
379
        wb_no_response_cnt <= #`FF_DELAY 4'h0 ;
380
    else
381
        wb_no_response_cnt <= #`FF_DELAY wb_response_value ;
382
end
383
// internal WB no response retry generator logic
384
always@(wait_for_wb_response or wb_no_response_cnt)
385
begin
386
    if (wb_no_response_cnt == 4'h8) // when there isn't response for 8 clocks, set internal retry
387
    begin
388
        wb_response_value = 4'h0 ;
389
        set_retry = 1'b1 ;
390
    end
391
    else
392
    begin
393
        if (wait_for_wb_response)
394
            wb_response_value = wb_no_response_cnt + 1'h1 ; // count clocks when no response
395
        else
396
            wb_response_value = 4'h0 ;
397
        set_retry = 1'b0 ;
398
    end
399
end
400
 
401
wire    retry = RTY_I || set_retry ; // retry signal - logic OR function between RTY_I and internal WB no response retry!
402
reg     [7:0]   rty_counter ; // output from retry counter
403
reg     [7:0]   rty_counter_in ; // input value - output value + 1 OR output value
404
reg             rty_counter_almost_max_value ; // signal tells when retry counter riches maximum value - 1!
405
reg             reset_rty_cnt ; // signal for asynchronous reset of retry counter after each complete transfere
406
 
407
// sinchronous signal after each transfere and asynchronous signal 'reset_rty_cnt' after reset  
408
//   for reseting the retry counter
409
always@(posedge reset_in or posedge wb_clock_in)
410
begin
411
    if (reset_in)
412
        reset_rty_cnt <= #`FF_DELAY 1'b1 ; // asynchronous set when reset signal is active
413
    else
414
        reset_rty_cnt <= #`FF_DELAY ACK_I || ERR_I || last_data_transferred ; // synchronous set after completed transfere
415
end
416
 
417
// Retry counter register control
418
always@(posedge reset_in or posedge wb_clock_in)
419
begin
420
    if (reset_in)
421
        rty_counter <= #`FF_DELAY 8'h00 ;
422
    else
423
    begin
424
        if (reset_rty_cnt)
425
            rty_counter <= #`FF_DELAY 8'h00 ;
426
        else if (retry)
427
            rty_counter <= #`FF_DELAY rty_counter_in ;
428
    end
429
end
430
// Retry counter logic
431
always@(rty_counter)
432
begin
433
    if(rty_counter == `WB_RTY_CNT_MAX - 1'b1) // stop counting
434
    begin
435
        rty_counter_in = rty_counter ;
436
        rty_counter_almost_max_value = 1'b1 ;
437
    end
438
    else
439
    begin
440
        rty_counter_in = rty_counter + 1'b1 ; // count up
441
        rty_counter_almost_max_value = 1'b0 ;
442
    end
443
end
444
 
445
reg     [31:0]  addr_cnt_out ;  // output value from address counter to WB ADDRESS output
446
reg     [31:0]  addr_cnt_in ;   // input address value to address counter
447
reg             addr_into_cnt ; // control signal for loading starting address into counter
448
reg             addr_count ; // control signal for count enable
449
reg     [3:0]   bc_register ; // used when error occures during writes!
450
 
451
// wb address counter register control
452
always@(posedge wb_clock_in or posedge reset_in)
453
begin
454
    if (reset_in) // reset counter
455
    begin
456
        addr_cnt_out <= #`FF_DELAY 32'h0000_0000 ;
457
        bc_register  <= #`FF_DELAY 4'h0 ;
458
    end
459
    else
460
    begin
461
        addr_cnt_out <= #`FF_DELAY addr_cnt_in ; // count up or hold value depending on cache line counter logic
462
        if (addr_into_cnt)
463
            bc_register  <= #`FF_DELAY pciw_fifo_cbe_in ;
464
    end
465
end
466
 
467
// when '1', the bus command is IO command - not supported commands are checked in pci_decoder modules
468
wire    io_memory_bus_command = !pci_tar_cmd[3] && !pci_tar_cmd[2] ;
469
 
470
// wb address counter logic
471
always@(addr_into_cnt or r_attempt or addr_count or pciw_fifo_addr_data_in or pci_tar_address or addr_cnt_out or
472
        io_memory_bus_command)
473
begin
474
    if (addr_into_cnt) // load starting address into counter
475
    begin
476
        if (r_attempt)
477
        begin // if read request, then load read addresss from PCI Target
478
            addr_cnt_in = {pci_tar_address[31:2], pci_tar_address[1] && io_memory_bus_command,
479
                                                  pci_tar_address[0] && io_memory_bus_command} ;
480
        end
481
        else
482
        begin // if not read request, then load write address from PCIW_FIFO
483
            addr_cnt_in = pciw_fifo_addr_data_in[31:0] ;
484
        end
485
    end
486
    else
487
    if (addr_count)
488
    begin
489
        addr_cnt_in = addr_cnt_out + 3'h4 ; // count up for 32-bit alligned address 
490
    end
491
    else
492
    begin
493
        addr_cnt_in = addr_cnt_out ;
494
    end
495
end
496
 
497
reg wb_stb_o ; // Internal signal for driwing STB_O on WB bus
498
reg wb_we_o ; // Internal signal for driwing WE_O on WB bus
499
reg wb_cyc_o ; // Internal signal for driwing CYC_O on WB bus and for enableing burst signal generation
500
 
501
reg retried ; // Signal is output value from FF and is set for one clock period after retried_d is set
502
reg retried_d ; // Signal is set whenever cycle is retried and is input to FF for delaying -> used in S_IDLE state
503
reg retried_write;
504
reg rty_i_delayed; // Dignal used for determinig the source of retry!
505
 
506
reg     first_data_is_burst ; // Signal is set in S_WRITE or S_READ states, when data transfere is burst!
507
reg     first_data_is_burst_reg ;
508
wire    burst_transfer ; // This signal is set when data transfere is burst and is reset with RESET or last data transfered
509
 
510
// FFs output signals tell, when there is first data out from FIFO (for BURST checking)
511
//   and for delaying retried signal
512
always@(posedge wb_clock_in or posedge reset_in)
513
begin
514
    if (reset_in) // reset signals
515
    begin
516
        retried <= #`FF_DELAY 1'b0 ;
517
        retried_write <= #`FF_DELAY 1'b0 ;
518
        rty_i_delayed <= #`FF_DELAY 1'B0 ;
519
    end
520
    else
521
    begin
522
        retried <= #`FF_DELAY retried_d ; // delaying retried signal  
523
        retried_write <= #`FF_DELAY retried ;
524
        rty_i_delayed <= #`FF_DELAY RTY_I ;
525
    end
526
end
527
 
528
// Determinig if first data is a part of BURST or just a single transfere!
529
always@(addr_into_cnt or r_attempt or pci_tar_burst_ok or max_read_count or
530
        pciw_fifo_control_in or pciw_fifo_empty_in)
531
begin
532
    if (addr_into_cnt)
533
    begin
534
        if (r_attempt)
535
        begin
536
                // burst is OK for reads when there is ((MEM_READ_LN or MEM_READ_MUL) and AD[1:0]==2'b00) OR
537
                //   (MEM_READ and Prefetchable_IMAGE and AD[1:0]==2'b00) -> pci_tar_burst_ok
538
            if  (pci_tar_burst_ok && (max_read_count != 8'h1))
539
                first_data_is_burst = 1'b1 ;
540
            else
541
                first_data_is_burst = 1'b0 ;
542
        end
543
        else
544
        begin
545
            first_data_is_burst = 1'b0 ;
546
        end
547
    end
548
    else
549
        first_data_is_burst = pciw_fifo_control_in[`BURST_BIT] && ~pciw_fifo_empty_in && ~pciw_fifo_control_in[`LAST_CTRL_BIT];
550
end
551
 
552
// FF for seting and reseting burst_transfer signal
553
always@(posedge wb_clock_in or posedge reset_in)
554
begin
555
    if (reset_in)
556
        first_data_is_burst_reg <= #`FF_DELAY 1'b0 ;
557
    else
558
    begin
559
        if (last_data_transferred || first_data_is_burst)
560
            first_data_is_burst_reg <= #`FF_DELAY ~last_data_transferred ;
561
    end
562
end
563
`ifdef REGISTER_WBM_OUTPUTS
564
    assign  burst_transfer = first_data_is_burst || first_data_is_burst_reg ;
565
`else
566
    assign  burst_transfer = (first_data_is_burst && ~last_data_transferred) || first_data_is_burst_reg ;
567
`endif
568
 
569
reg [(`WB_FSM_BITS - 1):0]  c_state ; //current state register
570
reg [(`WB_FSM_BITS - 1):0]  n_state ; //next state input to current state register
571
 
572
// state machine register control
573
always@(posedge wb_clock_in or posedge reset_in)
574
begin
575
    if (reset_in) // reset state machine ti S_IDLE state
576
        c_state <= #`FF_DELAY S_IDLE ;
577
    else
578
        c_state <= #`FF_DELAY n_state ;
579
end
580
 
581
// state machine logic
582
always@(c_state or
583
        ACK_I or
584
        RTY_I or
585
        ERR_I or
586
        w_attempt or
587
        r_attempt or
588
        retried or
589
        rty_i_delayed or
590
        pci_tar_read_request or
591
        rty_counter_almost_max_value or
592
        set_retry or
593
        last_data_to_pcir_fifo or
594
        first_wb_data_access or
595
        last_data_from_pciw_fifo_reg
596
        )
597
begin
598
    case (c_state)
599
    S_IDLE:
600
        begin
601
            // Default values for signals not used in this state
602
            pcir_fifo_wenable = 1'b0 ;
603
            pcir_fifo_control = 4'h0 ;
604
            addr_count = 1'b0 ;
605
            read_count_enable = 1'b0 ;
606
            pci_error_sig_out = 1'b0 ;
607
            error_source_out = 1'b0 ;
608
            retried_d = 1'b0 ;
609
            last_data_transferred = 1'b0 ;
610
            wb_read_done = 1'b0 ;
611
            wait_for_wb_response = 1'b0 ;
612
            write_rty_cnt_exp_out = 1'b0 ;
613
            error_source_out = 1'b0 ;
614
            pci_error_sig_out = 1'b0 ;
615
            read_rty_cnt_exp_out = 1'b0 ;
616
            case ({w_attempt, r_attempt, retried})
617
            3'b101 : // Write request for PCIW_FIFO to WB bus transaction
618
            begin    // If there was retry, the same transaction must be initiated
619
                pciw_fifo_renable = 1'b0 ; // the same data
620
                addr_into_cnt = 1'b0 ; // the same address
621
                read_count_load = 1'b0 ; // no need for cache line when there is write
622
                n_state = S_WRITE ;
623
            end
624
            3'b100 : // Write request for PCIW_FIFO to WB bus transaction
625
            begin    // If there is new transaction
626
                pciw_fifo_renable = 1'b1 ; // first location is address (in FIFO), next will be data
627
                addr_into_cnt = 1'b1 ; // address must be latched into address counter
628
                read_count_load = 1'b0 ; // no need for cache line when there is write
629
                n_state = S_WRITE ;
630
            end
631
            3'b011 : // Read request from PCI Target for WB bus to PCIR_FIFO transaction
632
            begin    // If there was retry, the same transaction must be initiated
633
                addr_into_cnt = 1'b0 ; // the same address
634
                read_count_load = 1'b0 ; // cache line counter must not be changed for retried read
635
                pciw_fifo_renable = 1'b0 ; // don't read from FIFO, when read transaction from WB to FIFO
636
                n_state = S_READ ;
637
            end
638
            3'b010 : // Read request from PCI Target for WB bus to PCIR_FIFO transaction
639
            begin    // If there is new transaction
640
                addr_into_cnt = 1'b1 ; // address must be latched into counter from separate request bus
641
                read_count_load = 1'b1 ; // cache line size must be latched into its counter
642
                pciw_fifo_renable = 1'b0 ; // don't read from FIFO, when read transaction from WB to FIFO
643
                n_state = S_READ ;
644
            end
645
            default : // stay in IDLE state
646
            begin
647
                pciw_fifo_renable = 1'b0 ;
648
                addr_into_cnt = 1'b0 ;
649
                read_count_load = 1'b0 ;
650
                n_state = S_IDLE ;
651
            end
652
            endcase
653
            wb_stb_o = 1'b0 ;
654
            wb_we_o = 1'b0 ;
655
            wb_cyc_o = 1'b0 ;
656
        end
657
    S_WRITE: // WRITE from PCIW_FIFO to WB bus
658
        begin
659
            // Default values for signals not used in this state
660
            pcir_fifo_wenable = 1'b0 ;
661
            pcir_fifo_control = 4'h0 ;
662
            addr_into_cnt = 1'b0 ;
663
            read_count_load = 1'b0 ;
664
            read_count_enable = 1'b0 ;
665
            wb_read_done = 1'b0 ;
666
            read_rty_cnt_exp_out = 1'b0 ;
667
            case ({ACK_I, ERR_I, RTY_I})
668
            3'b100 : // If writting of one data is acknowledged
669
            begin
670
                pciw_fifo_renable = 1'b1 ; // prepare next value (address when new trans., data when burst tran.)
671
                addr_count = 1'b1 ; // prepare next address if there will be burst
672
                pci_error_sig_out = 1'b0 ; // there was no error
673
                error_source_out = 1'b0 ;
674
                retried_d = 1'b0 ; // there was no retry
675
                write_rty_cnt_exp_out = 1'b0 ; // there was no retry
676
                wait_for_wb_response = 1'b0 ;
677
                if (last_data_from_pciw_fifo_reg) // if last data was transfered
678
                begin
679
                    n_state = S_IDLE ;
680
                    last_data_transferred = 1'b1 ; // signal for last data transfered
681
                end
682
                else
683
                begin
684
                    n_state = S_WRITE ;
685
                    last_data_transferred = 1'b0 ;
686
                end
687
            end
688
            3'b010 : // If writting of one data is terminated with ERROR
689
            begin
690
                pciw_fifo_renable = 1'b1 ; // prepare next value (address when new trans., data when cleaning FIFO)
691
                addr_count = 1'b0 ; // no need for new address
692
                retried_d = 1'b0 ; // there was no retry
693
                last_data_transferred = 1'b1 ; // signal for last data transfered
694
                pci_error_sig_out = 1'b1 ; // segnal for error reporting
695
                error_source_out = 1'b0 ; // error source from other side of WB bus
696
                write_rty_cnt_exp_out = 1'b0 ; // there was no retry
697
                wait_for_wb_response = 1'b0 ;
698
                if (last_data_from_pciw_fifo_reg) // if last data was transfered
699
                    n_state = S_IDLE ; // go to S_IDLE for new transfere
700
                else // if there wasn't last data of transfere
701
                    n_state = S_WRITE_ERR_RTY ; // go here to clean this write transaction from PCIW_FIFO
702
            end
703
            3'b001 : // If writting of one data is retried
704
            begin
705
                addr_count = 1'b0 ;
706
                last_data_transferred = 1'b0 ;
707
                retried_d = 1'b1 ; // there was a retry
708
                wait_for_wb_response = 1'b0 ;
709
                if(rty_counter_almost_max_value) // If retry counter reached maximum allowed value
710
                begin
711
                        if (last_data_from_pciw_fifo_reg) // if last data was transfered
712
                        pciw_fifo_renable = 1'b0 ;
713
                        else // if there wasn't last data of transfere
714
                            pciw_fifo_renable = 1'b1 ;
715
                        n_state = S_WRITE_ERR_RTY ; // go here to clean this write transaction from PCIW_FIFO
716
                    write_rty_cnt_exp_out = 1'b1 ; // signal for reporting write counter expired
717
                    pci_error_sig_out = 1'b1 ;
718
                    error_source_out = 1'b1 ; // error ocuerd because of retry counter
719
                end
720
                else
721
                begin
722
                        pciw_fifo_renable = 1'b0 ;
723
                    n_state = S_IDLE ; // go to S_IDLE state for retrying the transaction
724
                    write_rty_cnt_exp_out = 1'b0 ; // retry counter hasn't expired yet
725
                    pci_error_sig_out = 1'b0 ;
726
                    error_source_out = 1'b0 ;
727
                end
728
            end
729
            default :
730
            begin
731
                addr_count = 1'b0 ;
732
                last_data_transferred = 1'b0 ;
733
                wait_for_wb_response = 1'b1 ; // wait for WB device to response (after 8 clocks RTY CNT is incremented)
734
                error_source_out = 1'b0 ; // if error ocures, error source is from other WB bus side
735
                if((rty_counter_almost_max_value)&&(set_retry)) // when no WB response and RTY CNT reached maximum allowed value 
736
                begin
737
                    retried_d = 1'b1 ;
738
                        if (last_data_from_pciw_fifo_reg) // if last data was transfered
739
                        pciw_fifo_renable = 1'b0 ;
740
                        else // if there wasn't last data of transfere
741
                            pciw_fifo_renable = 1'b1 ;
742
                        n_state = S_WRITE_ERR_RTY ; // go here to clean this write transaction from PCIW_FIFO
743
                    write_rty_cnt_exp_out = 1'b1 ; // signal for reporting write counter expired
744
                    pci_error_sig_out = 1'b1 ; // signal for error reporting
745
                end
746
                else
747
                begin
748
                        pciw_fifo_renable = 1'b0 ;
749
                    retried_d = 1'b0 ;
750
                    n_state = S_WRITE ; // stay in S_WRITE state to wait WB to response
751
                    write_rty_cnt_exp_out = 1'b0 ; // retry counter hasn't expired yet
752
                    pci_error_sig_out = 1'b0 ;
753
                end
754
            end
755
            endcase
756
            wb_stb_o = 1'b1 ;
757
            wb_we_o = 1'b1 ;
758
            wb_cyc_o = 1'b1 ;
759
        end
760
    S_WRITE_ERR_RTY: // Clean current write transaction from PCIW_FIFO if ERROR or Retry counter expired occures
761
        begin
762
`ifdef REGISTER_WBM_OUTPUTS
763
            pciw_fifo_renable = !last_data_from_pciw_fifo_reg ; // put out next data (untill last data or FIFO empty)
764
`else
765
            pciw_fifo_renable = 1'b1 ; // put out next data (untill last data or FIFO empty)
766
`endif
767
            last_data_transferred = 1'b1 ; // after exiting this state, negedge of this signal is used
768
            // Default values for signals not used in this state
769
            pcir_fifo_wenable = 1'b0 ;
770
            pcir_fifo_control = 4'h0 ;
771
            addr_into_cnt = 1'b0 ;
772
            read_count_load = 1'b0 ;
773
            read_count_enable = 1'b0 ;
774
            addr_count = 1'b0 ;
775
            pci_error_sig_out = 1'b0 ;
776
            error_source_out = 1'b0 ;
777
            retried_d = 1'b0 ;
778
            wb_read_done = 1'b0 ;
779
            write_rty_cnt_exp_out = 1'b0 ;
780
            read_rty_cnt_exp_out = 1'b0 ;
781
            wait_for_wb_response = 1'b0 ;
782
            // If last data is cleaned out from PCIW_FIFO
783
            if (last_data_from_pciw_fifo_reg)
784
                n_state = S_IDLE ;
785
            else
786
                n_state = S_WRITE_ERR_RTY ; // Clean until last data is cleaned out from FIFO
787
            wb_stb_o = 1'b0 ;
788
            wb_we_o = 1'b0 ;
789
            wb_cyc_o = 1'b0 ;
790
        end
791
    S_READ: // READ from WB bus to PCIR_FIFO
792
        begin
793
            // Default values for signals not used in this state
794
            pciw_fifo_renable = 1'b0 ;
795
            addr_into_cnt = 1'b0 ;
796
            read_count_load = 1'b0 ;
797
            pci_error_sig_out = 1'b0 ;
798
            error_source_out = 1'b0 ;
799
            write_rty_cnt_exp_out = 1'b0 ;
800
            case ({ACK_I, ERR_I, RTY_I})
801
            3'b100 : // If reading of one data is acknowledged
802
            begin
803
                pcir_fifo_wenable = 1'b1 ; // enable writting data into PCIR_FIFO
804
                addr_count = 1'b1 ; // prepare next address if there will be burst
805
                read_count_enable = 1'b1 ; // decrease counter value for cache line size
806
                retried_d = 1'b0 ; // there was no retry
807
                read_rty_cnt_exp_out = 1'b0 ; // there was no retry
808
                wait_for_wb_response = 1'b0 ;
809
                // if last data was transfered
810
                if (last_data_to_pcir_fifo)
811
                begin
812
                    pcir_fifo_control[`LAST_CTRL_BIT]       = 1'b1 ; // FIFO must indicate LAST data transfered
813
                    pcir_fifo_control[`DATA_ERROR_CTRL_BIT] = 1'b0 ;
814
                    pcir_fifo_control[`UNUSED_CTRL_BIT]     = 1'b0 ;
815
                    pcir_fifo_control[`ADDR_CTRL_BIT]       = 1'b0 ;
816
                    last_data_transferred = 1'b1 ; // signal for last data transfered
817
                    wb_read_done = 1'b1 ; // signal last data of read transaction for PCI Target
818
                    n_state = S_TURN_ARROUND ;
819
                end
820
                else // if not last data transfered
821
                begin
822
                    pcir_fifo_control = 4'h0 ; // ZERO for control code
823
                    last_data_transferred = 1'b0 ; // not last data transfered
824
                    wb_read_done = 1'b0 ; // read is not done yet
825
                    n_state = S_READ ;
826
                end
827
            end
828
            3'b010 : // If reading of one data is terminated with ERROR
829
            begin
830
                pcir_fifo_wenable = 1'b1 ; // enable for writting to FIFO data with ERROR
831
                addr_count = 1'b0 ; // no need for new address
832
                pcir_fifo_control[`LAST_CTRL_BIT]       = 1'b0 ;
833
                pcir_fifo_control[`DATA_ERROR_CTRL_BIT] = 1'b1 ; // FIFO must indicate the DATA with ERROR
834
                pcir_fifo_control[`UNUSED_CTRL_BIT]     = 1'b0 ;
835
                pcir_fifo_control[`ADDR_CTRL_BIT]       = 1'b0 ;
836
                last_data_transferred = 1'b1 ; // signal for last data transfered
837
                wb_read_done = 1'b1 ; // signal last data of read transaction for PCI Target
838
                read_count_enable = 1'b0 ; // no need for cache line, when error occures
839
                n_state = S_TURN_ARROUND ;
840
                retried_d = 1'b0 ; // there was no retry
841
                wait_for_wb_response = 1'b0 ;
842
                read_rty_cnt_exp_out = 1'b0 ; // there was no retry
843
            end
844
            3'b001 : // If reading of one data is retried
845
            begin
846
                pcir_fifo_wenable = 1'b0 ;
847
                pcir_fifo_control = 4'h0 ;
848
                addr_count = 1'b0 ;
849
                read_count_enable = 1'b0 ;
850
                wait_for_wb_response = 1'b0 ;
851
                case ({first_wb_data_access, rty_counter_almost_max_value})
852
                2'b10 :
853
                begin  // if first data of the cycle (CYC_O) is retried - after each retry CYC_O goes inactive 
854
                    n_state = S_IDLE ; // go to S_IDLE state for retrying the transaction
855
                    read_rty_cnt_exp_out = 1'b0 ; // retry counter hasn't expired yet   
856
                    last_data_transferred = 1'b0 ;
857
                    wb_read_done = 1'b0 ;
858
                    retried_d = 1'b1 ; // there was a retry
859
                end
860
                2'b11 :
861
                begin  // if retry counter reached maximum value
862
                    n_state = S_READ_RTY ; // go here to wait for PCI Target to remove read request
863
                    read_rty_cnt_exp_out = 1'b1 ; // signal for reporting read counter expired  
864
                    last_data_transferred = 1'b0 ;
865
                    wb_read_done = 1'b0 ;
866
                    retried_d = 1'b1 ; // there was a retry
867
                end
868
                default : // if retry occures after at least 1 data was transferred without breaking cycle (CYC_O inactive)
869
                begin     // then PCI device will retry access!
870
                    n_state = S_TURN_ARROUND ; // go to S_TURN_ARROUND state 
871
                    read_rty_cnt_exp_out = 1'b0 ; // retry counter hasn't expired  
872
                    last_data_transferred = 1'b1 ;
873
                    wb_read_done = 1'b1 ;
874
                    retried_d = 1'b0 ; // retry must not be retried, since there is not a first data
875
                end
876
                endcase
877
            end
878
            default :
879
            begin
880
                addr_count = 1'b0 ;
881
                read_count_enable = 1'b0 ;
882
                read_rty_cnt_exp_out = 1'b0 ;
883
                wait_for_wb_response = 1'b1 ; // wait for WB device to response (after 8 clocks RTY CNT is incremented)
884
                if((rty_counter_almost_max_value)&&(set_retry)) // when no WB response and RTY CNT reached maximum allowed value 
885
                begin
886
                    retried_d = 1'b1 ;
887
                    n_state = S_TURN_ARROUND ; // go here to stop read request
888
                    pcir_fifo_wenable = 1'b1 ;
889
                    pcir_fifo_control[`LAST_CTRL_BIT]       = 1'b0 ;
890
                    pcir_fifo_control[`DATA_ERROR_CTRL_BIT] = 1'b1 ; // FIFO must indicate the DATA with ERROR
891
                    pcir_fifo_control[`UNUSED_CTRL_BIT]     = 1'b0 ;
892
                    pcir_fifo_control[`ADDR_CTRL_BIT]       = 1'b0 ;
893
                    last_data_transferred = 1'b1 ;
894
                    wb_read_done = 1'b1 ;
895
                end
896
                else
897
                begin
898
                    retried_d = 1'b0 ;
899
                    n_state = S_READ ; // stay in S_READ state to wait WB to response
900
                    pcir_fifo_wenable = 1'b0 ;
901
                    pcir_fifo_control = 4'h0 ;
902
                    last_data_transferred = 1'b0 ;
903
                    wb_read_done = 1'b0 ;
904
                end
905
            end
906
            endcase
907
            wb_stb_o = 1'b1 ;
908
            wb_we_o = 1'b0 ;
909
            wb_cyc_o = 1'b1 ;
910
        end
911
    S_READ_RTY: // Wait for PCI Target to remove read request, when retry counter reaches maximum value!
912
        begin
913
            // Default values for signals not used in this state
914
            pciw_fifo_renable = 1'b0 ;
915
            pcir_fifo_wenable = 1'b0 ;
916
            pcir_fifo_control = 4'h0 ;
917
            addr_into_cnt = 1'b0 ;
918
            read_count_load = 1'b0 ;
919
            read_count_enable = 1'b0 ;
920
            addr_count = 1'b0 ;
921
            pci_error_sig_out = 1'b0 ;
922
            error_source_out = 1'b0 ;
923
            retried_d = 1'b0 ;
924
            wb_read_done = 1'b0 ;
925
            write_rty_cnt_exp_out = 1'b0 ;
926
            read_rty_cnt_exp_out = 1'b0 ;
927
            wait_for_wb_response = 1'b0 ;
928
            // wait for PCI Target to remove read request
929
            if (pci_tar_read_request)
930
            begin
931
                n_state = S_READ_RTY ; // stay in this state until read request is removed
932
                last_data_transferred = 1'b0 ;
933
            end
934
            else // when read request is removed
935
            begin
936
                n_state = S_IDLE ;
937
                last_data_transferred = 1'b1 ; // when read request is removed, there is "last" data
938
            end
939
            wb_stb_o = 1'b0 ;
940
            wb_we_o = 1'b0 ;
941
            wb_cyc_o = 1'b0 ;
942
        end
943
    S_TURN_ARROUND: // Turn arround cycle after writting to PCIR_FIFO (for correct data when reading from PCIW_FIFO) 
944
        begin
945
            // Default values for signals not used in this state
946
            pciw_fifo_renable = 1'b0 ;
947
            pcir_fifo_wenable = 1'b0 ;
948
            pcir_fifo_control = 4'h0 ;
949
            addr_into_cnt = 1'b0 ;
950
            read_count_load = 1'b0 ;
951
            read_count_enable = 1'b0 ;
952
            addr_count = 1'b0 ;
953
            pci_error_sig_out = 1'b0 ;
954
            error_source_out = 1'b0 ;
955
            retried_d = 1'b0 ;
956
            last_data_transferred = 1'b1 ;
957
            wb_read_done = 1'b0 ;
958
            write_rty_cnt_exp_out = 1'b0 ;
959
            read_rty_cnt_exp_out = 1'b0 ;
960
            wait_for_wb_response = 1'b0 ;
961
            n_state = S_IDLE ;
962
            wb_stb_o = 1'b0 ;
963
            wb_we_o = 1'b0 ;
964
            wb_cyc_o = 1'b0 ;
965
        end
966
    default :
967
        begin
968
            // Default values for signals not used in this state
969
            pciw_fifo_renable = 1'b0 ;
970
            pcir_fifo_wenable = 1'b0 ;
971
            pcir_fifo_control = 4'h0 ;
972
            addr_into_cnt = 1'b0 ;
973
            read_count_load = 1'b0 ;
974
            read_count_enable = 1'b0 ;
975
            addr_count = 1'b0 ;
976
            pci_error_sig_out = 1'b0 ;
977
            error_source_out = 1'b0 ;
978
            retried_d = 1'b0 ;
979
            last_data_transferred = 1'b0 ;
980
            wb_read_done = 1'b0 ;
981
            write_rty_cnt_exp_out = 1'b0 ;
982
            read_rty_cnt_exp_out = 1'b0 ;
983
            wait_for_wb_response = 1'b0 ;
984
            n_state = S_IDLE ;
985
            wb_stb_o = 1'b0 ;
986
            wb_we_o = 1'b0 ;
987
            wb_cyc_o = 1'b0 ;
988
        end
989
    endcase
990
end
991
 
992
// Signal for retry monitor in state machine when there is read and first (or single) data access
993
wire ack_rty_response = ACK_I || RTY_I ;
994
 
995
// Signal first_wb_data_access is set when no WB cycle present till end of first data access of WB cycle on WB bus
996
always@(posedge wb_clock_in or posedge reset_in)
997
begin
998
    if (reset_in)
999
        first_wb_data_access = 1'b1 ;
1000
    else
1001
    begin
1002
        if (~wb_cyc_o)
1003
            first_wb_data_access = 1'b1 ;
1004
        else if (ack_rty_response)
1005
            first_wb_data_access = 1'b0 ;
1006
    end
1007
end
1008
 
1009
reg     [3:0]   wb_sel_o;
1010
always@(pciw_fifo_cbe_in or pci_tar_be or wb_we_o or burst_transfer or pci_tar_read_request)
1011
begin
1012
    case ({wb_we_o, burst_transfer, pci_tar_read_request})
1013
    3'b100,
1014
    3'b101,
1015
    3'b110,
1016
    3'b111:
1017
        wb_sel_o = ~pciw_fifo_cbe_in ;
1018
    3'b011:
1019
        wb_sel_o = 4'hf ;
1020
    default:
1021
        wb_sel_o = ~pci_tar_be ;
1022
    endcase
1023
end
1024
 
1025
// Signals to FIFO
1026
assign  pcir_fifo_be_out = 4'hf ; // pci_tar_be ;
1027
 
1028
// OUTPUT signals
1029
assign  pci_error_bc = bc_register ;
1030
 
1031
assign  ADR_O = addr_cnt_out ;
1032
 
1033
`ifdef REGISTER_WBM_OUTPUTS
1034
 
1035
    reg     no_sel_o_change_due_rty;
1036
    reg     wb_cyc_reg ;
1037
    always@(posedge wb_clock_in or posedge reset_in)
1038
    begin
1039
        if (reset_in)
1040
        begin
1041
                no_sel_o_change_due_rty <= #`FF_DELAY 1'b0;
1042
            CYC_O   <= #`FF_DELAY 1'h0 ;
1043
            STB_O   <= #`FF_DELAY 1'h0 ;
1044
            WE_O    <= #`FF_DELAY 1'h0 ;
1045
            CAB_O   <= #`FF_DELAY 1'h0 ;
1046
            MDATA_O <= #`FF_DELAY 32'h0 ;
1047
            SEL_O   <= #`FF_DELAY 4'h0 ;
1048
            wb_cyc_reg <= #`FF_DELAY 1'h0 ;
1049
            wb_read_done_out <= #`FF_DELAY 1'b0 ;
1050
            pcir_fifo_data_out <= #`FF_DELAY 32'h0 ;
1051
            pcir_fifo_wenable_out <= #`FF_DELAY 1'b0 ;
1052
            pcir_fifo_control_out <= #`FF_DELAY 1'b0 ;
1053
        end
1054
        else
1055
        begin
1056
                if (w_attempt)
1057
                    if (ACK_I || ERR_I || last_data_transferred)
1058
                        no_sel_o_change_due_rty <= #`FF_DELAY 1'b0;
1059
                    else if (retry)
1060
                        no_sel_o_change_due_rty <= #`FF_DELAY 1'b1;
1061
            if (wb_cyc_o)
1062
            begin // retry = RTY_I || set_retry
1063
                CYC_O   <= #`FF_DELAY ~((ACK_I || retry || ERR_I) && (last_data_transferred || retried_d)) ;
1064
                CAB_O   <= #`FF_DELAY ~((ACK_I || retry || ERR_I) && (last_data_transferred || retried_d)) && burst_transfer ;
1065
                STB_O   <= #`FF_DELAY ~((ACK_I || retry || ERR_I) && (last_data_transferred || retried_d)) ;
1066
            end
1067
            WE_O    <= #`FF_DELAY wb_we_o ;
1068
            if (((wb_cyc_o && ~wb_cyc_reg && !retried_write) || ACK_I) && wb_we_o)
1069
                MDATA_O <= #`FF_DELAY pciw_fifo_addr_data_in ;
1070
            if (w_attempt)
1071
            begin
1072
                if (((wb_cyc_o && ~wb_cyc_reg && !retried_write) || ACK_I) && wb_we_o)
1073
                    SEL_O   <= #`FF_DELAY ~pciw_fifo_cbe_in ;
1074
            end
1075
            else
1076
            begin
1077
                if ((wb_cyc_o && ~wb_cyc_reg) || ACK_I)
1078
                    SEL_O   <= #`FF_DELAY wb_sel_o ;
1079
            end
1080
            wb_cyc_reg <= #`FF_DELAY wb_cyc_o ;
1081
            wb_read_done_out <= #`FF_DELAY wb_read_done ;
1082
            pcir_fifo_data_out <= #`FF_DELAY MDATA_I ;
1083
            pcir_fifo_wenable_out <= #`FF_DELAY pcir_fifo_wenable ;
1084
            pcir_fifo_control_out <= #`FF_DELAY pcir_fifo_control ;
1085
        end
1086
    end
1087
    always@(pciw_fifo_renable or last_data_from_pciw_fifo_reg or wb_cyc_o or wb_cyc_reg or wb_we_o or retried_write or
1088
            pciw_fifo_control_in or pciw_fifo_empty_in)
1089
    begin
1090
        pciw_fifo_renable_out <=    #`FF_DELAY (pciw_fifo_renable && ~wb_cyc_o) ||
1091
                                    (pciw_fifo_renable && ~last_data_from_pciw_fifo_reg) ||
1092
                                    (wb_cyc_o && ~wb_cyc_reg && wb_we_o && !retried_write) ;
1093
        last_data_from_pciw_fifo_reg <= #`FF_DELAY pciw_fifo_control_in[`ADDR_CTRL_BIT] || pciw_fifo_empty_in ;
1094
    end
1095
`else
1096
    always@(wb_cyc_o or wb_stb_o or wb_we_o or burst_transfer or pciw_fifo_addr_data_in or wb_sel_o or
1097
            wb_read_done or MDATA_I or pcir_fifo_wenable or pcir_fifo_control)
1098
    begin
1099
        CYC_O   = wb_cyc_o ;
1100
        STB_O   = wb_stb_o ;
1101
        WE_O    = wb_we_o ;
1102
        CAB_O   = wb_cyc_o & burst_transfer ;
1103
        MDATA_O = pciw_fifo_addr_data_in ;
1104
        SEL_O   = wb_sel_o ;
1105
        wb_read_done_out = wb_read_done ;
1106
        pcir_fifo_data_out = MDATA_I ;
1107
        pcir_fifo_wenable_out = pcir_fifo_wenable ;
1108
        pcir_fifo_control_out = pcir_fifo_control ;
1109
    end
1110
    always@(pciw_fifo_renable or last_data_from_pciw_fifo)
1111
    begin
1112
        pciw_fifo_renable_out = pciw_fifo_renable ;
1113
        last_data_from_pciw_fifo_reg = last_data_from_pciw_fifo ;
1114
    end
1115
`endif
1116
 
1117
 
1118
endmodule
1119
 

powered by: WebSVN 2.1.0

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