Versal裸机使用AI Engine的完整流程

作者:Fisher Yang 来源:FPGA FAE技术分享选集

一. 简述

为了应对无线波束形成、大规模计算和机器学习推断等新一代应用需求的非线性增长,AMD 开发了一项全新的创新处理技术 AI 引擎,片内集成该AI Engine的FPGA系列是Versal™ 自适应计算加速平台 (ACAP) 。

1.JPG

有很多文档都描述了AI Engine的架构和性能参数,但是看完这些后,现实中遇到的问题最多的是这个AI Engine到底怎么用,在Vivado中怎么调用,数据怎么跟PL、ARM之间进行交互,数据怎么给AI Engine运算,计算后的结果又怎么获取,有没有相关的例程等等。我想通过以下教程从Vivado建工程、添加 AI 引擎和应用、Vitis Unified裸机应用程序并生成bin文件在硬件上跑起来一个完整的步骤来告诉大家AI Engine是怎么用起来的,通过这个例子能够让大家熟悉Vivado和Vitis Unified IDE对AIE怎么操作。

作者在创建本文例程时使用的开发工具版本是Vitis Unified 2023.2。
二. AI Engine裸机应用创建的流程

流程分为以下四个步骤,如下图所示:

2.JPG

步骤一:定制平台的创建

构建硬件平台是设计的起点,将用于构建 Vitis 软件平台应用程序。在本教程的这一步骤中,描述了如何创建新平台的示例。首先使用 AMD Vivado设计套件中的AI引擎构建硬件系统。

1. 在Vivado中构建AMD Versal可扩展嵌入式平台示例设计

1)启动Vivado,然后在欢迎窗口中选择Open Example Project;

2)先单击Next,在Templates选择页面中选择Versal Extensible Embedded Platform,点击Next;

3)将此项目命名为custom_pfm_vck190或者自定义并单击Next;

4)在开发板选择页面中,这里选择的是Versal VCK190 Evaluation Platform,点击Next;

5)在设计预设页面中,保持默认设置。请注意,示例中的可扩展平台AI引擎已添加;

3.png

6)单击Finish完成示例工程的创建,Vivado自动使用刚刚创建的模板设计打开 Vivado项目,可以打开Block Deisgn来查看平台设计的详细信息。通过使用预构建的可扩展平台模板,可以轻松获得经过验证的平台硬件设计,以继续下一步。在实际的设计开发过程中,可以使用它作为baseline设计并在此基础上进行进一步的修改;

4.png

7)在Vivado左侧的Flow Navigator 面板中单击Generate Block Design,单击Generate,然后等待该过程完成;

注意:生成模块设计时,Vivado会显示严重警告,这是因为中断控制器IP有一个未连接的输入。可以忽略,因为Vitis稍后会在流程中自动连接该输入。

8)从Vivado菜单中单击File,然后选择Export -> Export Platform,点击Next;

A. 在第二页上,选择Hardware and hardware emulation作为平台类型,单击Next;

5.png

B. 在第三页上选择Pre-synthesis,单击Next;

6.png

C. 在第四页上,添加平台名称,单击Next;

7.png

D. 在第五页中,设置XSA的名称,然后单击Finish;

8.png

9) 导出硬件平台后关闭Vivado工程。

2. 在 Vitis 软件平台中构建平台

1) 打开 Vitis Unified,然后选择一个工作区;

2) 在欢迎页面上,选择Create Platform Component,或选择File -> New Component -> Platform;

3) 将平台组件名称设置为base_pfm_vck190,然后单击Next;

9.png

4) 选择Hardware Design并使用上一步Vivado导出的 XSA,然后单击Next;

10.png

5) 将操作系统设置为 aie_runtime,将处理器设置为ai_engine,然后单击Next,接着再单击Finish完成平台组件创建;

11.png

6) 然后通过在流程导航器中单击Build并选择base_pfm_vck190组件来构建平台;

12.png

注意:如果后面要更改XSA文件,单击位于该平台组件的Settings文件夹中的 vitis-comp.json,然后单击Switch XSA;

7) 生成的平台可以在base_pfm_vck190/export中找到。

