本文作者:AMD 工程师 Garce Sun
在 Vitis 流程中,编译的目标分为软件仿真(software emultion),硬件仿真(hardware emulation)以及硬件(hardware)。
软件仿真是通过用户创建的自定义主机代码测试系统的第一步,主要目标是确保主机程序和内核的功能正确性。其中,内核代码始终在本机编译和运行。应用程序代码根据平台的不同,编译方式为:
• 在 x86 处理器上本地编译和运行(数据中心平台)
• 交叉编译到 Arm 处理器并在仿真器中运行(嵌入式平台)
软件仿真通常用于改进算法、调试功能问题,并让开发人员快速迭代代码以进行改进。软件仿真是一个抽象模型,不使用任何 petalinux 驱动程序,如 Zynq OpenCL (ZOCL)、中断控制器或设备树二进制文件 (DTB)。 对于嵌入式平台来说,软件仿真创建 sd_card.img、在完整 QEMU 机器上启动 petalinux 的开销太重。
为了避免这部分开销,提高软件仿真运行效率,我们可以使用 x86 GCC(而不是 ARM-GCC)编译相同的嵌入式应用程序,从而实现在 x86 处理器上跑嵌入式应用程序的软件仿真。对于这种方法,用户不需要提供诸如 sysroot、rootfs 和 sd_card Image 等字段,从而能启用更快的软件仿真。
总的来说,与 QEMU 做软件仿真相比,编译过程中涉及到以下改动:
用户需要在 host 安装 XRT,不需要 Petalinux/SYSROOT。
关于 XRT 的安装指导,请参考 UG1393 的相关章节内容
用 x86 的 GCC 编译器而不是 ARM GCC 来编译 host 代码。
在 2023.1 Vitis 版本中,x86 编译需要 GCC 8.3 或更高版本。
v++ -package 以及启动仿真的流程不尽相同。
下表描述了在 QEMU 下和在 x86 上运行软件仿真时,构建 PS 应用程序和.xclbin 的差异。
对于包含 AIE 的设计,基于上表的选项有所调整,请参考以下表格:
以上对比适用于 Vitis 2023.1,不同版本的命令行选项可能会有改动。
比如,2022.1 里的 v++ package 选项--package.ps_on_x86 在新版本替换成了—package.emu_ps x86/qemu。
对于嵌入式应用程序运行 x86 编译也有局限性,主要表现为主机代码不支持 ARM-only 的数据类型或库。
以下是使用 _fp16数据类型的主机代码示例,该数据类型仅在基于 ARM-GCC 的编译器中受支持,x86 编译器在编译相同的主机代码时会出错。
在这种情况下,建议使用 PS 的 QEMU 模型,并使用基于 ARM-GCC 的编译器来编译 PS 应用程序。
另外,目前并不支持从 Vitis GUI 启动 PS on x86 的仿真模式,需要从命令行完成。
GitHub 上有使用此功能运行软件仿真的示例供参考:
https://github.com/Xilinx/Vitis_Accel_Examples/tree/2023.1/emulation/aie_adder_hybrid_swemu
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !