在X86处理器上跑嵌入式应用程序的Software Emulation

描述

本文作者: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

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分