本文演示如何在 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 EP Design。

步骤 5: 根据所选开发板会自动选择 CPM_Config,针对 VCK190 会选中 CPM4,针对 VPK120 则选中 CPM5。此处请选择 Versal VPK120 Evaluation Platform。

步骤 6: 对于 CPM5_Preset,请选择 CPM5 QDMA Gen4x8 ST Only Performance Design。
这是含“Streaming”选项的 Versal CPM5 Gen4x8 QDMA 端点设计,其中已启用 4PF、240VF 和 SRIOV。

步骤 7: 复查 Project Summary,确认所选部件和产品家族正确。

示例设计架构
在其他功能验证示例设计中,用户逻辑通常要求在专用寄存器中配置包数、包长度和队列 ID,并通过配置特定寄存器来触发包生成。如需了解更多详情,请参阅相关文档。
而本文所述的 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 驱动程序安装
运行以下命令安装驱动。如需了解更多详情,请参阅官方驱动程序构建文档。
sudo make clean
sudo make DEBUG=1
sudo make install-apps
sudo make install-mods
sudo modprobe qdma-pf
sudo modprobe qdma-vf
使用 dma-ctl 列出系统中可用的功能:
dma-ctl dev list

PF 上的数据传输
队列分配
首先为物理功能(PF)预留队列。
echo 10 > /sys/bus/pci/devices/0000:61:00.0/qdma/qmax
然后查看队列分配情况:
dma-ctl dev list

为 C2H 流模式测试添加和启动队列
dma-ctl qdma61000 q add idx 0 mode st dir c2h
dma-ctl qdma61000 q start idx 0 mode st dir c2h

运行不同传输大小的流模式 C2H 测试
与普通的 CPM QDMA 端点功能测试设计不同,此性能设计的 user_control 模块会在内部自动产生报文,用户无需配置任何寄存器即可初始化数据传输。
dma-from-device -d /dev/qdma61000-ST-0 -s 64
dma-from-device -d /dev/qdma61000-ST-0 -s 128
dma-from-device -d /dev/qdma61000-ST-0 -s 256
dma-from-device -d /dev/qdma61000-ST-0 -s 512
dma-from-device -d /dev/qdma61000-ST-0 -s 1024
dma-from-device -d /dev/qdma61000-ST-0 -s 4096
为 H2C 流模式测试添加和启动队列
dma-ctl qdma61000 q add idx 1 mode st dir h2c
dma-ctl qdma61000 q start idx 1 mode st dir h2c

运行不同传输大小的流模式 H2C 测试
dma-to-device -d /dev/qdma61000-ST-1 -s 64
dma-to-device -d /dev/qdma61000-ST-1 -s 128
dma-to-device -d /dev/qdma61000-ST-1 -s 256
dma-to-device -d /dev/qdma61000-ST-1 -s 512
dma-to-device -d /dev/qdma61000-ST-1 -s 1024
dma-to-device -d /dev/qdma61000-ST-1 -s 4096
运行 dma-perf 应用
dma-perf 是一款定制工具,用于收集单向和双向流量的性能指标。它利用 libaio 库的异步功能,可以持续提交 I/O 请求并轮询完成状态,从而使驱动和硬件保持繁忙,更适合进行性能测量。
用于流模式测试的 dma-perf 配置文件包含在 Linux 参考内核驱动程序源代码中,位于 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
此配置文件设置了以下测试参数:
- 队列模式和方向:流模式,双向
- PCI 总线:61,设备号:00,功能号:0 (PF),每个方向单个队列 (q_range: 0:0)
- 包数:64,每个包大小:4096 字节

使用以下命令执行测试:
dma-perf -c bi_st_1_1_pfetch-cmptsz1_4096.txt
qdma-perf 工具将自动完成以下操作:
- 添加并启动 H2C 方向 idx 0 的 1 个队列。
- 添加并启动 C2H 方向 idx 0 的 1 个队列。
- 执行 C2H 和 H2C 双向数据传输。
- 停止并删除已添加的队列。
- 收集并显示写入 (H2C) 和读取 (C2H) 的性能结果。
测试用例 2:bi_st_1_4_pfetch-cmptsz1_4096.txt
此配置文件设置了以下测试参数:
- 队列模式和方向:流模式,双向
- PCI 总线:61,设备号:00,功能号:0 (PF),每个方向 4 个队列 (q_range: 0:3)
- 包数:64,每个包大小:4096 字节

使用以下命令执行测试:
dma-perf -c bi_st_1_4_pfetch-cmptsz1_4096.txt
qdma-perf 工具将自动完成以下操作:
- 添加并启动 H2C 方向 idx 0-3 的 4 个队列。
- 添加并启动 C2H 方向 idx 0-3 的 4 个队列。
- 执行 C2H 和 H2C 双向数据传输。
- 停止并删除已添加的队列。
- 收集并显示性能结果。
VF 上的数据传输
启用 VF 设备
以下命令为 1 个 PF 设备 (BDF: 61:00.0) 启用 2 个 VF:
echo 2 > /sys/bus/pci/devices/0000:61:00.0/sriov_numvfs
列出 PF 和 VF 设备:
dma-ctl dev list

lspci 命令也会列出已启用的 PF 和 VF 设备。
为 VF 预留队列
为虚拟功能预留队列。
echo 8 > /sys/bus/pci/devices/0000:61:02.0/qdma/qmax
dma-ctl dev list 命令会显示预留的队列数量。

在 VF 上添加和启动双向队列
dma-ctl qdmavf61020 q add idx 0 mode st dir bi
dma-ctl qdmavf61020 q start idx 0 mode st dir bi

运行包大小为 64 字节的 C2H 和 H2C 测试
C2H: dma-from-device -d /dev/qdma61000-ST-0 -s 64
H2C: dma-to-device -d /dev/qdma61000-ST-0 -s 64
在 VF 设备上运行 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 字节

使用以下命令执行测试:
dma-perf -c vf_bi_st_1_1_pfetch-cmptsz1_4096.txt
工具将自动完成队列管理、双向数据传输、结果收集与显示。
总结
通过以上步骤,我们完成了从 Vivado 2024.1 中生成 CPM5 QDMA 高性能示例设计,到在硬件上进行驱动安装、队列配置以及 PF/VF 模式下的性能测试的全过程。这种集成 AXI4-Stream接口 的性能设计简化了测试流程,方便开发者评估 Versal 器件的 DMA 数据传输能力。
希望这篇详细的实战指南能帮助你快速上手。如果你在配置或测试过程中遇到其他问题,欢迎到 云栈社区 与更多开发者交流探讨。