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

Subversion Repositories pci

[/] [pci/] [tags/] [rel_3/] [rtl/] [verilog/] [wb_master.v] - Blame information for rev 65

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

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

powered by: WebSVN 2.1.0

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