前言
毕设要用到Xilinx家的ZCU106这块板子,了解到最近Xilinx统一了Vivado,XilinxSDK,并集成了常用开源IP核,推出了Vitis统一软件平台,使我们不再需要关注底层的Verilog实现,因此尝试使用Vitis开发一个神经网络加速器,作为毕设的基础。
Vitis架构
XRT
由上图可以看到,Xilinx为我们提供了各种各样的加速库,而XRT(Xilinx Runtime Library)则是我们的代码与Xilinx硬件交互的中间件和媒介。有了XRT,我们就可以用更上层的开发方式(cpp甚至python)来进行Xilinx设备的开发。XRT软件栈的架构如下图
XRT虽然很重要,但是可能是Xilinx的相关开发人员精力有限=-=,目前有官方XRT platform支持的板子并不多,只有以下几个:
看了看自己的ZCU106并不在其中,没办法,看来我们还是要自己为ZCU106编译XRT了。
XRT for ZCU106
让我们先来梳理一下XRT究竟是如何编译的。
根据Xilinx官方发布的platform编译源码和脚本来看,为了完成嵌入式平台的编译,我们需要执行一个TCL脚本,该脚本可分为三步:
首先,我们要利用vivado来进行项目的搭建,并生成硬件平台,得到xsa文件。随后,我们调用petalinux来进行软件环境的生成最后,使用xsct工具打包软硬件生成Vitis platform
我们可以按照这个流程,参考ZCU102的脚本来生成ZCU106的脚本,并进行platform的编译。
编译
我们需要修改官方工程中的相关脚本来适配ZCU106,这是一个不小的工作量,不过好在我们有万能的github,在这里偷个懒,用一下前人的劳动成果,后续有需要定制的地方再去修改。
为了编译ZCU106 XRT平台,首先我们要下载安装好Vitis,petalinux以及XRT,安装过程比较简单,下载后直接运行即可,这里就不细说了,要注意的是最好保持版本的一致性。下面列出我的开发环境(Xilinx相关的均可在官网下载):
Ubuntu 18.04Vitis .1petalinux .1Xilinx Runtime .1
我们将github的ZCU106 platform源码下载到某个目录下,cd至zcu106_base,在该目录下执行(按照README文档的步骤即可)
make all
如果顺利的话,最终会调用一个tcl脚本完成所有任务,得到XRT平台文件,后缀为xpfm。
但是一般都不会太顺利。。。。下面我着重说一下我遇到的问题及一些经验。
问题1 版本不兼容
要注意这个github的源码的环境要求和我上面列的是一致的,一定要按这个版本来配置开发环境才能正确的make与运行。
问题2 “$RDI_PROG” “$@”
这个问题其实就是底层的segmention fault,我遇到这个错误的原因是我的电脑内存太小了,只有8G,并且swap分区只有2G,我后续观察到执行脚本至少需要14G内存,我的机器内存溢出,所以报了这个错误。
解决办法最好当然是整个16G以上的机器,我条件有限,只能增大了ubuntu的swap分区=-=,来当破产版的内存用。
问题3 Fetcher Error
遇到这个错误说明第一步调用vivado生成xsa已经成功了,到了调用petalinux的阶段。在进行petalinux config和petallinux build的时候,会联网下载许多包和库,build的linux系统会用到这些库。我们都知道一遇到下载,对于我们天朝人民来说就麻烦了,几KB的git clone速度,时断时续的境外网站下载,以及某些网站的无法访问,都会导致我们的脚本在下载阶段出各种问题。
Fetcher Error就是这个问题,在从网上下载源码和包时出问题。
我的解决方法就是失败了再继续重新执行,虽然速度慢,但还是可以下载下来的,我尝试挂了代理,但是没有提速,大家可以自己尝试一下代理。
遇到这个错误我们可以从petalinux相关的脚本开始执行,无需重新调用vivado生成前面的xsa,可执行如下命令
make petalinux_proj XSA_DIR=<xsa dir path>#我的xsa文件在zcu106_base/vivado下
另外遇到了这个错误千万不要主动去ctrl+c
或者z
结束脚本,要让脚本自己结束,脚本会把当前在做的任务执行完毕后主动结束,结束前会记录当前各种任务的执行状态,再次调用时可以达到断点重试的效果,强制结束脚本会导致需要重新build整个项目。
这一步成功之后,还需要进行
make pfm XSA_DIR=<xsa dir path>
就得到了xpfm文件。
问题4 Failed to generate BIF file, file doesn’t exist
这一步是由于petalinux找不到vivado生成的bitstream文件,修改petalinux下的Makefile,将第58行petalinux package后–fpga的路径改为vivado生成的bitstream路径即可,我的bit文件路径为vivado/zcu106_base/zcu106_base.runs/impl_1/zcu106_base_wripper.bit,供参考。
petalinux-package --force --boot --fsbl images/linux/zynqmp_fsbl.elf --fpga project-spec/hw-description/$(PLATFORM).bit --u-boot images/linux/u-boot.elf --pmufw images/linux/pmufw.elf --atf images/linux/bl31.elfpetalinux-package --force --boot --fsbl images/linux/zynqmp_fsbl.elf --fpga ../vivado/zcu106_base/zcu106_base.runs/impl_1/zcu106_base_wrapper.bit --u-boot images/linux/u-boot.elf --pmufw images/linux/pmufw.elf --atf images/linux/bl31.elf