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 77

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

powered by: WebSVN 2.1.0

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