| 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 | |
| 98 | module 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 | /*---------------------------------------------------------------------------------------------------------------------- |
| 170 | Various parameters needed for state machine and other stuff |
| 171 | ----------------------------------------------------------------------------------------------------------------------*/ |
| 172 | parameter S_IDLE = `WB_FSM_BITS'h0 ; |
| 173 | parameter S_WRITE = `WB_FSM_BITS'h1 ; |
| 174 | parameter S_WRITE_ERR_RTY = `WB_FSM_BITS'h2 ; |
| 175 | parameter S_READ = `WB_FSM_BITS'h3 ; |
| 176 | parameter S_READ_RTY = `WB_FSM_BITS'h4 ; |
| 177 | parameter S_TURN_ARROUND = `WB_FSM_BITS'h5 ; |
| 178 | |
| 179 | /*---------------------------------------------------------------------------------------------------------------------- |
| 180 | System signals inputs |
| 181 | wb_clock_in - WISHBONE bus clock input |
| 182 | reset_in - system reset input controlled by bridge's reset logic |
| 183 | ----------------------------------------------------------------------------------------------------------------------*/ |
| 184 | input wb_clock_in ; |
| 185 | input reset_in ; |
| 186 | |
| 187 | /*---------------------------------------------------------------------------------------------------------------------- |
| 188 | Control signals from PCI Target for READS to PCIR_FIFO |
| 189 | ---------------------------------------------------------------------------------------------------------------------*/ |
| 190 | input pci_tar_read_request ; // read request from PCI Target |
| 191 | input [31:0] pci_tar_address ; // address for requested read from PCI Target |
| 192 | input [3:0] pci_tar_cmd ; // command for requested read from PCI Target |
| 193 | input [3:0] pci_tar_be ; // byte enables for requested read from PCI Target |
| 194 | input pci_tar_burst_ok ; |
| 195 | input [7:0] pci_cache_line_size ; // CACHE line size register value for burst length |
| 196 | input cache_lsize_not_zero ; |
| 197 | output wb_read_done_out ; // read done and PCIR_FIFO has data ready |
| 198 | output w_attempt ; |
| 199 | |
| 200 | reg wb_read_done_out ; |
| 201 | reg wb_read_done ; |
| 202 | |
| 203 | /*---------------------------------------------------------------------------------------------------------------------- |
| 204 | PCIR_FIFO control signals used for sinking data into PCIR_FIFO and status monitoring |
| 205 | ---------------------------------------------------------------------------------------------------------------------*/ |
| 206 | output pcir_fifo_wenable_out ; // PCIR_FIFO write enable output |
| 207 | output [31:0] pcir_fifo_data_out ; // data output to PCIR_FIFO |
| 208 | output [3:0] pcir_fifo_be_out ; // byte enable output to PCIR_FIFO |
| 209 | output [3:0] pcir_fifo_control_out ; // control bus output to PCIR_FIFO |
| 210 | |
| 211 | reg [31:0] pcir_fifo_data_out ; |
| 212 | reg pcir_fifo_wenable_out ; |
| 213 | reg pcir_fifo_wenable ; |
| 214 | reg [3:0] pcir_fifo_control_out ; |
| 215 | reg [3:0] pcir_fifo_control ; |
| 216 | |
| 217 | /*---------------------------------------------------------------------------------------------------------------------- |
| 218 | PCIW_FIFO control signals used for fetching data from PCIW_FIFO and status monitoring |
| 219 | ---------------------------------------------------------------------------------------------------------------------*/ |
| 220 | output pciw_fifo_renable_out ; // read enable for PCIW_FIFO output |
| 221 | input [31:0] pciw_fifo_addr_data_in ; // address and data input from PCIW_FIFO |
| 222 | input [3:0] pciw_fifo_cbe_in ; // command and byte_enables from PCIW_FIFO |
| 223 | input [3:0] pciw_fifo_control_in ; // control bus input from PCIW_FIFO |
| 224 | input pciw_fifo_almost_empty_in ; // almost empty status indicator from PCIW_FIFO |
| 225 | input pciw_fifo_empty_in ; // empty status indicator from PCIW_FIFO |
| 226 | input pciw_fifo_transaction_ready_in ; // write transaction is ready in PCIW_FIFO |
| 227 | |
| 228 | reg pciw_fifo_renable_out ; |
| 229 | reg pciw_fifo_renable ; |
| 230 | |
| 231 | /*---------------------------------------------------------------------------------------------------------------------- |
| 232 | Control INPUT / OUTPUT signals for configuration space reporting registers !!! |
| 233 | ---------------------------------------------------------------------------------------------------------------------*/ |
| 234 | output pci_error_sig_out ; // When error occures (on WB bus, retry counter, etc.) |
| 235 | output [3:0] pci_error_bc ; // bus command at which error occured ! |
| 236 | output write_rty_cnt_exp_out ; // Signaling that RETRY counter has expired during write transaction! |
| 237 | output 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 |
| 240 | output 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 |
| 242 | reg pci_error_sig_out ; |
| 243 | reg write_rty_cnt_exp_out ; |
| 244 | reg read_rty_cnt_exp_out ; |
| 245 | reg error_source_out ; |
| 246 | |
| 247 | /*---------------------------------------------------------------------------------------------------------------------- |
| 248 | WISHBONE bus interface signals - can be connected directly to WISHBONE bus |
| 249 | ---------------------------------------------------------------------------------------------------------------------*/ |
| 250 | output wb_cyc_o; // cycle indicator output |
| 251 | output wb_stb_o; // strobe output - data is valid when strobe and cycle indicator are high |
| 252 | output wb_we_o; // write enable output - 1 - write operation, 0 - read operation |
| 253 | output [2:0] wb_cti_o; // WB B3 - cycle type identifier |
| 254 | output [1:0] wb_bte_o; // WB B3 - burst type |
| 255 | output [3:0] wb_sel_o; // Byte select outputs |
| 256 | output [31:0] wb_adr_o; // WISHBONE address output |
| 257 | input [31:0] wb_dat_i; // WISHBONE interface input data bus |
| 258 | output [31:0] wb_dat_o; // WISHBONE interface output data bus |
| 259 | input wb_ack_i; // Acknowledge input - qualifies valid data on data output bus or received data on data input bus |
| 260 | input wb_rty_i; // retry input - signals from WISHBONE slave that cycle should be terminated and retried later |
| 261 | input wb_err_i; // Signals from WISHBONE slave that access resulted in an error |
| 262 | |
| 263 | reg wb_cyc_o; |
| 264 | reg wb_stb_o; |
| 265 | reg wb_we_o; |
| 266 | reg [2:0] wb_cti_o; |
| 267 | reg [1:0] wb_bte_o; |
| 268 | reg [3:0] wb_sel_o; |
| 269 | reg [31:0] wb_dat_o; |
| 270 | |
| 271 | |
| 272 | |
| 273 | /*########################################################################################################### |
| 274 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////// |
| 275 | LOGIC, COUNTERS, STATE MACHINE and some control register bits |
| 276 | ============================================================= |
| 277 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////// |
| 278 | ###########################################################################################################*/ |
| 279 | |
| 280 | reg 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 |
| 283 | reg w_attempt; |
| 284 | always@(posedge wb_clock_in or posedge reset_in) |
| 285 | begin |
| 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 |
| 296 | end |
| 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) |
| 301 | wire 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! |
| 304 | reg first_wb_data_access ; |
| 305 | |
| 306 | reg last_data_from_pciw_fifo ; // signal tells when there is last data in pciw_fifo |
| 307 | reg last_data_from_pciw_fifo_reg ; |
| 308 | reg 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! |
| 311 | always@(posedge wb_clock_in or posedge reset_in) |
| 312 | begin |
| 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 |
| 323 | end |
| 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 |
| 372 | always@(pci_tar_cmd or pci_tar_burst_ok or read_bound) |
| 373 | begin |
| 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 |
| 402 | end |
| 403 | |
| 404 | reg wait_for_wb_response ; |
| 405 | |
| 406 | `ifdef PCI_WBM_NO_RESPONSE_CNT_DISABLE |
| 407 | wire set_retry = 1'b0 ; |
| 408 | |
| 409 | `else |
| 410 | reg [3:0] wb_no_response_cnt ; |
| 411 | reg [3:0] wb_response_value ; |
| 412 | reg set_retry ; // |
| 413 | |
| 414 | // internal WB no response retry generator counter! |
| 415 | always@(posedge reset_in or posedge wb_clock_in) |
| 416 | begin |
| 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 ; |
| 421 | end |
| 422 | // internal WB no response retry generator logic |
| 423 | always@(wait_for_wb_response or wb_no_response_cnt) |
| 424 | begin |
| 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 |
| 438 | end |
| 439 | `endif |
| 440 | |
| 441 | wire retry = wb_rty_i || set_retry ; // retry signal - logic OR function between wb_rty_i and internal WB no response retry! |
| 442 | reg [7:0] rty_counter ; // output from retry counter |
| 443 | reg [7:0] rty_counter_in ; // input value - output value + 1 OR output value |
| 444 | reg rty_counter_almost_max_value ; // signal tells when retry counter riches maximum value - 1! |
| 445 | reg 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 |
| 449 | always@(posedge reset_in or posedge wb_clock_in) |
| 450 | begin |
| 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 |
| 455 | end |
| 456 | |
| 457 | // Retry counter register control |
| 458 | always@(posedge reset_in or posedge wb_clock_in) |
| 459 | begin |
| 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 |
| 469 | end |
| 470 | // Retry counter logic |
| 471 | always@(rty_counter) |
| 472 | begin |
| 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 |
| 483 | end |
| 484 | |
| 485 | reg [31:0] addr_cnt_out ; // output value from address counter to WB ADDRESS output |
| 486 | reg [31:0] addr_cnt_in ; // input address value to address counter |
| 487 | reg addr_into_cnt ; // control signal for loading starting address into counter |
| 488 | reg addr_into_cnt_reg ; |
| 489 | reg addr_count ; // control signal for count enable |
| 490 | reg [3:0] bc_register ; // used when error occures during writes! |
| 491 | |
| 492 | // wb address counter register control |
| 493 | always@(posedge wb_clock_in or posedge reset_in) |
| 494 | begin |
| 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 |
| 508 | end |
| 509 | |
| 510 | // when '1', the bus command is IO command - not supported commands are checked in pci_decoder modules |
| 511 | wire io_memory_bus_command = !pci_tar_cmd[3] && !pci_tar_cmd[2] ; |
| 512 | |
| 513 | // wb address counter logic |
| 514 | 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 |
| 515 | io_memory_bus_command) |
| 516 | begin |
| 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 |
| 538 | end |
| 539 | |
| 540 | reg retried ; // Signal is output value from FF and is set for one clock period after retried_d is set |
| 541 | reg retried_d ; // Signal is set whenever cycle is retried and is input to FF for delaying -> used in S_IDLE state |
| 542 | reg retried_write; |
| 543 | reg rty_i_delayed; // Dignal used for determinig the source of retry! |
| 544 | |
| 545 | reg first_data_is_burst ; // Signal is set in S_WRITE or S_READ states, when data transfere is burst! |
| 546 | reg first_data_is_burst_reg ; |
| 547 | wire burst_transfer ; // This signal is set when data transfere is burst and is reset with RESET or last data transfered |
| 548 | reg burst_chopped; // This signal is set when WB_SEL_O is changed during burst write transaction |
| 549 | reg 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 |
| 553 | always@(posedge wb_clock_in or posedge reset_in) |
| 554 | begin |
| 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 |
| 567 | end |
| 568 | |
| 569 | // Determinig if first data is a part of BURST or just a single transfere! |
| 570 | always@(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) |
| 572 | begin |
| 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]*/; |
| 592 | end |
| 593 | |
| 594 | // FF for seting and reseting burst_transfer signal |
| 595 | always@(posedge wb_clock_in or posedge reset_in) |
| 596 | begin |
| 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 |
| 618 | end |
| 619 | assign burst_transfer = first_data_is_burst || first_data_is_burst_reg ; |
| 620 | |
| 621 | reg [(`WB_FSM_BITS - 1):0] c_state ; //current state register |
| 622 | reg [(`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) |
| 629 | always@(posedge wb_clock_in or posedge reset_in) |
| 630 | begin |
| 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 |
| 735 | end |
| 736 | |
| 737 | assign wb_adr_o = addr_cnt_out ; |
| 738 | |
| 739 | // state machine logic |
| 740 | always@(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 | ) |
| 760 | begin |
| 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 |
| 1134 | end |
| 1135 | |
| 1136 | // Signal for retry monitor in state machine when there is read and first (or single) data access |
| 1137 | wire 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 |
| 1140 | always@(posedge wb_clock_in or posedge reset_in) |
| 1141 | begin |
| 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 |
| 1151 | end |
| 1152 | |
| 1153 | // Signals to FIFO |
| 1154 | assign pcir_fifo_be_out = 4'hf ; // pci_tar_be ; |
| 1155 | |
| 1156 | // Signals to Conf. space |
| 1157 | assign pci_error_bc = bc_register ; |
| 1158 | |
| 1159 | |
| 1160 | always@(posedge wb_clock_in or posedge reset_in) |
| 1161 | begin |
| 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 ; |
| 1166 | end |
| 1167 | |
| 1168 | always@(pciw_fifo_renable or addr_into_cnt_reg or pciw_fifo_control_in or pciw_fifo_empty_in) |
| 1169 | begin |
| 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 ; |
| 1172 | end |
| 1173 | |
| 1174 | |
| 1175 | endmodule |
| 1176 | |