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