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 74

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

powered by: WebSVN 2.1.0

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