本文作者:AMD 工程师 Padmini Boreddy,文章来源:AMD Xilinx开发者社区
一文看懂 AMD Vivado™ 2024.1 中 “AMD Versal™ CPM5 QDMA Gen4x8 ST Only Performance Design” CED 示例。
本篇博文演示了在AMD Vivado Design Suite 2024.1 中生成CPM5_QDMA_Gen4x8_ST_Only_Performance_Design
并使用为 QDMA 提供的驱动程序来运行性能测试的步骤。这是 AMD Versal 自适应 SoC CPM QDMA 端点 (EP) 设计中可用的预设之一。
对于 PL PCIe IP,用户可以使用“Open Example Design”选项来生成示例设计。
此示例设计对于 CPM5 PCIe 不适用;因此改为通过 AMD CED Store GitHub 仓库提供示例设计。如需了解有关 AMD CED Store 的更多详细信息,请访问以下链接:https://github.com/Xilinx/XilinxCEDStore
注释:性能数据取决于硬件和软件(系统调谐、使用的队列数量等)。如果所得到的性能数据与您的预期不符,请联系您的销售代表或 AMD 技术支持。
生成 Versal 自适应 SoC CPM5 Gen4x8 QDMA 端点设计
步骤 1:启动 Vivado,然后转至“Tools -> Vivado Store”。
步骤 2:下载最新版本的目录:
选择“Example Designs-> PCIe -> Versal CPM QDMA EP Design”,然后单击“Update”。
步骤 3:从“Quick Start”页面中选择“Open Example Project”。
步骤 4:如下截屏所示,访问 Versal CPM QDMA 端点设计:
步骤 5:根据所选开发板会自动选择“CPM_Config”,针对 VCK190 会选中 CPM4,针对 VPK120 则选中 CPM5。选择 Versal VPK120 评估平台。
步骤 6:对于 CPM5_Preset,请选择
CPM5_QDMA_Gen4x8_ST_Only_Performance_Design。
这是含“Streaming”选项的 Versal CPM5 Gen4x8 QDMA 端点设计。其中已启用 4PF、240VF 和 SRIOV。
步骤 7:复查“Project Summary”,确认所选部件和产品家族正确。
示例设计架构
在其他正常工作的示例设计中,用户逻辑功能要求在用户逻辑专用寄存器中配置包数、包长度和队列 ID,并且需要通过配置特定寄存器来触发包生成。
如需了解更多详情,请参阅本文:运行 Versal 自适应 SoC CPM5 PCIE Gen4x8 QDMA CED 示例设计 :
https://adaptivesupport.amd.com/s/article/000034687?language=zh_CN
ST 性能参考设计包含仅限 AXI4-Stream 的包生成器(适用于 C2H 方向),以及同时适用于 C2H 方向和 H2C 方向的性能测量工具。当存在可用描述符时,该参考设计会生成已知的数据模式(时间戳),并在 C2H 方向上发送用户指定的包长度。此数据模式可由 dma-perf 应用环回到 H2C 方向,并进行性能测量。
以下截屏显示了 CED 的“Sources”层级。cpm_pcie_qdma_ep_wrapper 模块框图包括 cpm_pcie_bridge_ep 块、用于 AXI4-Stream 模式生成器和检查器逻辑的用户控制逻辑,以及实现 C2H 和 H2C 性能计数器逻辑的 axi_st_module。
以下是“cpm_pcie_qdma_ep.bd”的模块框图:
CPM5 配置
生成的 Versal CPM5 QDMA Gen4x8 ST Only Performance Design 配置如下:
Gen4x8 DMA 模式
PCIE 控制器 1 配置为含 AXI4-Stream 接口的 QDMA
启用 4PF、240VF 和 SRIOV
内部模式
注释:在此 CED 的 2023.2 及更低版本中,VF 的地址映射存在已知问题。
这在 2024.1 版中已得到修复。如果使用 2023.2 或更低版本,需要使用下图所示的数值更新“PCIe : BARs”选项卡和“SRIOV VF BARs”选项卡,以便在 VF 器件上执行 C2H 和 H2C 传输事务。









PS PMC 配置


硬件测试
更新 CPM5 IP 配置(如上所述)后,保存设计,然后单击“Generate Device Image”。
将 VPK120 评估板连接到主机 PC。
使用 CED 生成的 PDI 文件对 FPGA 进行烧录。
重新启动主机 PC。
使用“lspci”命令检查端点器件检测情况。
QDMA 驱动程序安装

运行以下命令。如需了解更多详情,请参阅:
https://xilinx.github.io/dma_ip_drivers/master/QDMA/linux-kernel/html/bu...

使用 dma-ctl 列出系统中可用的功能,请参阅:
https://xilinx.github.io/dma_ip_drivers/master/QDMA/linux-kernel/html/dm...
dma-ctl dev list

SOLUTIPF 上的传输事务
队列分配


为 C2H 串流模式测试添加和启动队列
如需了解更多信息,请参阅:
https://xilinx.github.io/dma_ip_drivers/master/QDMA/linux-kernel/html/dm...
https://xilinx.github.io/dma_ip_drivers/master/QDMA/linux-kernel/html/dm...


运行不同传输大小的串流模式 C2H(从设备发出 DMA )测试
如需了解更多信息,请参阅:
https://xilinx.github.io/dma_ip_drivers/master/QDMA/linux-kernel/html/dm...
与 CPM QDMA 端点功能测试设计不同,用户无需配置任何寄存器即可初始化数据传输。CED 的 `user_control` 模块会在内部产生报文。