13.png

  • 在此步骤中,从Vivado Design Suite中开始创建硬件平台,然后根据导出的XSA文件在Vitis Unified软件平台中构建平台。下一步骤,将使用Vitis Unified中的平台构建AI Engine应用程序。

  • 步骤二:创建AI引擎应用

    在这一步骤中,将学习如何从模板创建新的AI Engine应用程序工程,并运行Emulation-AIE程序。

    1. 新建一个AI Engine应用项目

    1) 如果已关闭 Vitis UnifiedIDE,将其打开,使用步骤一中相同的工作区;

    2) 单击View -> Examples查看随Vitis Unified安装的应用实例;

    3) 在AI Engine Examples -> Installed AI Engine Examples下选择Simple,并单击Create AI Engine Component from Template;

14.png

注意:在Simple模板的描述中,它表示该模板仅适用于AIE仿真和SW(x86)仿真。在下面步骤中,将学习如何使其在硬件上运行。

4) 将AIE组件名称设置为simple_aie_application,然后单击Next;

15.png

5) 在Select Platform页面中,选择要使用的平台,选择刚刚创建的base_pfm_vck190平台, 单击Next,然后下一页面中单击Finish;

16.png

6) 该Simple模板导入了两个文件夹:

A. Src文件夹包含kernels和graph的源代码;

B. Data文件夹包含仿真输入的数据(input.txt)和正确的输出数据 ( golden.txt)。

17.png

7) 打开文件project.h查看graph,可以看到该AIE示例graph有一个输入和一个输出,并实现了具有相同功能的两个内核,第一个内核的输出提供给第二个内核;

18.png

first = kernel::create(simple);

second = kernel::create(simple);

adf::connect(in.out[0], first.in[0]);

connect(first.out[0], second.in[0]);

connect(second.out[0], out.in[0]);

该graph的图形表示如下:

19.png

8) 打开kernels/kernels.cc文件查看内核中实现哪些功能,可以看到这是一个简单的计算,将输入的实部和虚部相加给输出的实部,输入的实部减去虚部给输出的虚部。

20.png

2. 构建项目并通过Emulation-AIE运行

1) 在流程导航器中,确保选择simple_aie_application组件,然后单击AIE SIMULATOR / HARDWARE下的Build;

2) Bulid完成后,要运行 System C 仿真(Emulation-AIE或AIE SIMULATOR),在 Flow 导航器中,确保选择simple_aie_application组件,然后单击AIE SIMULATOR / HARDWARE下的Run;

21.png

3) 在控制台中可以看到仿真成功运行,输出数据文件已经生成build/aiesimulator_output

/data/output.txt,可以将文件output.txt与golden.txt文件里面数据进行比较,output.txt与golden.txt数据一样。

22.png

步骤三:系统集成

在这一步骤中,将学习如何将 HLS 中的可编程逻辑 (PL) 内核添加到系统项目中,并构建整个系统。

1. 修改graph以用于硬件构建
步骤二已经创建了一个可以在AI Engine阵列上运行的应用程序,现在需要修改AI Engine graph以便在硬件中使用,并使用 Vitis 编译器 (V++) 将AI Engine阵列连接到PL;project.cpp中的main函数不会在硬件运行中使用,因此需要添加一个开关( #if defined(...)),以便在硬件构建时不考虑这个main函数;

23.png

2. 添加 PL 内核

在此示例中,使用 HLS 内核用于连接memory和 AXI4-Stream 接口,以便memory和 AXI4-Stream接口之间的数据交互;
mm2s kernel:从memory读取数据并将其输入到AI Engine阵列中;
s2mm kernel:从AI Engine阵列接收输出数据并将其写入memory。
1) 在 Vitis Unified IDE 中,单击File -> New Component -> HLS;
2) 将第一个组件命名为mm2s并单击Next;
3) 在Configuration File页面中,保留默认设置(Empty File),然后单击Next;
4) 在Source Files页面中,添加mm2s.cpp文件(文章末有下载链接);

24.png

5) 在同一页面中,将mm2s函数设置为top function(点击Browse并选择mm2s),然后单击Next;

25.png

26.png

6) 在Hardware选择平台页面中,选择刚刚创建的base_pfm_vck190平台,点击Next;

7) 在Settings页面中flow_target下选择Vitis Kernel Flow Target,package.output_format下选择Generate Vitis XO,单击Next,然后单击Finish;

27.png

8) 重复以上1 到 7 ,使用s2mm.cpp文件(文章末有下载链接)创建一个名为s2mm的 HLS 组件。

