仅对英特尔可见 — GUID: iim1614130177474
Ixiasoft
仅对英特尔可见 — GUID: iim1614130177474
Ixiasoft
2.4.3. Root Port和Endpoint的配置
在向Endpoint发布事务之前,您必须配置Root Port和Endpoint Configuration Space寄存器。
altpcietb_g3bfm_configure.v中的ebfm_cfg_rp_ep处理过程执行以下步骤来初始化Configuration Space:
- 设置Root Port Configuration Space以使Root Port能够发送PCI Express链路上的事务。
- 设置Root Port和Endpoint PCI Express Capability Device Control寄存器,具体如下:
- 禁用Root Port和Endpoint中的Error Reporting。BFM没有错误处理能力。
- 使能Root Port和Endpoint中的Relaxed Ordering。
- 如果Endpoint具备该能力,则对Endpoint使能Extended Tags。
- 禁用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位I/O空间继续全面分配。
- 在存储空间中从BFM共享存储器的结束地址前开始从最小到最大分配32位非可预取存储BAR,并按需对完整32位存储空间继续全面分配。
- 对ebfm_cfg_rp_ep处理程序的addr_map_4GB_limit输入的值控制32-bit prefetchable和64-bit prefetchable存储器BARS的分配。addr_map_4GB_limit的默认值是0。
如果ebfm_cfg_rp_ep处理程序的addr_map_4GB_limit输入的值设置为0,则ebfm_cfg_rp_ep程序从32位存储空间的顶层开始,从最大值到最小值分配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处理程序会从完整64-bit存储空间的4 GB地址开始,从最小到最大分配64-bit可预取存储器BAR,直到超出4 GB限制。
但是,如果ebfm_cfg_rp_ep处理程序的addr_map_4 GB_limit输入设置为1,则ebfm_cfg_rp_ep处理程序从4 GB地址开始,以小于4 GB地址降序排列,从最大值到最小值分配32-bit和64-bit可预取存储器BAR,并且按需要向下分配到最后32-bit非可预取BAR的结束地址。
以上算法不能用于一些非常大的(1GB或以上)32-bit BAR。虽然可以对所有的BAR分配地址,但是可能需要更复杂的算法才能有效进行地址分配。然而,该配置在实际系统中不太可能有用。如果该处理程序无法分配BAR,就会显示错误信息并停止仿真。
- 根据上述BAR分配,ebfm_cfg_rp_ep处理过程分配Root Port Configuration Space地址窗口以包含有效的BAR地址范围。
- ebfm_cfg_rp_ep处理过程使能Endpoint PCIe* 控制寄存器中的主事务、存储器地址解码和I/O地址解码。
ebfm_cfg_rp_ep处理程序还在BFM共享存储器中建立一个bar_table数据结构,以罗列全部Endpoint BAR的大小和分配的地址。该区域在BFM共享存储器中被写保护。因此,对此区域的应用逻辑写访问会导致致命的仿真错误。
针对BAR特定偏移生成读和写请求的完整 PCIe* 地址的BFM处理 过程调用使用此数据结构。此处理过程允许访问Endpoint应用逻辑的测试台代码使用BAR中的偏移,并避免对分配给BAR的指定地址的追踪。下表显示了如何使用这些偏移。
偏移量(字节) |
描述 |
---|---|
+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 |
保留 |
不仅altpcietb_bfm_rp_gen5_x16.sv中的 ebfm_cfg_rp_ep处理过程,直接读和写Endpoint Configuration Space寄存器的例程也位于Verilog HDL文件中。ebfm_cfg_rp_ep处理过程运行后,PCI Express I/O和Memory Space的布局如以下三个图例所示。存储空间布局取决于addr_map_4GB_limit输入参数的值。