| 1 | ////////////////////////////////////////////////////////////////////// |
| 2 | //// //// |
| 3 | //// File name: pci_target32_interface.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_target32_interface.v,v $ |
| 45 | // Revision 1.1 2007-03-20 17:50:56 sithglan |
| 46 | // add shit |
| 47 | // |
| 48 | // Revision 1.11 2004/08/19 15:27:34 mihad |
| 49 | // Changed minimum pci image size to 256 bytes because |
| 50 | // of some PC system problems with size of IO images. |
| 51 | // |
| 52 | // Revision 1.10 2003/12/19 11:11:30 mihad |
| 53 | // Compact PCI Hot Swap support added. |
| 54 | // New testcases added. |
| 55 | // Specification updated. |
| 56 | // Test application changed to support WB B3 cycles. |
| 57 | // |
| 58 | // Revision 1.9 2003/08/21 20:55:14 tadejm |
| 59 | // Corrected bug when writing to FIFO (now it is registered). |
| 60 | // |
| 61 | // Revision 1.8 2003/08/08 16:36:33 tadejm |
| 62 | // Added 'three_left_out' to pci_pciw_fifo signaling three locations before full. Added comparison between current registered cbe and next unregistered cbe to signal wb_master whether it is allowed to performe burst or not. Due to this, I needed 'three_left_out' so that writing to pci_pciw_fifo can be registered, otherwise timing problems would occure. |
| 63 | // |
| 64 | // Revision 1.7 2003/01/27 16:49:31 mihad |
| 65 | // Changed module and file names. Updated scripts accordingly. FIFO synchronizations changed. |
| 66 | // |
| 67 | // Revision 1.6 2003/01/21 16:06:56 mihad |
| 68 | // Bug fixes, testcases added. |
| 69 | // |
| 70 | // Revision 1.5 2002/08/22 13:28:04 mihad |
| 71 | // Updated for synthesis purposes. Gate level simulation was failing in some configurations |
| 72 | // |
| 73 | // Revision 1.4 2002/02/19 16:32:37 mihad |
| 74 | // Modified testbench and fixed some bugs |
| 75 | // |
| 76 | // Revision 1.3 2002/02/01 15:25:12 mihad |
| 77 | // Repaired a few bugs, updated specification, added test bench files and design document |
| 78 | // |
| 79 | // Revision 1.2 2001/10/05 08:14:30 mihad |
| 80 | // Updated all files with inclusion of timescale file for simulation purposes. |
| 81 | // |
| 82 | // Revision 1.1.1.1 2001/10/02 15:33:47 mihad |
| 83 | // New project directory structure |
| 84 | // |
| 85 | // |
| 86 | |
| 87 | `include "bus_commands.v" |
| 88 | `include "pci_constants.v" |
| 89 | |
| 90 | // synopsys translate_off |
| 91 | `include "timescale.v" |
| 92 | // synopsys translate_on |
| 93 | |
| 94 | module pci_target32_interface |
| 95 | ( |
| 96 | // system inputs |
| 97 | clk_in, |
| 98 | reset_in, |
| 99 | |
| 100 | // PCI Target side of INTERFACE |
| 101 | address_in, |
| 102 | addr_claim_out, |
| 103 | bc_in, |
| 104 | bc0_in, |
| 105 | data_in, |
| 106 | data_out, |
| 107 | be_in, |
| 108 | next_be_in, |
| 109 | req_in, |
| 110 | rdy_in, |
| 111 | addr_phase_in, |
| 112 | bckp_devsel_in, |
| 113 | bckp_trdy_in, |
| 114 | bckp_stop_in, |
| 115 | last_reg_in, |
| 116 | frame_reg_in, |
| 117 | fetch_pcir_fifo_in, |
| 118 | load_medium_reg_in, |
| 119 | sel_fifo_mreg_in, |
| 120 | sel_conf_fifo_in, |
| 121 | load_to_pciw_fifo_in, |
| 122 | load_to_conf_in, |
| 123 | same_read_out, |
| 124 | |
| 125 | norm_access_to_config_out, |
| 126 | read_completed_out, |
| 127 | read_processing_out, |
| 128 | target_abort_out, |
| 129 | disconect_wo_data_out, |
| 130 | disconect_w_data_out, |
| 131 | pciw_fifo_full_out, |
| 132 | pcir_fifo_data_err_out, |
| 133 | wbw_fifo_empty_out, |
| 134 | wbu_del_read_comp_pending_out, |
| 135 | |
| 136 | // Delayed synchronizacion module signals |
| 137 | req_out, |
| 138 | done_out, |
| 139 | in_progress_out, |
| 140 | req_req_pending_in, |
| 141 | req_comp_pending_in, |
| 142 | addr_out, |
| 143 | be_out, |
| 144 | we_out, |
| 145 | bc_out, |
| 146 | burst_ok_out, |
| 147 | strd_addr_in, |
| 148 | strd_bc_in, |
| 149 | status_in, |
| 150 | comp_flush_in, |
| 151 | |
| 152 | // FIFO signals |
| 153 | pcir_fifo_renable_out, |
| 154 | pcir_fifo_data_in, |
| 155 | pcir_fifo_be_in, |
| 156 | pcir_fifo_control_in, |
| 157 | pcir_fifo_flush_out, |
| 158 | pcir_fifo_almost_empty_in, |
| 159 | pcir_fifo_empty_in, |
| 160 | pciw_fifo_wenable_out, |
| 161 | pciw_fifo_addr_data_out, |
| 162 | pciw_fifo_cbe_out, |
| 163 | pciw_fifo_control_out, |
| 164 | pciw_fifo_three_left_in, |
| 165 | pciw_fifo_two_left_in, |
| 166 | pciw_fifo_almost_full_in, |
| 167 | pciw_fifo_full_in, |
| 168 | wbw_fifo_empty_in, |
| 169 | wbu_del_read_comp_pending_in, |
| 170 | |
| 171 | // Configuration space signals |
| 172 | conf_addr_out, |
| 173 | conf_data_out, |
| 174 | conf_data_in, |
| 175 | conf_be_out, |
| 176 | conf_we_out, |
| 177 | conf_re_out, |
| 178 | mem_enable_in, |
| 179 | io_enable_in, |
| 180 | mem_io_addr_space0_in, |
| 181 | mem_io_addr_space1_in, |
| 182 | mem_io_addr_space2_in, |
| 183 | mem_io_addr_space3_in, |
| 184 | mem_io_addr_space4_in, |
| 185 | mem_io_addr_space5_in, |
| 186 | pre_fetch_en0_in, |
| 187 | pre_fetch_en1_in, |
| 188 | pre_fetch_en2_in, |
| 189 | pre_fetch_en3_in, |
| 190 | pre_fetch_en4_in, |
| 191 | pre_fetch_en5_in, |
| 192 | pci_base_addr0_in, |
| 193 | pci_base_addr1_in, |
| 194 | pci_base_addr2_in, |
| 195 | pci_base_addr3_in, |
| 196 | pci_base_addr4_in, |
| 197 | pci_base_addr5_in, |
| 198 | pci_addr_mask0_in, |
| 199 | pci_addr_mask1_in, |
| 200 | pci_addr_mask2_in, |
| 201 | pci_addr_mask3_in, |
| 202 | pci_addr_mask4_in, |
| 203 | pci_addr_mask5_in, |
| 204 | pci_tran_addr0_in, |
| 205 | pci_tran_addr1_in, |
| 206 | pci_tran_addr2_in, |
| 207 | pci_tran_addr3_in, |
| 208 | pci_tran_addr4_in, |
| 209 | pci_tran_addr5_in, |
| 210 | addr_tran_en0_in, |
| 211 | addr_tran_en1_in, |
| 212 | addr_tran_en2_in, |
| 213 | addr_tran_en3_in, |
| 214 | addr_tran_en4_in, |
| 215 | addr_tran_en5_in |
| 216 | ) ; |
| 217 | |
| 218 | `ifdef HOST |
| 219 | `ifdef NO_CNF_IMAGE |
| 220 | parameter pci_ba0_width = `PCI_NUM_OF_DEC_ADDR_LINES ; |
| 221 | `else |
| 222 | parameter pci_ba0_width = 20 ; |
| 223 | `endif |
| 224 | `endif |
| 225 | |
| 226 | `ifdef GUEST |
| 227 | parameter pci_ba0_width = 20 ; |
| 228 | `endif |
| 229 | |
| 230 | parameter pci_ba1_5_width = `PCI_NUM_OF_DEC_ADDR_LINES ; |
| 231 | |
| 232 | /*================================================================================================================== |
| 233 | System inputs. |
| 234 | ==================================================================================================================*/ |
| 235 | // PCI side clock and reset |
| 236 | input clk_in, |
| 237 | reset_in ; |
| 238 | |
| 239 | |
| 240 | /*================================================================================================================== |
| 241 | Side of the PCI Target state machine |
| 242 | ==================================================================================================================*/ |
| 243 | // Data, byte enables, bus commands and address ports |
| 244 | input [31:0] address_in ; // current request address input - registered |
| 245 | output addr_claim_out ; // current request address claim output |
| 246 | input [3:0] bc_in ; // current request bus command input - registered |
| 247 | input bc0_in ; // current cycle RW signal |
| 248 | output [31:0] data_out ; // for read operations - current dataphase data output |
| 249 | input [31:0] data_in ; // for write operations - current request data input - registered |
| 250 | input [3:0] be_in ; // current dataphase byte enable inputs - registered |
| 251 | input [3:0] next_be_in ; // next dataphase byte enable inputs - NOT registered |
| 252 | // Port connection control signals from PCI FSM |
| 253 | input req_in ; // Read is requested to WB master from PCI side |
| 254 | input rdy_in ; // DATA / ADDRESS selection from PCI side when read or write - registered |
| 255 | input addr_phase_in ; // Indicates address phase and also fast-back-to-back address phase - registered |
| 256 | input bckp_devsel_in ; // DEVSEL input (which is registered) equivalent |
| 257 | input bckp_trdy_in ; // TRDY input (which is registered) equivalent |
| 258 | input bckp_stop_in ; // STOP input (which is registered) equivalent |
| 259 | input last_reg_in ; // Indicates last data phase - registered |
| 260 | input frame_reg_in ; // FRAME input signal - registered |
| 261 | input fetch_pcir_fifo_in ;// Read enable for PCIR_FIFO when when read is finishen on WB side |
| 262 | input load_medium_reg_in ;// Load data from PCIR_FIFO to medium register (first data must be prepared on time) |
| 263 | input sel_fifo_mreg_in ; // Read data selection between PCIR_FIFO and medium register |
| 264 | input sel_conf_fifo_in ; // Read data selection between Configuration registers and "FIFO" |
| 265 | input load_to_pciw_fifo_in ;// Write enable to PCIW_FIFO |
| 266 | input load_to_conf_in ; // Write enable to Configuration space registers |
| 267 | |
| 268 | |
| 269 | /*================================================================================================================== |
| 270 | Status outputs to PCI side (FSM) |
| 271 | ==================================================================================================================*/ |
| 272 | output same_read_out ; // Indicates the same read request (important when read is finished on WB side) |
| 273 | output norm_access_to_config_out ; // Indicates the access to Configuration space with MEMORY commands |
| 274 | output read_completed_out ; // Indicates that read request is completed on WB side |
| 275 | output read_processing_out ; // Indicates that read request is processing on WB side |
| 276 | output target_abort_out ; // Indicates target abort termination |
| 277 | output disconect_wo_data_out ; // Indicates disconnect without data termination |
| 278 | output disconect_w_data_out ; // Indicates disconnect with data termination |
| 279 | output pciw_fifo_full_out ; // Indicates that write PCIW_FIFO is full |
| 280 | output pcir_fifo_data_err_out ; // Indicates data error on current data read from PCIR_FIFO |
| 281 | output wbw_fifo_empty_out ; // Indicates that WB SLAVE has no data to be written to PCI bus |
| 282 | output wbu_del_read_comp_pending_out ; // Indicates that WB Unit has a delayed read poending! |
| 283 | |
| 284 | /*================================================================================================================== |
| 285 | Read request interface through Delayed sinchronization module to WB Master |
| 286 | ==================================================================================================================*/ |
| 287 | // request, completion, done and progress indicator outputs for delayed_sync module where they are synchronized |
| 288 | output req_out, // request qualifier - when 1 it indicates that valid data is provided on outputs |
| 289 | done_out, // done output - when 1 indicates that PCI Target has completed a cycle on its bus |
| 290 | in_progress_out ; // out progress indicator - indicates that current completion is in progress on |
| 291 | // PCI Target side |
| 292 | // pending indication inputs - PCI Target side must know about requests and completions |
| 293 | input req_req_pending_in ; // request pending input for PCI Target side |
| 294 | input req_comp_pending_in ; // completion pending input for PCI Target side - it indicates when completion |
| 295 | // is ready for completing on PCI Target bus |
| 296 | // various data outputs - PCI Target sets address, bus command, byte enables, write enable and burst |
| 297 | output [31:0] addr_out ; // address bus output |
| 298 | output [3:0] be_out ; // byte enable output |
| 299 | output we_out ; // write enable output - read/write request indication 1 = write request / 0 = read request |
| 300 | output [3:0] bc_out ; // bus command output |
| 301 | output burst_ok_out ; // pre-fetch enable & burst read - qualifies pre-fetch for access to current image space |
| 302 | |
| 303 | // completion side signals encoded termination status - 0 = normal completion / 1 = error terminated completion |
| 304 | input [31:0] strd_addr_in ; // Stored requested read access address |
| 305 | input [3:0] strd_bc_in ; // Stored requested read access bus command |
| 306 | input status_in ; // Error status reported - NOT USED because FIFO control bits determin data error status |
| 307 | input comp_flush_in ; // If completition counter (2^16 clk periods) has expired, PCIR_FIFO must flush data |
| 308 | |
| 309 | |
| 310 | /*================================================================================================================== |
| 311 | PCIR_PCIW_FIFO signals from pci side |
| 312 | ==================================================================================================================*/ |
| 313 | // PCIR_FIFO control signals used for fetching data from PCIR_FIFO |
| 314 | output pcir_fifo_renable_out ; // read enable output to PCIR_FIFO |
| 315 | input [31:0] pcir_fifo_data_in ; // data input from PCIR_FIFO |
| 316 | input [3:0] pcir_fifo_be_in ; // byte enable input from PCIR_FIFO |
| 317 | input [3:0] pcir_fifo_control_in ; // control signals input from PCIR_FIFO |
| 318 | output pcir_fifo_flush_out ; // flush PCIR_FIFO |
| 319 | input pcir_fifo_almost_empty_in ; // almost empty indicator from PCIR_FIFO |
| 320 | input pcir_fifo_empty_in ; // empty indicator |
| 321 | |
| 322 | // PCIW_FIFO control signals used for sinking data into PCIW_FIFO and status monitoring |
| 323 | output pciw_fifo_wenable_out ; // write enable output to PCIW_FIFO |
| 324 | wire pciw_fifo_wenable ; // not registered we |
| 325 | output [31:0] pciw_fifo_addr_data_out ; // address / data output signals to PCIW_FIFO |
| 326 | output [3:0] pciw_fifo_cbe_out ; // command / byte enable signals to PCIW_FIFO |
| 327 | output [3:0] pciw_fifo_control_out ; // control signals to PCIW_FIFO |
| 328 | input pciw_fifo_three_left_in ; // three data spaces left in PCIW_FIFO |
| 329 | input pciw_fifo_two_left_in ; // two data spaces left in PCIW_FIFO |
| 330 | input pciw_fifo_almost_full_in ; // almost full indicator from PCIW_FIFO |
| 331 | input pciw_fifo_full_in ; // full indicator from PCIW_FIFO |
| 332 | |
| 333 | // WBW_FIFO empy control signal used when delayed read is complete in PCIR_FIFO |
| 334 | input wbw_fifo_empty_in ; // empty indicator from WBW_FIFO |
| 335 | input wbu_del_read_comp_pending_in ; // delayed read pending indicator from WB Unit |
| 336 | |
| 337 | |
| 338 | /*================================================================================================================== |
| 339 | Configuration space signals - from and to registers |
| 340 | ==================================================================================================================*/ |
| 341 | // BUS for reading and writing to configuration space registers |
| 342 | output [11:0] conf_addr_out ; // address to configuration space when there is access to it |
| 343 | output [31:0] conf_data_out ; // data to configuration space - for writing to registers |
| 344 | input [31:0] conf_data_in ; // data from configuration space - for reading from registers |
| 345 | output [3:0] conf_be_out ; // byte enables used for correct writing to configuration space |
| 346 | output conf_we_out ; // write enable control signal - 1 for writing / 0 for nothing |
| 347 | output conf_re_out ; // read enable control signal - 1 for reading / 0 for nothing |
| 348 | |
| 349 | // Inputs for image control registers |
| 350 | input mem_enable_in ; // allowed access to memory mapped image |
| 351 | input io_enable_in ; // allowed access to io mapped image |
| 352 | |
| 353 | // Inputs needed for determining if image is assigned to memory or io space with pre-fetch and address translation |
| 354 | input mem_io_addr_space0_in ; // bit-0 in pci_base_addr0 register |
| 355 | input mem_io_addr_space1_in ; // bit-0 in pci_base_addr1 register |
| 356 | input mem_io_addr_space2_in ; // bit-0 in pci_base_addr2 register |
| 357 | input mem_io_addr_space3_in ; // bit-0 in pci_base_addr3 register |
| 358 | input mem_io_addr_space4_in ; // bit-0 in pci_base_addr4 register |
| 359 | input mem_io_addr_space5_in ; // bit-0 in pci_base_addr5 register |
| 360 | input pre_fetch_en0_in ; // bit-1 in pci_image_ctr0 register |
| 361 | input pre_fetch_en1_in ; // bit-1 in pci_image_ctr1 register |
| 362 | input pre_fetch_en2_in ; // bit-1 in pci_image_ctr2 register |
| 363 | input pre_fetch_en3_in ; // bit-1 in pci_image_ctr3 register |
| 364 | input pre_fetch_en4_in ; // bit-1 in pci_image_ctr4 register |
| 365 | input pre_fetch_en5_in ; // bit-1 in pci_image_ctr5 register |
| 366 | |
| 367 | // Input from image registers - register values needed for decoder to work properly |
| 368 | input [pci_ba0_width - 1:0] pci_base_addr0_in ; // base address from base address register |
| 369 | input [pci_ba1_5_width - 1:0] pci_base_addr1_in ; // base address from base address register |
| 370 | input [pci_ba1_5_width - 1:0] pci_base_addr2_in ; // base address from base address register |
| 371 | input [pci_ba1_5_width - 1:0] pci_base_addr3_in ; // base address from base address register |
| 372 | input [pci_ba1_5_width - 1:0] pci_base_addr4_in ; // base address from base address register |
| 373 | input [pci_ba1_5_width - 1:0] pci_base_addr5_in ; // base address from base address register |
| 374 | input [pci_ba1_5_width - 1:0] pci_addr_mask0_in ; // masking of base address from address mask register |
| 375 | input [pci_ba1_5_width - 1:0] pci_addr_mask1_in ; // masking of base address from address mask register |
| 376 | input [pci_ba1_5_width - 1:0] pci_addr_mask2_in ; // masking of base address from address mask register |
| 377 | input [pci_ba1_5_width - 1:0] pci_addr_mask3_in ; // masking of base address from address mask register |
| 378 | input [pci_ba1_5_width - 1:0] pci_addr_mask4_in ; // masking of base address from address mask register |
| 379 | input [pci_ba1_5_width - 1:0] pci_addr_mask5_in ; // masking of base address from address mask register |
| 380 | input [pci_ba1_5_width - 1:0] pci_tran_addr0_in ; // translation address from address translation register |
| 381 | input [pci_ba1_5_width - 1:0] pci_tran_addr1_in ; // translation address from address translation register |
| 382 | input [pci_ba1_5_width - 1:0] pci_tran_addr2_in ; // translation address from address translation register |
| 383 | input [pci_ba1_5_width - 1:0] pci_tran_addr3_in ; // translation address from address translation register |
| 384 | input [pci_ba1_5_width - 1:0] pci_tran_addr4_in ; // translation address from address translation register |
| 385 | input [pci_ba1_5_width - 1:0] pci_tran_addr5_in ; // translation address from address translation register |
| 386 | |
| 387 | input addr_tran_en0_in ; // address translation enable bit |
| 388 | input addr_tran_en1_in ; // address translation enable bit |
| 389 | input addr_tran_en2_in ; // address translation enable bit |
| 390 | input addr_tran_en3_in ; // address translation enable bit |
| 391 | input addr_tran_en4_in ; // address translation enable bit |
| 392 | input addr_tran_en5_in ; // address translation enable bit |
| 393 | |
| 394 | /*================================================================================================================== |
| 395 | END of input / output PORT DEFINITONS !!! |
| 396 | ==================================================================================================================*/ |
| 397 | |
| 398 | // address output from address multiplexer |
| 399 | reg [31:0] address ; |
| 400 | // prefetch enable for access to selected image space |
| 401 | reg pre_fetch_en ; |
| 402 | |
| 403 | // Input addresses and image hits from address decoders - addresses are multiplexed to address |
| 404 | `ifdef HOST |
| 405 | `ifdef NO_CNF_IMAGE |
| 406 | `ifdef PCI_IMAGE0 // if PCI bridge is HOST and IMAGE0 is assigned as general image space |
| 407 | wire hit0_in ; |
| 408 | wire [31:0] address0_in ; |
| 409 | wire pre_fetch_en0 = pre_fetch_en0_in ; |
| 410 | `else |
| 411 | wire hit0_in = 1'b0 ; |
| 412 | wire [31:0] address0_in = 32'h0 ; |
| 413 | wire pre_fetch_en0 = 1'b0 ; |
| 414 | `endif |
| 415 | `else |
| 416 | wire hit0_in ; |
| 417 | wire [31:0] address0_in ; |
| 418 | wire pre_fetch_en0 = pre_fetch_en0_in ; |
| 419 | `endif |
| 420 | `else // GUEST |
| 421 | wire hit0_in ; |
| 422 | wire [31:0] address0_in ; |
| 423 | wire pre_fetch_en0 = pre_fetch_en0_in ; |
| 424 | `endif |
| 425 | |
| 426 | wire hit1_in ; |
| 427 | wire [31:0] address1_in ; |
| 428 | wire pre_fetch_en1 = pre_fetch_en1_in ; |
| 429 | |
| 430 | `ifdef PCI_IMAGE2 |
| 431 | wire hit2_in ; |
| 432 | wire [31:0] address2_in ; |
| 433 | wire pre_fetch_en2 = pre_fetch_en2_in ; |
| 434 | `else |
| 435 | wire hit2_in = 1'b0 ; |
| 436 | wire [31:0] address2_in = 32'h0 ; |
| 437 | wire pre_fetch_en2 = 1'b0 ; |
| 438 | `endif |
| 439 | |
| 440 | `ifdef PCI_IMAGE3 |
| 441 | wire hit3_in ; |
| 442 | wire [31:0] address3_in ; |
| 443 | wire pre_fetch_en3 = pre_fetch_en3_in ; |
| 444 | `else |
| 445 | wire hit3_in = 1'b0 ; |
| 446 | wire [31:0] address3_in = 32'h0 ; |
| 447 | wire pre_fetch_en3 = 1'b0 ; |
| 448 | `endif |
| 449 | |
| 450 | `ifdef PCI_IMAGE4 |
| 451 | wire hit4_in ; |
| 452 | wire [31:0] address4_in ; |
| 453 | wire pre_fetch_en4 = pre_fetch_en4_in ; |
| 454 | `else |
| 455 | wire hit4_in = 1'b0 ; |
| 456 | wire [31:0] address4_in = 32'h0 ; |
| 457 | wire pre_fetch_en4 = 1'b0 ; |
| 458 | `endif |
| 459 | |
| 460 | `ifdef PCI_IMAGE5 |
| 461 | wire hit5_in ; |
| 462 | wire [31:0] address5_in ; |
| 463 | wire pre_fetch_en5 = pre_fetch_en5_in ; |
| 464 | `else |
| 465 | wire hit5_in = 1'b0 ; |
| 466 | wire [31:0] address5_in = 32'h0 ; |
| 467 | wire pre_fetch_en5 = 1'b0 ; |
| 468 | `endif |
| 469 | |
| 470 | // Include address decoders |
| 471 | `ifdef HOST |
| 472 | `ifdef NO_CNF_IMAGE |
| 473 | `ifdef PCI_IMAGE0 // if PCI bridge is HOST and IMAGE0 is assigned as general image space |
| 474 | pci_pci_decoder #(pci_ba0_width) decoder0 |
| 475 | (.hit (hit0_in), |
| 476 | .addr_out (address0_in), |
| 477 | .addr_in (address_in), |
| 478 | .bc_in (bc_in), |
| 479 | .base_addr (pci_base_addr0_in), |
| 480 | .mask_addr (pci_addr_mask0_in), |
| 481 | .tran_addr (pci_tran_addr0_in), |
| 482 | .at_en (addr_tran_en0_in), |
| 483 | .mem_io_space (mem_io_addr_space0_in), |
| 484 | .mem_en (mem_enable_in), |
| 485 | .io_en (io_enable_in) |
| 486 | ) ; |
| 487 | `endif |
| 488 | `else |
| 489 | pci_pci_decoder #(pci_ba0_width) decoder0 |
| 490 | (.hit (hit0_in), |
| 491 | .addr_out (address0_in), |
| 492 | .addr_in (address_in), |
| 493 | .bc_in (bc_in), |
| 494 | .base_addr (pci_base_addr0_in), |
| 495 | .mask_addr ({pci_ba0_width{1'b1}}), |
| 496 | .tran_addr ({pci_ba0_width{1'b0}}), |
| 497 | .at_en (1'b0), |
| 498 | .mem_io_space (1'b0), |
| 499 | .mem_en (mem_enable_in), |
| 500 | .io_en (1'b0) |
| 501 | ) ; |
| 502 | `endif |
| 503 | `else // GUEST |
| 504 | pci_pci_decoder #(pci_ba0_width) decoder0 |
| 505 | (.hit (hit0_in), |
| 506 | .addr_out (address0_in), |
| 507 | .addr_in (address_in), |
| 508 | .bc_in (bc_in), |
| 509 | .base_addr (pci_base_addr0_in), |
| 510 | .mask_addr ({pci_ba0_width{1'b1}}), |
| 511 | .tran_addr ({pci_ba0_width{1'b0}}), |
| 512 | .at_en (1'b0), |
| 513 | .mem_io_space (1'b0), |
| 514 | .mem_en (mem_enable_in), |
| 515 | .io_en (1'b0) |
| 516 | ) ; |
| 517 | `endif |
| 518 | pci_pci_decoder #(`PCI_NUM_OF_DEC_ADDR_LINES) decoder1 |
| 519 | (.hit (hit1_in), |
| 520 | .addr_out (address1_in), |
| 521 | .addr_in (address_in), |
| 522 | .bc_in (bc_in), |
| 523 | .base_addr (pci_base_addr1_in), |
| 524 | .mask_addr (pci_addr_mask1_in), |
| 525 | .tran_addr (pci_tran_addr1_in), |
| 526 | .at_en (addr_tran_en1_in), |
| 527 | .mem_io_space (mem_io_addr_space1_in), |
| 528 | .mem_en (mem_enable_in), |
| 529 | .io_en (io_enable_in) |
| 530 | ) ; |
| 531 | `ifdef PCI_IMAGE2 |
| 532 | pci_pci_decoder #(`PCI_NUM_OF_DEC_ADDR_LINES) decoder2 |
| 533 | (.hit (hit2_in), |
| 534 | .addr_out (address2_in), |
| 535 | .addr_in (address_in), |
| 536 | .bc_in (bc_in), |
| 537 | .base_addr (pci_base_addr2_in), |
| 538 | .mask_addr (pci_addr_mask2_in), |
| 539 | .tran_addr (pci_tran_addr2_in), |
| 540 | .at_en (addr_tran_en2_in), |
| 541 | .mem_io_space (mem_io_addr_space2_in), |
| 542 | .mem_en (mem_enable_in), |
| 543 | .io_en (io_enable_in) |
| 544 | ) ; |
| 545 | `endif |
| 546 | `ifdef PCI_IMAGE3 |
| 547 | pci_pci_decoder #(`PCI_NUM_OF_DEC_ADDR_LINES) decoder3 |
| 548 | (.hit (hit3_in), |
| 549 | .addr_out (address3_in), |
| 550 | .addr_in (address_in), |
| 551 | .bc_in (bc_in), |
| 552 | .base_addr (pci_base_addr3_in), |
| 553 | .mask_addr (pci_addr_mask3_in), |
| 554 | .tran_addr (pci_tran_addr3_in), |
| 555 | .at_en (addr_tran_en3_in), |
| 556 | .mem_io_space (mem_io_addr_space3_in), |
| 557 | .mem_en (mem_enable_in), |
| 558 | .io_en (io_enable_in) |
| 559 | ) ; |
| 560 | `endif |
| 561 | `ifdef PCI_IMAGE4 |
| 562 | pci_pci_decoder #(`PCI_NUM_OF_DEC_ADDR_LINES) decoder4 |
| 563 | (.hit (hit4_in), |
| 564 | .addr_out (address4_in), |
| 565 | .addr_in (address_in), |
| 566 | .bc_in (bc_in), |
| 567 | .base_addr (pci_base_addr4_in), |
| 568 | .mask_addr (pci_addr_mask4_in), |
| 569 | .tran_addr (pci_tran_addr4_in), |
| 570 | .at_en (addr_tran_en4_in), |
| 571 | .mem_io_space (mem_io_addr_space4_in), |
| 572 | .mem_en (mem_enable_in), |
| 573 | .io_en (io_enable_in) |
| 574 | ) ; |
| 575 | `endif |
| 576 | `ifdef PCI_IMAGE5 |
| 577 | pci_pci_decoder #(`PCI_NUM_OF_DEC_ADDR_LINES) decoder5 |
| 578 | (.hit (hit5_in), |
| 579 | .addr_out (address5_in), |
| 580 | .addr_in (address_in), |
| 581 | .bc_in (bc_in), |
| 582 | .base_addr (pci_base_addr5_in), |
| 583 | .mask_addr (pci_addr_mask5_in), |
| 584 | .tran_addr (pci_tran_addr5_in), |
| 585 | .at_en (addr_tran_en5_in), |
| 586 | .mem_io_space (mem_io_addr_space5_in), |
| 587 | .mem_en (mem_enable_in), |
| 588 | .io_en (io_enable_in) |
| 589 | ) ; |
| 590 | `endif |
| 591 | |
| 592 | // Internal signals for image hit determination |
| 593 | reg addr_claim ;// address claim signal is asinchronous set for addr_claim_out signal to PCI Target SM |
| 594 | |
| 595 | // Determining if image 0 is assigned to configuration space or as normal pci to wb access! |
| 596 | // if normal access is allowed to configuration space, then hit0 is hit0_conf |
| 597 | `ifdef HOST |
| 598 | `ifdef NO_CNF_IMAGE |
| 599 | parameter hit0_conf = 1'b0 ; |
| 600 | `else |
| 601 | parameter hit0_conf = 1'b1 ; // if normal access is allowed to configuration space, then hit0 is hit0_conf |
| 602 | `endif |
| 603 | `else // GUEST |
| 604 | parameter hit0_conf = 1'b1 ; // if normal access is allowed to configuration space, then hit0 is hit0_conf |
| 605 | `endif |
| 606 | |
| 607 | // Logic with address mux, determining if address is still in the same image space and if it is prefetced or not |
| 608 | always@(hit5_in or hit4_in or hit3_in or hit2_in or hit1_in or hit0_in or |
| 609 | address5_in or address4_in or address3_in or address2_in or address1_in or address0_in or |
| 610 | pre_fetch_en5 or |
| 611 | pre_fetch_en4 or |
| 612 | pre_fetch_en3 or |
| 613 | pre_fetch_en2 or |
| 614 | pre_fetch_en1 or |
| 615 | pre_fetch_en0 |
| 616 | ) |
| 617 | begin |
| 618 | addr_claim <= (hit5_in || hit4_in) || (hit3_in || hit2_in || hit1_in || hit0_in) ; |
| 619 | case ({hit5_in, hit4_in, hit3_in, hit2_in, hit0_in}) |
| 620 | 5'b10000 : |
| 621 | begin |
| 622 | address <= address5_in ; |
| 623 | pre_fetch_en <= pre_fetch_en5 ; |
| 624 | end |
| 625 | 5'b01000 : |
| 626 | begin |
| 627 | address <= address4_in ; |
| 628 | pre_fetch_en <= pre_fetch_en4 ; |
| 629 | end |
| 630 | 5'b00100 : |
| 631 | begin |
| 632 | address <= address3_in ; |
| 633 | pre_fetch_en <= pre_fetch_en3 ; |
| 634 | end |
| 635 | 5'b00010 : |
| 636 | begin |
| 637 | address <= address2_in ; |
| 638 | pre_fetch_en <= pre_fetch_en2 ; |
| 639 | end |
| 640 | 5'b00001 : |
| 641 | begin |
| 642 | address <= address0_in ; |
| 643 | pre_fetch_en <= pre_fetch_en0 ; |
| 644 | end |
| 645 | default : // IMAGE 1 is always included into PCI bridge |
| 646 | begin |
| 647 | address <= address1_in ; |
| 648 | pre_fetch_en <= pre_fetch_en1 ; |
| 649 | end |
| 650 | endcase |
| 651 | end |
| 652 | |
| 653 | // Address claim output to PCI Target SM |
| 654 | assign addr_claim_out = addr_claim ; |
| 655 | |
| 656 | reg [31:0] norm_address ; // stored normal address (decoded and translated) for access to WB |
| 657 | reg norm_prf_en ; // stored pre-fetch enable |
| 658 | reg [3:0] norm_bc ; // stored bus-command |
| 659 | reg same_read_reg ; // stored SAME_READ information |
| 660 | reg target_rd ; // delayed registered TRDY output equivalent signal |
| 661 | |
| 662 | always@(posedge clk_in or posedge reset_in) |
| 663 | begin |
| 664 | if (reset_in) |
| 665 | begin |
| 666 | norm_address <= #`FF_DELAY 32'h0000_0000 ; |
| 667 | norm_prf_en <= #`FF_DELAY 1'b0 ; |
| 668 | norm_bc <= #`FF_DELAY 4'h0 ; |
| 669 | same_read_reg <= #`FF_DELAY 1'b0 ; |
| 670 | end |
| 671 | else |
| 672 | begin |
| 673 | if (addr_phase_in) |
| 674 | begin |
| 675 | norm_address <= #`FF_DELAY address ; |
| 676 | norm_prf_en <= #`FF_DELAY pre_fetch_en ; |
| 677 | norm_bc <= #`FF_DELAY bc_in ; |
| 678 | same_read_reg <= #`FF_DELAY same_read_out ; |
| 679 | end |
| 680 | end |
| 681 | end |
| 682 | |
| 683 | `ifdef HOST |
| 684 | `ifdef NO_CNF_IMAGE |
| 685 | reg [1:0] strd_address ; // stored INPUT address for accessing Configuration space registers |
| 686 | `else |
| 687 | reg [11:0] strd_address ; // stored INPUT address for accessing Configuration space registers |
| 688 | `endif |
| 689 | `else |
| 690 | reg [11:0] strd_address ; // stored INPUT address for accessing Configuration space registers |
| 691 | `endif |
| 692 | always@(posedge clk_in or posedge reset_in) |
| 693 | begin |
| 694 | if (reset_in) |
| 695 | begin |
| 696 | strd_address <= #`FF_DELAY 0 ; |
| 697 | end |
| 698 | else |
| 699 | begin |
| 700 | if (addr_phase_in) |
| 701 | begin |
| 702 | `ifdef HOST |
| 703 | `ifdef NO_CNF_IMAGE |
| 704 | strd_address <= #`FF_DELAY address_in[1:0] ; |
| 705 | `else |
| 706 | strd_address <= #`FF_DELAY address_in[11:0] ; |
| 707 | `endif |
| 708 | `else |
| 709 | strd_address <= #`FF_DELAY address_in[11:0] ; |
| 710 | `endif |
| 711 | end |
| 712 | end |
| 713 | end |
| 714 | |
| 715 | always@(posedge clk_in or posedge reset_in) |
| 716 | begin |
| 717 | if (reset_in) |
| 718 | begin |
| 719 | target_rd <= #`FF_DELAY 1'b0 ; |
| 720 | end |
| 721 | else |
| 722 | begin |
| 723 | if (same_read_reg && !bckp_trdy_in) |
| 724 | target_rd <= #`FF_DELAY 1'b1 ;// Signal indicates when target ready is deaserted on PCI bus |
| 725 | else if (same_read_reg && bckp_devsel_in && !bckp_stop_in) |
| 726 | target_rd <= #`FF_DELAY 1'b1 ;// Signal indicates when target ready is deaserted on PCI bus |
| 727 | else if ((!same_read_reg) || (last_reg_in && target_rd)) |
| 728 | target_rd <= #`FF_DELAY 1'b0 ;// Signal indicates when target ready is deaserted on PCI bus |
| 729 | end |
| 730 | end |
| 731 | // '1' indicates asserted TRDY signal when same read operation is performed |
| 732 | wire target_rd_completed = target_rd ; |
| 733 | |
| 734 | reg same_read_request ; |
| 735 | |
| 736 | // When delayed read is completed on WB, addres and bc must be compered, if there is the same read request |
| 737 | always@(address or strd_addr_in or bc_in or strd_bc_in) |
| 738 | begin |
| 739 | if ((address == strd_addr_in) & (bc_in == strd_bc_in)) |
| 740 | same_read_request <= 1'b1 ; |
| 741 | else |
| 742 | same_read_request <= 1'b0 ; |
| 743 | end |
| 744 | |
| 745 | assign same_read_out = (same_read_request) ; // && ~pcir_fifo_empty_in) ; |
| 746 | |
| 747 | // Signals for byte enable checking |
| 748 | reg addr_burst_ok ; |
| 749 | reg io_be_ok ; |
| 750 | |
| 751 | // Byte enable checking for IO, MEMORY and CONFIGURATION spaces - be_in is active low! |
| 752 | always@(strd_address or be_in) |
| 753 | begin |
| 754 | case (strd_address[1:0]) |
| 755 | 2'b11 : |
| 756 | begin |
| 757 | addr_burst_ok <= 1'b0 ; |
| 758 | io_be_ok <= (be_in[2] && be_in[1] && be_in[0]) ; // only be3 can be active |
| 759 | end |
| 760 | 2'b10 : |
| 761 | begin |
| 762 | addr_burst_ok <= 1'b0 ; |
| 763 | io_be_ok <= (~be_in[2] && be_in[1] && be_in[0]) || (be_in[3] && be_in[2] && be_in[1] && be_in[0]) ; |
| 764 | end |
| 765 | 2'b01 : |
| 766 | begin |
| 767 | addr_burst_ok <= 1'b0 ; |
| 768 | io_be_ok <= (~be_in[1] && be_in[0]) || (be_in[3] && be_in[2] && be_in[1] && be_in[0]) ; |
| 769 | end |
| 770 | default : // 2'b00 |
| 771 | begin |
| 772 | addr_burst_ok <= 1'b1 ; |
| 773 | io_be_ok <= (~be_in[0]) || (be_in[3] && be_in[2] && be_in[1] && be_in[0]) ; |
| 774 | end |
| 775 | endcase |
| 776 | end |
| 777 | |
| 778 | wire calc_target_abort = (norm_bc[3:1] == `BC_IO_RW) ? !io_be_ok : 1'b0 ; |
| 779 | |
| 780 | wire [3:0] pcir_fifo_control_input = pcir_fifo_empty_in ? 4'h0 : pcir_fifo_control_in ; |
| 781 | |
| 782 | // Medium registers for data and control busses from PCIR_FIFO |
| 783 | reg [31:0] pcir_fifo_data_reg ; |
| 784 | reg [3:0] pcir_fifo_ctrl_reg ; |
| 785 | |
| 786 | always@(posedge clk_in or posedge reset_in) |
| 787 | begin |
| 788 | if (reset_in) |
| 789 | begin |
| 790 | pcir_fifo_data_reg <= #`FF_DELAY 32'h0000_0000 ; |
| 791 | pcir_fifo_ctrl_reg <= #`FF_DELAY 4'h0 ; |
| 792 | end |
| 793 | else |
| 794 | begin |
| 795 | if (load_medium_reg_in) |
| 796 | begin |
| 797 | pcir_fifo_data_reg <= #`FF_DELAY pcir_fifo_data_in ; |
| 798 | pcir_fifo_ctrl_reg <= #`FF_DELAY pcir_fifo_control_input ; |
| 799 | end |
| 800 | end |
| 801 | end |
| 802 | |
| 803 | // when disconnect is signalled, the next data written to fifo will be the last |
| 804 | // also when this happens, disconnect must stay asserted until last data is written to the fifo |
| 805 | reg keep_desconnect_wo_data_set ; |
| 806 | |
| 807 | // selecting "fifo data" from medium registers or from PCIR_FIFO |
| 808 | wire [31:0] pcir_fifo_data = (sel_fifo_mreg_in && !pcir_fifo_empty_in) ? pcir_fifo_data_in : pcir_fifo_data_reg ; |
| 809 | wire [3:0] pcir_fifo_ctrl = (sel_fifo_mreg_in && !pcir_fifo_empty_in) ? pcir_fifo_control_input : pcir_fifo_ctrl_reg ; |
| 810 | |
| 811 | // signal assignments to PCI Target FSM |
| 812 | assign read_completed_out = req_comp_pending_in ; // completion pending input for requesting side of the bridge |
| 813 | assign read_processing_out = req_req_pending_in ; // request pending input for requesting side |
| 814 | // when '1', the bus command is IO command - not supported commands are checked in pci_decoder modules |
| 815 | wire io_memory_bus_command = !norm_bc[3] && !norm_bc[2] ; |
| 816 | assign disconect_wo_data_out = ( |
| 817 | ((/*pcir_fifo_ctrl[`LAST_CTRL_BIT] ||*/ pcir_fifo_empty_in || ~burst_ok_out/*addr_burst_ok*/ || io_memory_bus_command) && |
| 818 | ~bc0_in && ~frame_reg_in) || |
| 819 | ((pciw_fifo_full_in || pciw_fifo_almost_full_in || keep_desconnect_wo_data_set || pciw_fifo_two_left_in || |
| 820 | (pciw_fifo_three_left_in && pciw_fifo_wenable) || ~addr_burst_ok || io_memory_bus_command) && |
| 821 | bc0_in && ~frame_reg_in) |
| 822 | ) ; |
| 823 | assign disconect_w_data_out = ( |
| 824 | ( burst_ok_out && !io_memory_bus_command && ~bc0_in ) || |
| 825 | ( addr_burst_ok && !io_memory_bus_command && bc0_in ) |
| 826 | ) ; |
| 827 | assign target_abort_out = ( ~addr_phase_in && calc_target_abort ) ; |
| 828 | |
| 829 | `ifdef HOST |
| 830 | `ifdef NO_CNF_IMAGE |
| 831 | // signal assignments to PCI Target FSM |
| 832 | assign norm_access_to_config_out = 1'b0 ; |
| 833 | // control signal assignments to read request sinchronization module |
| 834 | assign done_out = (target_rd_completed && last_reg_in) ; |
| 835 | assign in_progress_out = (same_read_reg && ~bckp_trdy_in) ; |
| 836 | // signal used for PCIR_FIFO flush (with comp_flush_in signal) |
| 837 | wire pcir_fifo_flush = (target_rd_completed && last_reg_in && ~pcir_fifo_empty_in) ; |
| 838 | `else |
| 839 | // signal assignments to PCI Target FSM |
| 840 | assign norm_access_to_config_out = (hit0_in && hit0_conf) ; |
| 841 | // control signal assignments to read request sinchronization module |
| 842 | assign done_out = (~sel_conf_fifo_in && target_rd_completed && last_reg_in) ; |
| 843 | assign in_progress_out = (~sel_conf_fifo_in && same_read_reg && ~bckp_trdy_in) ; |
| 844 | // signal used for PCIR_FIFO flush (with comp_flush_in signal) |
| 845 | wire pcir_fifo_flush = (~sel_conf_fifo_in && target_rd_completed && last_reg_in && ~pcir_fifo_empty_in) ; |
| 846 | `endif |
| 847 | `else |
| 848 | // signal assignments to PCI Target FSM |
| 849 | assign norm_access_to_config_out = (hit0_in && hit0_conf) ; |
| 850 | // control signal assignments to read request sinchronization module |
| 851 | assign done_out = (~sel_conf_fifo_in && target_rd_completed && last_reg_in) ; |
| 852 | assign in_progress_out = (~sel_conf_fifo_in && same_read_reg && ~bckp_trdy_in) ; |
| 853 | // signal used for PCIR_FIFO flush (with comp_flush_in signal) |
| 854 | wire pcir_fifo_flush = (~sel_conf_fifo_in && target_rd_completed && last_reg_in && ~pcir_fifo_empty_in) ; |
| 855 | `endif |
| 856 | |
| 857 | // flush signal for PCIR_FIFO must be registered, since it asinchronously resets some status registers |
| 858 | wire pcir_fifo_flush_reg ; |
| 859 | pci_async_reset_flop async_reset_as_pcir_flush |
| 860 | ( |
| 861 | .data_in (comp_flush_in || pcir_fifo_flush), |
| 862 | .clk_in (clk_in), |
| 863 | .async_reset_data_out (pcir_fifo_flush_reg), |
| 864 | .reset_in (reset_in) |
| 865 | ) ; |
| 866 | |
| 867 | always@(posedge clk_in or posedge reset_in) |
| 868 | begin |
| 869 | if (reset_in) |
| 870 | keep_desconnect_wo_data_set <= #1 1'b0 ; |
| 871 | else if (keep_desconnect_wo_data_set && pciw_fifo_wenable) |
| 872 | keep_desconnect_wo_data_set <= #1 1'b0 ; |
| 873 | else if (pciw_fifo_wenable && disconect_wo_data_out) |
| 874 | keep_desconnect_wo_data_set <= #1 1'b1 ; |
| 875 | end |
| 876 | |
| 877 | |
| 878 | // signal assignments from fifo to PCI Target FSM |
| 879 | assign wbw_fifo_empty_out = wbw_fifo_empty_in ; |
| 880 | assign wbu_del_read_comp_pending_out = wbu_del_read_comp_pending_in ; |
| 881 | assign pciw_fifo_full_out = (pciw_fifo_full_in || pciw_fifo_almost_full_in || pciw_fifo_two_left_in || pciw_fifo_three_left_in) ; |
| 882 | assign pcir_fifo_data_err_out = pcir_fifo_ctrl[`DATA_ERROR_CTRL_BIT] && !sel_conf_fifo_in ; |
| 883 | // signal assignments to PCIR FIFO fifo |
| 884 | assign pcir_fifo_flush_out = pcir_fifo_flush_reg ; |
| 885 | assign pcir_fifo_renable_out = fetch_pcir_fifo_in && !pcir_fifo_empty_in ; |
| 886 | |
| 887 | // signal assignments to PCIW FIFO |
| 888 | reg pciw_fifo_wenable_out; |
| 889 | assign pciw_fifo_wenable = load_to_pciw_fifo_in ; |
| 890 | reg [3:0] pciw_fifo_control_out; |
| 891 | reg [31:0] pciw_fifo_addr_data_out; |
| 892 | reg [3:0] pciw_fifo_cbe_out; |
| 893 | always@(posedge clk_in or posedge reset_in) |
| 894 | begin |
| 895 | if (reset_in) |
| 896 | begin |
| 897 | pciw_fifo_wenable_out <= #1 1'b0; |
| 898 | pciw_fifo_control_out <= #1 4'h0; |
| 899 | // data and address outputs assignments to PCIW_FIFO - correction of 2 LSBits |
| 900 | pciw_fifo_addr_data_out <= #1 32'h0; |
| 901 | pciw_fifo_cbe_out <= #1 4'h0; |
| 902 | end |
| 903 | else |
| 904 | begin |
| 905 | pciw_fifo_wenable_out <= #1 load_to_pciw_fifo_in ; |
| 906 | pciw_fifo_control_out[`ADDR_CTRL_BIT] <= #1 ~rdy_in ; |
| 907 | pciw_fifo_control_out[`BURST_BIT] <= #1 rdy_in ? ~frame_reg_in : 1'b0 ; |
| 908 | // if '1' then next burst BE is not equat to current one => burst will be chopped into single transfers |
| 909 | pciw_fifo_control_out[`DATA_ERROR_CTRL_BIT] <= #1 rdy_in && (next_be_in != be_in) && ~bckp_trdy_in; // valid comp. |
| 910 | pciw_fifo_control_out[`LAST_CTRL_BIT] <= #1 rdy_in && (frame_reg_in || (bckp_trdy_in && ~bckp_stop_in)); |
| 911 | // data and address outputs assignments to PCIW_FIFO - correction of 2 LSBits |
| 912 | pciw_fifo_addr_data_out <= #1 rdy_in ? data_in : {norm_address[31:2], |
| 913 | norm_address[1] && io_memory_bus_command, |
| 914 | norm_address[0] && io_memory_bus_command} ; |
| 915 | pciw_fifo_cbe_out <= #1 rdy_in ? be_in : norm_bc ; |
| 916 | end |
| 917 | end |
| 918 | |
| 919 | `ifdef HOST |
| 920 | `ifdef NO_CNF_IMAGE |
| 921 | // data and address outputs assignments to PCI Target FSM |
| 922 | assign data_out = pcir_fifo_data ; |
| 923 | `else |
| 924 | // data and address outputs assignments to PCI Target FSM |
| 925 | assign data_out = sel_conf_fifo_in ? conf_data_in : pcir_fifo_data ; |
| 926 | `endif |
| 927 | `else |
| 928 | // data and address outputs assignments to PCI Target FSM |
| 929 | assign data_out = sel_conf_fifo_in ? conf_data_in : pcir_fifo_data ; |
| 930 | `endif |
| 931 | |
| 932 | // data and address outputs assignments to read request sinchronization module |
| 933 | assign req_out = req_in ; |
| 934 | // this address is stored in delayed_sync module and is connected back as strd_addr_in |
| 935 | assign addr_out = norm_address[31:0] ; // correction of 2 LSBits is done in wb_master module, original address must be saved |
| 936 | assign be_out = be_in ; |
| 937 | assign we_out = 1'b0 ; |
| 938 | assign bc_out = norm_bc ; |
| 939 | // burst is OK for reads when there is ((MEM_READ_LN or MEM_READ_MUL) and AD[1:0]==2'b00) OR |
| 940 | // (MEM_READ and Prefetchable_IMAGE and AD[1:0]==2'b00) |
| 941 | assign burst_ok_out = (norm_bc[3] && addr_burst_ok) || (norm_bc[2] && norm_prf_en && addr_burst_ok) ; |
| 942 | // data and address outputs assignments to Configuration space |
| 943 | `ifdef HOST |
| 944 | `ifdef NO_CNF_IMAGE |
| 945 | assign conf_data_out = 32'h0 ; |
| 946 | assign conf_addr_out = 12'h0 ; |
| 947 | assign conf_be_out = 4'b0 ; |
| 948 | assign conf_we_out = 1'h0 ; |
| 949 | `else |
| 950 | assign conf_data_out = data_in ; |
| 951 | assign conf_addr_out = strd_address[11:0] ; |
| 952 | assign conf_be_out = be_in ; |
| 953 | assign conf_we_out = load_to_conf_in ; |
| 954 | `endif |
| 955 | `else |
| 956 | assign conf_data_out = data_in ; |
| 957 | assign conf_addr_out = strd_address[11:0] ; |
| 958 | assign conf_be_out = be_in ; |
| 959 | assign conf_we_out = load_to_conf_in ; |
| 960 | `endif |
| 961 | // NOT USED NOW, SONCE READ IS ASYNCHRONOUS |
| 962 | //assign conf_re_out = fetch_conf_in ; |
| 963 | assign conf_re_out = 1'b0 ; |
| 964 | |
| 965 | endmodule |