3. 配置硬件链接项目
刚刚已经导入了kernels,现在我们需要告诉 Vitis Linker如何将所有组件连接在一起
1) 在Vitis Unified IDE中单击File -> New Component -> System Project创建一个新的系统项目组件;
2) 将此系统组件命名为simple_aie_application_system_project并单击Next;
3) 在Platform页面中选择刚刚创建的base_pfm_vck190平台;
4)跳过 Embedded Component Paths 页面(单击Next),此页面用于运行 Linux 的系统,这个示例是裸机系统,所以不用管,然后在下一面中单击Finish;
5) 打开simple_aie_application_system_project -> Settings下名为vitis-sys.json 的设置文件,然后单击文件底部Components部分中的add Existing Component,单击HLS并选择mm2s和s2mm组件;

28.png

6) 再次单击文件底部Components部分中的add Existing Component,单击AI Engine并选择simple_aie_application组件;

7) 现在需要告诉 Vitis 编译器系统的连接情况,此步骤是使用配置文件完成的。仍在设置文件vitis-sys.json中,在Hardware Link Settings下单击binary_container_1展开,然后单击hw_link/binary_container_1-link.cfg;

29.png

将binary_container_1-link.cfg显示更改为Source Editor,并在[connectivity]下添加以下行;

30.png

以上计算单元的命名规则参照Vitis Unified Software Platform Documentation: Application Acceleration Development (UG1393);

8) 在binary_container_1-link.cfg页面中,将显示更改回Settings Form并启用Export hardware (XSA)。

31.png

4. 构建系统

1)在Vitis Unified IDE的流程导航器中,确保选择了simple_aie_application_system_project并单击HARDWARE -> LINK - binary_container_1下的Build Binary Container,当弹出页面要求构建组件(simple_aie_application、mm2s 和 s2mm)时,全选上后单击OK开始编译,编译过程需要一些时间才能完成,依次编译AI Engine应用工程、HLS硬件内核工程、硬件链接工程,过一段时间后系统可以成功构建并没有错误;

32.png

2) 可以打开生成的Vivado工程<workspace>/simple_aie_application_system_project/build/hw/hw_link/binary_container_1/binary_container_1/vivado/vpl/prj/prj.xpr来查看编译结果,可以看到 Vitis 编译器添加了两个HLS IP(mm2s和s2mm),并将它们连接到memory(NOC)和 AI Engine IP。

33.JPG

在下一步骤中,将创建一个处理系统 (PS) 裸机应用程序,并用它来运行该系统。

  • 步骤四:PS 应用程序的创建和运行
    在这一步骤中,将学习如何使用上面步骤中生成的XSA构建PS裸机应用程序,然后编译并运行整个系统。
    1. 在裸机Domain中创建一个新平台
    1) 在 Vitis Unified IDE 中,工作区目录与上面步骤中相同,单击File -> New Component-> Platform;
    2)将平台项目名称设置为AIE_A-to-Z_pfm_vck190,然后单击Next;
    3) 使用上面步骤中生成的XSA,可以在以下位置找到该XSA:
    <workspace>/simple_aie_application_system_project/build/hw/hw_link/binary_container_1.xsa,单击Next;

34.png

4) 将Operating system设置为 standalone,将 Processor设置为psv_cortexa72_0,单击Next,然后下一页面中单击Finish;

35.png

  • 5) 编译平台。

    2. 创建裸机的AI引擎控制应用程序
    1) 在 Vitis Unified IDE 中单击File -> New Component -> Application创建一个新应用程序;
    2) 将应用程序的名称设置为A-to-Z_app并单击Next;
    3) 选择刚刚创建的AIE_A-to-Z_pfm_vck190作为平台,然后单击Next;
    4) 选择 A72_0 domain ( standalone_psv_cortexa72_0),单击Next,然后在下一页面中单击Finish;
    5) 右键单击A-to-Z_app工程下的src文件夹,然后单击Import -> Files;
    6) 将aie_control.cpp从simple_aie_application project工程中( simple_application/build/hw/Work/ps/c_rts/aie_control.cpp)导入到src文件夹中;
    7) 从文章末下载链接下载main.cpp导入到文件夹src中,浏览main.cpp文件的内容,可以看到代码正在初始化输入数据和输出数据的内存空间,需要注意的是这里使用.init()和.run()APIs 来控制AI引擎:

printf("Starting AIE Graph\n");

