L- and H-Tile Avalon® Streaming and Single Root I/O Virtualization (SR-IOV) Intel® FPGA IP for PCI Express* User Guide
9.3.3. Configuration of Root Port and Endpoint
Before you issue transactions to the Endpoint, you must configure the Root Port and Endpoint Configuration Space registers.
The ebfm_cfg_rp_ep procedure executes the following steps to initialize the Configuration Space:
- Sets the Root Port Configuration Space to enable the Root Port to send transactions on the PCI Express link.
 - Sets the Root Port and Endpoint PCI Express Capability Device Control registers as follows: 
    
- Disables Error Reporting in both the Root Port and Endpoint. The BFM does not have error handling capability.
 - Enables Relaxed Ordering in both Root Port and Endpoint.
 - Enables Extended Tags for the Endpoint if the Endpoint has that capability.
 - Disables Phantom Functions, Aux Power PM, and No Snoop in both the Root Port and Endpoint.
 - Sets the Max Payload Size to the value that the Endpoint supports because the Root Port supports the maximum payload size.
 - Sets the Root Port Max Read Request Size to 4 KB because the example Endpoint design supports breaking the read into as many completions as necessary.
 - Sets the Endpoint Max Read Request Size equal to the Max Payload Size because the Root Port does not support breaking the read request into multiple completions.
 
 - Assigns values to all the Endpoint BAR registers. The BAR addresses are assigned by the algorithm outlined below. 
    
- I/O BARs are assigned smallest to largest starting just above the ending address of BFM shared memory in I/O space and continuing as needed throughout a full 32-bit I/O space.
 - The 32-bit non-prefetchable memory BARs are assigned smallest to largest, starting just above the ending address of BFM shared memory in memory space and continuing as needed throughout a full 32-bit memory space.
 - The value of the addr_map_4GB_limit input to the ebfm_cfg_rp_ep procedure controls the assignment of the 32-bit prefetchable and 64-bit prefetchable memory BARS. The default value of the addr_map_4GB_limit is 0. 
If the addr_map_4GB_limit input to the ebfm_cfg_rp_ep procedure is set to 0, then the ebfm_cfg_rp_ep procedure assigns the 32‑bit prefetchable memory BARs largest to smallest, starting at the top of 32-bit memory space and continuing as needed down to the ending address of the last 32-bit non-prefetchable BAR.
However, if the addr_map_4GB_limit input is set to 1, the address map is limited to 4 GB. The ebfm_cfg_rp_ep procedure assigns 32-bit and 64-bit prefetchable memory BARs largest to smallest, starting at the top of the 32-bit memory space and continuing as needed down to the ending address of the last 32-bit non-prefetchable BAR.
 - If the addr_map_4GB_limit input to the ebfm_cfg_rp_ep procedure is set to 0, then the ebfm_cfg_rp_ep procedure assigns the 64-bit prefetchable memory BARs smallest to largest starting at the 4 GB address assigning memory ascending above the 4 GB limit throughout the full 64-bit memory space. 
If the addr_map_4 GB_limit input to the ebfm_cfg_rp_ep procedure is set to 1, the ebfm_cfg_rp_ep procedure assigns the 32-bit and the 64-bit prefetchable memory BARs largest to smallest starting at the 4 GB address and assigning memory by descending below the 4 GB address to memory addresses as needed down to the ending address of the last 32-bit non-prefetchable BAR.
The above algorithm cannot always assign values to all BARs when there are a few very large (1 GB or greater) 32-bit BARs. Although assigning addresses to all BARs may be possible, a more complex algorithm would be required to effectively assign these addresses. However, such a configuration is unlikely to be useful in real systems. If the procedure is unable to assign the BARs, it displays an error message and stops the simulation.
 
 - Based on the above BAR assignments, the ebfm_cfg_rp_ep procedure assigns the Root Port Configuration Space address windows to encompass the valid BAR address ranges.
 - The ebfm_cfg_rp_ep procedure enables master transactions, memory address decoding, and I/O address decoding in the Endpoint PCIe* control register.
 
The ebfm_cfg_rp_ep procedure also sets up a bar_table data structure in BFM shared memory that lists the sizes and assigned addresses of all Endpoint BARs. This area of BFM shared memory is write-protected. Consequently, any application logic write accesses to this area cause a fatal simulation error.
BFM procedure calls to generate full PCIe* addresses for read and write requests to particular offsets from a BAR use this data structure. This procedure allows the testbench code that accesses the Endpoint application logic to use offsets from a BAR and avoid tracking specific addresses assigned to the BAR. The following table shows how to use those offsets.
|   Offset (Bytes)  |  
        Description  |  
     
|---|---|
|   +0  |  
        PCI Express address in BAR0  |  
     
|   +4  |  
        PCI Express address in BAR1  |  
     
|   +8  |  
        PCI Express address in BAR2  |  
     
|   +12  |  
        PCI Express address in BAR3  |  
     
|   +16  |  
        PCI Express address in BAR4  |  
     
|   +20  |  
        PCI Express address in BAR5  |  
     
|   +24  |  
        PCI Express address in Expansion ROM BAR  |  
     
|   +28  |  
        Reserved  |  
     
|   +32  |  
        BAR0 read back value after being written with all 1’s (used to compute size)  |  
     
|   +36  |  
        BAR1 read back value after being written with all 1’s  |  
     
|   +40  |  
        BAR2 read back value after being written with all 1’s  |  
     
|   +44  |  
        BAR3 read back value after being written with all 1’s  |  
     
|   +48  |  
        BAR4 read back value after being written with all 1’s  |  
     
|   +52  |  
        BAR5 read back value after being written with all 1’s  |  
     
|   +56  |  
        Expansion ROM BAR read back value after being written with all 1’s  |  
     
|   +60  |  
        Reserved  |  
     
The configuration routine does not configure any advanced PCI Express capabilities such as the AER capability.
Besides the ebfm_cfg_rp_ep procedure in altpcietb_bfm_rp_gen3_x8.sv, routines to read and write Endpoint Configuration Space registers directly are available in the Verilog HDL include file. After the ebfm_cfg_rp_ep procedure runs the PCI Express I/O and Memory Spaces have the layout shown in the following three figures. The memory space layout depends on the value of the addr_map_4GB_limit input parameter. The following figure shows the resulting memory space map when the addr_map_4GB_limit is 1.
The following figure shows the resulting memory space map when the addr_map_4GB_limit is 0.
The following figure shows the I/O address space.