仅对英特尔可见 — GUID: nik1410565009980
Ixiasoft
仅对英特尔可见 — GUID: nik1410565009980
Ixiasoft
10.4.3. 根端口和端点的配置(Configuration of Root Port and Endpoint )
在向Endpoint发布事务之前,必须配置Root Port和Endpoint Configuration Space寄存器。
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设计支持按需将读请求拆分成多个完成。
- 将Endpoint Max Read Request Size设置成等于Max Payload Size的值,因为Root Port不支持将读请求拆分成多个完成。
- 对所有的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的结束地址。
以上算法不能用于一些非常大的(1 GB或以上)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的指定地址的追踪。下表显示了如何使用这些偏移。
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功能。
除了altpcietb_bfm_rp_gen3_x8.sv中的 ebfm_cfg_rp_ep处理程序,直接读写Endpoint Configuration Space寄存器的例程有Verilog HDL文件可用。ebfm_cfg_rp_ep处理程序运行PCI Express I/O 后,Memory Space的布局如以下三个图例所示。存储空间布局取决于addr_map_4GB_limit输入参数的值。如果addr_map_4GB_limit为1,所得出的存储空间映射如下图所示。
下图显示addr_map_4GB_limit为0时产生的存储器空间映射。
下图显示了I/O地址空间。