printf("Graph Initialization\n");

mygraph.init();

printf("Done \n");

printf("- \n");

printf("Running Graph for 4 iterations\n");

mygraph.run(4);

从系统中启用AI引擎graph有两种方式:
A. 在 PDI 中启用graph,这表示该graph将在BOOT 期间启动并永远运行;
B. 使用<graph>.init()和<graph>.run() APIs从PS程序中启动AI引擎graph,本例中就是使用的该启动方式。
8) 在A-to-Z_app 组件下,打开Settings下的UserConfig.cmake,在Directories中的Include Paths (-I)里添加以下目录:
A. <workspace>/simple_aie_application/src;
B. $ENV{XILINX_VITIS}/aietools/include。

36.png

9) 仍在UserConfig.cmake文件中的Libraries部分中添加以下:

A. 在Libraries (-l)里添加adf_api;

B. 在 Library search path (-L)里添加$ENV{XILINX_VITIS}/aietools/lib/aarchnone64.o。

37.png

10) 修改Linker Script以增加 AIE 库的heap;

A. 展开A-to-z_app组件;
B. 在src目录中,单击lscript.ld打开该项目Linker Script;
C. 在Linker Script中将heap大小修改为0x100000(1MB)。

38.png

11) 构建组件A-to-Z_app。

3. 打包整个系统
1) 展开simple_aie_application_system_project,在Settings目录中,单击打开vitis-sys.json,然后单击Package Settings下的package.cfg配置文件;

39.png

2) 在package.cfg的General部分的 Baremetal Elf 设置中添加以下内容,告诉打包程序添加应用程序可执行文件,并在A72处理器上运行它;

../../../../A-to-Z_app/build/A-to-Z_app.elf,a72-0

40.png

3) 在AI Engine部分中,选择Do not enable cores选项,取消选择Enable debug选项;

41.png

4) 编译用于硬件仿真的simple_aie_application_system_project项目(单击Flow 导航器中HARDWARE EMULATION下的Build All )。

4. 在Hardware Emulation中运行系统

现在整个系统已经构建完成,可以在 hardware emulation中对其进行测试;

1) 选中simple_aie_application_system_project,在流程导航器中,单击 HARDWARE EMULATION下的Start Emulator;

42.png

2) 在Start Emulator弹出窗口中,保留默认设置并单击Start;

43.png

注意:可以使能Show Waveform选项打开 Vivado Simulator,并观察 PL 信号的波形,如果使能了此选项,请确保在Vivado Simulator中运行simulation,因为 QEMU将等待它。

3) 可以在Vitis控制台中看到应用程序成功运行且没有错误;

44.png

4) 要停止Emulator,单击流程导航器中Start Emulator上的ⅹ。

45.png

5. 针对硬件构建系统

在硬件中运行系统之前,需要重建系统以针对硬件;为硬件编译构建simple_aie_application_system_project项目(单击Flow 导航器中HARDWARE下的Build All )。

6. 在硬件中运行系统

使用 SD 卡运行应用程序:

1) 正确连接好开发板的电源线、JTAG USB 线、UART USB 线,并将启动模式设置为 SD 启动;

2) 展开simple_aie_application_system_project组件下的Output -> hw -> package,在该package目录中,有一个sd_card.img文件;

46.png

3) 使用balenaEtcher工具将sd_card.img烧录到SD卡中;

4) 启动连接到VCK190 COM端口的UART终端;

5) 将 SD 卡插入开发板,然后打开开发板电源,可以看到应用程序成功运行,没有错误。

47.png

三. 总结

在本文中,基于 VCK190评估板,在Vivado中创建了一个通用的硬件平台并导出,在Vitis Unified中将 AI Engine 内核和 PL 内核添加到系统中,并构建了 PS 裸机应用程序来控制系统,并在HARDWARE EMULATION和硬件中运行成功。通过以上步骤可以知道怎么把Versal的AIE用起来,希望能够帮助大家尽快能将AMD Versal中这一全新的创新处理技术AI引擎运用到项目或者产品中。

下一篇文章会基于这篇文章介绍创建一个运行Linux操作系统的Vitis平台,并在该平台上运行AI引擎工程。

C程序下载链接:C程序.rar

如果您在Versal或者AIE方面有疑问,欢迎联系:

simonyang@comtech.cn

charlesxu@comtech.cn

最新文章

最新文章