为 H2C 串流模式测试添加和启动队列
如需了解更多信息,请参阅:
https://xilinx.github.io/dma_ip_drivers/master/QDMA/linux-kernel/html/dmactl.html#add-a-queue
https://xilinx.github.io/dma_ip_drivers/master/QDMA/linux-kernel/html/dmactl.html#start-a-queue 

运行不同传输大小的串流模式 H2C(DMA 到设备)测试
如需了解更多信息,请参阅 :
https://xilinx.github.io/dma_ip_drivers/master/QDMA/linux-kernel/html/dma_to_device.html

运行 dma-perf 应用
“dma-perf”是一款定制工具,用于收集单向和双向流量的性能指标。
可使用“fio”等标准 I/O 工具,通过字符设备接口执行 I/O 操作。但是,大多数工具仅限于每次发送或接收 1 个包,并等待该包处理完成,因此无法使驱动程序或硬件保持足够繁忙以进行性能测量。尽管 fio 也支持异步接口,但它不会在并行轮询完成的同时持续提交 I/O 请求。
“dma-perf”工具会利用 libaio 库提供的异步功能。通过使用 libaio,应用程序可向驱动程序提交 I/O 请求,驱动程序会立即将控制权返回给调用方(即,非阻塞)。完成通知是单独发送的,因此应用程序随后即可轮询完成情况,并在收到完成通知后释放缓冲区。
如需了解有关 dma-perf 工具的更多信息,请参阅 QDMA Linux 内核参考驱动程序用户指南,本指南托管于:
https://xilinx.github.io/dma_ip_drivers/master/QDMA/linux-kernel/html/dmaperf.html
用于串流模式测试的 dma-perf 配置文件包含在 Linux 参考内核驱动程序源文件内,这些源文件托管于 https://github.com/Xilinx/dma_ip_drivers 的 QDMA/linux-kernel/apps/dma-perf/dmaperf_config 目录下:
C2H 单向:st-c2h-pfetch1.zip
H2C 单向:st-h2c.zip
C2H 和 H2C 双向:st-bi.zip
测试用例 - 1:bi_st_1_1_pfetch-cmptsz1_4096.txt
作为 dma-perf 工具输入的配置文件为测试设置了以下标志:
队列的模式和方向 - 串流,双向
PCI 总线:61,器件 - 00,功能 - 0 (PF),每个方向单个队列 (q_range) - 0 : 0
包数 - 64,每个包大小 - 4096 字节

使用以下命令搭配 bi_st_1_1_pfetch-cmptsz1_4096.txt 配置执行 dma-perf 测试:

qdma-perf 工具负责:
以 H2C 方向的 idx 0 添加和启动 1 个队列
以 C2H 方向的 idx 0 添加和启动 1 个队列
C2H 和 H2C 数据传输
停止并删除已添加的 C2H 和 H2C 队列
收集并显示写入 (H2C) 和读取 (C2H) 性能结果
测试用例 - 2:bi_st_1_4_pfetch-cmptsz1_4096.txt
作为 dma-perf 工具输入的配置文件为测试设置了以下标志:
队列的模式和方向 - 串流,双向
PCI 总线:61,器件 - 00,功能 - 0 (PF),每个方向 4 个队列 (q_range) - 0 : 3
包数 - 64,每个包大小 - 4096 字节

使用以下命令搭配 bi_st_1_4_pfetch-cmptsz1_4096.txt 配置执行 dma-perf 测试:

qdma-perf 工具负责:
以 H2C 方向的 idx 0-3 添加和启动 4 个队列
以 C2H 方向的 idx 0-3 添加和启动 4 个队列
C2H 和 H2C 数据传输
停止并删除已添加的 C2H 和 H2C 队列
收集并显示写入 (H2C) 和读取 (C2H) 性能结果
VF 上的传输事务
启用 VF 器件
以下命令显示了为 1 个 PF 器件 (BDF: 61:00.0) 启用 2 个 VF 的操作:

以下命令列出了这些 PF 器件和 VF 器件:


lspci 命令列出了启用的 PF 器件和 VF 器件,如下所示:

预留 VF 的队列

“dma-ctl dev list”给出了预留的队列的数量。
如需了解更多信息,请参阅:
https://xilinx.github.io/dma_ip_drivers/master/QDMA/linux-kernel/html/us...

在 VF 上添加和启动双向队列以执行 C2H 和 H2C 串流模式测试


运行包大小为 64 字节的 C2H 和 H2C 测试

在 VF 器件上运行 dma-perf 应用
作为 dma-perf 工具输入的配置文件 vf_bi_st_1_1_pfetch-cmptsz1_4096.txt 为测试设置了以下标志:
队列的模式和方向 - 串流,双向
PCI 总线:61,器件 - 02,功能 - 0 (VF),每个方向单个队列 (q_range) - 0 : 0
vf_perf = 1
包数 - 64,每个包大小 - 4096 字节

使用以下命令搭配 vf_bi_st_1_1_pfetch-cmptsz1_4096.txt 配置执行 dma-perf 测试:

qdma-perf 工具负责:
以 H2C 方向的 idx 0 添加和启动 1 个队列
以 C2H 方向的 idx 0 添加和启动 1 个队列
C2H 和 H2C 数据传输
停止并删除已添加的 C2H 和 H2C 队列
收集并显示写入 (H2C) 和读取 (C2H) 性能结果