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