仅对英特尔可见 — GUID: nik1410565009980
Ixiasoft
仅对英特尔可见 — GUID: nik1410565009980
Ixiasoft
9.3.3. 根端口和端点的配置(Configuration of Root Port and Endpoint )
在发出传输(transaction)到Endpoint之前,必须配置Root Port和Endpoint Configuration Space寄存器。
ebfm_cfg_rp_ep执行下面步骤来初始化Configuration Space:
- 设置Root Port Configuration Space以使Root Port在PCI Express链路上发送传输(transaction)。
- 按如下设置Root Port 和Endpoint PCI Express Capability Device Control寄存器:
- 在Root Port以及Endpoint中禁用Error Reporting 。BFM不具备错误处理能力。
- 在Root Port以及Endpoint中使能Relaxed Ordering。
- 对Endpoint使能Extended Tags,如果Endpoint具备此功能。
- 在Root Port以及Endpoint中禁用Phantom Functions,Aux Power PM和No Snoop。
- 将Max Payload Size设置成Endpoint支持的值,因为Root Port支持最大有效负载。
- 将Root Port Max Read Request Size设置成4 KB,因为实例Endpoint设计支持将读取拆分成所需任意数量的completion。
- 将Endpoint Max Read Request Size设置成等于Max Payload Size的值,因为Root Port不支持将读请求拆分成多个completion。
- 对所有的Endpoint BAR寄存器分配值。下面的算法用于分配BAR地址。
- 从刚高于I/O空间中的BFM共享存储器的结束地址开始,从最小值到最大值分配I/O BAR,如果需要,在整个32-bit I/O空间继续分配。
- 从刚高于存储器空间中的BFM共享存储器的结束地址开始,从最小值到最大值分配32-bit非预可取(non-prefetchable)的存储器BAR,如果需要,在整个32-bit I/O空间继续分配。
- ebfm_cfg_rp_ep的addr_map_4GB_limit输入的值控制32-bit和64-bit预可取的存储器BARS的分配。addr_map_4GB_limit的默认值0。
如果ebfm_cfg_rp_ep的addr_map_4GB_limit输入的值设置为0,那么ebfm_cfg_rp_ep过程(procedure)从 32-bit存储空间的顶层开始,从最大值到最小值分配32-bit预可取的存储器BAR,并且按需要继续分配到最后32-bit非预可取BAR的结束地址。
然而,如果addr_map_4GB_limit输入设置成1,那么地址映射被限制为4 GB。ebfm_cfg_rp_ep从最大值到最小值分配32-bit和64-bit预可取的存储器BAR,并且按需要继续分配到最后32-bit非预可取BAR的结束地址。
- 如果ebfm_cfg_rp_ep的addr_map_4GB_limit输入值设置为0,那么ebfm_cfg_rp_ep过程(procedure)从整个64-bit存储空间中4 GB地址分配存储器(超越4 GB限制),从最小值到最大值分配64-bit预可取存储器BAR。
如果ebfm_cfg_rp_ep的addr_map_4 GB_limit输入值设置为1,那么ebfm_cfg_rp_ep过程(procedure)从4 GB地址分配存储器开始,从最大值到最小值分配32-bit和64-bit预可取的存储器BAR,并且根据需要将低于4 GB地址降到32-bit非预可取BAR的结束地址。
以上算法不能用于一些非常大的(1 GB或以上)32-bit BAR。虽然可以对所有的BAR分配地址,但可能需要更复杂的算法有效地分配这些地址。然而在实际的系统中,这样的配置是无用的。如果过程(procedure)不能分配BAR,那么它会显示一条错误信息并停止仿真。
- 根据以上BAR分配,ebfm_cfg_rp_ep过程(procedure)分配Root Port Configuration Space地址窗口以包含有效的BAR地址范围。
- ebfm_cfg_rp_ep过程(procedure)使能Endpoint PCIe* 控制寄存器中的主传输,存储器地址解码和I/O地址解码。
ebfm_cfg_rp_ep过程(procedure)也在BFM共享存储器中建立bar_table数据结构,此数据结构列出所有端点BAR的大小和分配地址。BFM共享存储器中的该区域是写保护的。因此,任何对此区域的应用逻辑写访问都会导致致命的仿真错误。
BFM过程(procedure)调用生成完整的 PCIe* 地址,用于BAR的特定偏移的读取和写入请求。此过程允许访问Endpoint应用逻辑的测试台代码使用BAR中的偏移,并避免跟踪分配给BAR的特定地址。下表显示了如何使用这些偏移。
Offset (字节) |
说明 |
---|---|
+0 |
BAR0中的PCI Express地址 |
+4 |
BAR1中的PCI Express地址 |
+8 |
BAR2中的PCI Express地址 |
+12 |
BAR3中的PCI Express地址 |
+16 |
BAR4中的PCI Express地址 |
+20 |
BAR5中的PCI Express地址 |
+24 |
Expansion ROM BAR中的PCI Express地址 |
+28 |
保留 |
+32 |
用全部1写入后的BAR0读回值(用于计算大小) |
+36 |
用全部1写入后的BAR1读回值 |
+40 |
用全部1写入后的BAR2读回值 |
+44 |
用全部1写入后的BAR3读回值 |
+48 |
用全部1写入后的BAR4读回值 |
+52 |
用全部1写入后的BAR5读回值 |
+56 |
用全部1写入后的Expansion ROM BAR读回值 |
+60 |
保留 |
配置例行程序不配置任何高级PCI Express功能,例如AER功能。
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.
下图显示了addr_map_4GB_limit为0时的存储器空间映射。
下图显示了I/O地址空间。