使用 PS on x86 执行嵌入式处理器仿真 - 2023.2 简体中文

Vitis 统一软件平台文档 应用加速开发 (UG1393)

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 简体中文

在 QEMU 环境下为嵌入式处理器运行仿真属于计算密集型操作,需要额外的设置和配置。您必须使用 arm-gcc 对嵌入式应用进行交叉编译、创建 SD 卡镜像,在 QEMU 环境下启动 Linux,然后运行应用。“PS on x86”(x86 上的 PS)功能特性支持您在 x86 处理器上对嵌入式系统设计进行仿真,并能大幅简化此项操作。该功能特性要求您使用 gccg++ 编译器的 x86 版本来编译 PS 应用,并构建 .xclbin 文件,此文件将在仿真平台上用于运行 emconfigutil 所创建的软件仿真。

重要: PS on x86 编译仅对软件仿真有效,并且需要 GCC 8.3 或更高版本。该功能特性还要求安装 XRT 的 x86 版本,如 安装 Xilinx Runtime 和平台 中所述。此外,对于 AI 引擎设计,您必须启用 --package.defer_aie_run 选项,如以下配置文件示例中所示。

使用“PS on x86”构建和运行软件仿真的进程如下所述:

  1. 使用标准 gcc 编译器替代 Arm 交叉编译器来编译 PS 应用。欲知详情,请参阅 为 x86 执行编译和链接
  2. 使用标准 v++ 命令编译和链接器件二进制文件 (.xclbin),如 构建器件二进制文件 中所述。
  3. 对于 PS on x86 流程,v++ --package 命令会将用于仿真的处理器告知该工具 (--package.emu_ps)。

    对于 AMD Versal™ 平台,还需要将 v++ --link 命令所生成的 .xsa 文件转换为 .xclbin 文件。基于 AMD Zynq™ UltraScale+™ MPSoC 的平台则无需执行此步骤。

  4. emconfigutil 实用工具 可用于为软件仿真创建 emconfig.json 文件 。
    emconfigutil --platform xilinx_zcu102_base_202220_1
  5. XCL_EMULATION_MODE 环境变量设为 sw_emu 即可使用软件仿真模式。
    重要: 如不正确设置 XCL_EMULATION_MODE 环境变量,仿真目标将不会运行。
  6. 运行应用。例如:
    ./host.exe kernel.xclbin

以下提供了 emconfigutil 命令和 v++ --package 命令的示例。使用 emconfigutil 创建仿真所需虚拟平台,使用 v++ --package 创建用于仿真的系统。

emconfigutil --platform $PLATFORM_REPO_PATHS/xilinx_vck190_base_202310_1/xilinx_vck190_base_202310_1.xpfm --nd 1

随后,

v++ -p -t sw_emu \
    --package.defer_aie_run \
    --platform $PLATFORM_REPO_PATHS/xilinx_vck190_base_202310_1/xilinx_vck190_base_202310_1.xpfm \
    --package.sd_dir $PLATFORM_REPO_PATHS/sw/versal/xrt \
    --package.out_dir ./package.sw_emu \
    --package.ps_on_x86 \
    --package.sd_file ./emconfig.json \
    ../tutorial.xsa ../libadf.a

使用以下命令运行软件仿真:

setenv XCL_EMULATION_MODE sw_emu
./host_ps_on_x86 a.xclbin

下表描述了构建 PS 应用和器件二进制文件 (.xclbin) 以在 QEMU 下运行软件仿真与运行 PS on x86 之间的差异。

表 1. 为 PS on X86 运行软件仿真
工艺 在 QEMU 下运行 SW_EMU 采用 PS on X86 的 SW_EMU
主机编译

需使用 arm-gcc 进行交叉编译,并且需要 SYSROOT 定义以及嵌入式包含文件和库文件:

aarch64-linux-gnu-g++ -o hello_world \
host.cpp -lxrt_coreutil -pthread \
--sysroot=<path-to-sysroot>​​ \
-I<path-to-sysroot>/usr/include/xrt \
-L<path-to-sysroot>/usr/lib

需要 x86 gcc,并且需要安装 XRT 的 x86 版本:

g++ -o hello_world host.cpp \
-lxrt_coreutil -pthread \
-I$(XILINX_XRT)/include \
-L$(XILINX_XRT)/lib​​
封装

需要创建 SD 卡镜像才能在 QEMU 下运行,指定 QEMU 作为仿真处理器:

v++ -p -t sw_emu $(LINK_XCLBIN) $(LIBADF) \
--platform $(PLATFORM_PATH) \
--package.out_dir ./package.sw_emu \
--package.emu_ps qemu \
--package.rootfs $(EDGE_COMMON_SW)/rootfs.ext4 \
--package.kernel_image $(EDGE_COMMON_SW)/Image \
--package.sd_file xrt.ini \
--package.sd_file ./run_app.sh \
-o vadd.xclbin --package.sd_file ./hello_world

对于 PS on x86 仿真,需使用 --package 命令识别用于仿真的 PS 并生成 .xclbin 文件:

v++ -p $(LINK_OUTPUT) $(VPP_FLAGS)​ \
--package.emu_ps x86 \
--package.defer_aie_run \
--package.out_dir $(PACKAGE_OUT) \
-o $(BUILD_DIR)/kernel.xclbin​
运行仿真

需要使用 launch_emulation shell 脚本来设置 QEMU 并运行仿真:

./launch_sw_emu.sh -run-app \
 $(RUN_APP_SCRIPT) | tee run_app.log;​​

设置仿真模式环境变量并直接启动应用:

XCL_EMULATION_MODE=sw_emu 
./$(EXECUTABLE) $(CMD_ARGS)

您可以在 x86 gcc 中使用 arm-gcc 来编译相同的 PS 代码。但您的 PS 代码中已链接的任意仅限 ARM 的数据类型或库在针对 x86 进行编译时都将无效。如需获取有关使用该功能特性运行软件仿真的示例,请参阅 GitHub 上的 ps_on_x86

提示: 如需了解有关为 PS on x86 编译和运行 AI 引擎应用的更多信息,请参阅 AI 引擎工具和流程用户指南(UG1076)