AMD Vivado™ 2024.1 中 “AMD Versal™ CPM5 QDMA Gen4x8 ST Only Performance Design” CED 示例

本文作者: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 传输事务。

11.png

12.png

13.png

14.png

15.png

16.png

17.png

18.png

19.png

PS PMC 配置

20.png

21.png

硬件测试

  • 更新 CPM5 IP 配置(如上所述)后,保存设计,然后单击“Generate Device Image”。

  • 将 VPK120 评估板连接到主机 PC。

  • 使用 CED 生成的 PDI 文件对 FPGA 进行烧录。

  • 重新启动主机 PC。

  • 使用“lspci”命令检查端点器件检测情况。

QDMA 驱动程序安装

22.png

运行以下命令。如需了解更多详情,请参阅:

https://xilinx.github.io/dma_ip_drivers/master/QDMA/linux-kernel/html/bu...

23.png

使用 dma-ctl 列出系统中可用的功能,请参阅:

https://xilinx.github.io/dma_ip_drivers/master/QDMA/linux-kernel/html/dm...

dma-ctl dev list

24.png

SOLUTIPF 上的传输事务

队列分配

25.png

如需了解更多信息,请参阅:
https://xilinx.github.io/dma_ip_drivers/master/QDMA/linux-kernel/html/userguide.html#allocate-the-queues-to-a-function

26.png

为 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...

27.png

28.png

运行不同传输大小的串流模式 C2H(从设备发出 DMA )测试

如需了解更多信息,请参阅:
https://xilinx.github.io/dma_ip_drivers/master/QDMA/linux-kernel/html/dm...

与 CPM QDMA 端点功能测试设计不同,用户无需配置任何寄存器即可初始化数据传输。CED 的 `user_control` 模块会在内部产生报文。

29.png

为 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  30.png

31.png

运行不同传输大小的串流模式 H2C(DMA 到设备)测试

如需了解更多信息,请参阅 :

https://xilinx.github.io/dma_ip_drivers/master/QDMA/linux-kernel/html/dma_to_device.html 

32.png

运行 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 字节

33.png

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

34.png

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 字节

35.png

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

36.png

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 的操作:

37.png

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

38.png

如需了解更多信息,请参阅:
https://xilinx.github.io/dma_ip_drivers/master/QDMA/linux-kernel/html/userguide.html#instantiate-the-virtual-functions

39.png

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

40.png

预留 VF 的队列

41.png

“dma-ctl dev list”给出了预留的队列的数量。

如需了解更多信息,请参阅:
https://xilinx.github.io/dma_ip_drivers/master/QDMA/linux-kernel/html/us...

42.png

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

43.png

44.png

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

45.png

在 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 字节

46.png

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

47.png

qdma-perf 工具负责:

  • 以 H2C 方向的 idx 0 添加和启动 1 个队列

  • 以 C2H 方向的 idx 0 添加和启动 1 个队列

  • C2H 和 H2C 数据传输

  • 停止并删除已添加的 C2H 和 H2C 队列

  • 收集并显示写入 (H2C) 和读取 (C2H) 性能结果