SDSoC软硬件协同设计流程系列——2.SDSoC使用

SDSoC使用

初次使用SDSoC

尽管SDSoC支持在Windows主机上开发Linux应用,但是创建SDSoC Platform需要一台Linux主机,本书会在其他部分介绍如何在Ubuntu系统上安装SDSoC。在Windows上安装SDSoC比较简单,因此不做介绍。指定SDSoC工作区
第一次打开SDSoC后会弹出一个界面要求指定工作区,SDx工作区是一个文件夹,用于存储项目,源文件和编译时产生的中间结果。您可以为每个项目定义单独的工作区,或者为不同类型的项目分配工作区。勾选Use this as the default and do not ask again指定当前的文件夹为SDSoC的默认工作区,日后可以在File ->Switch Workspace中更改

新建SDSoC工程

新建SDSoC工程
在Project Explorer的空白处右键New->SDx Project即可新建工程,SDx有三种工程类型:

  • Application Project:一个Software Application,可以将部分函数放进PL部分加速。
  • System Project:包含了多个Application Project以支持不同的应用和硬件加速器。
  • Platform Project:定义SDSoC的软硬件平台。

在这里我们选择Application Project点击Next,然后指定一个工程名称,在这里我们暂定为lab1,点击Next。下面我们就进入选择Platform的对话框。
选择SDSoC Platform
将我们提供的PYNQ的board_file文件夹复制到XILINX_VIVADO/data/boards/board_files路径下,PYNQ的SDSoC Platform复制到XILINX_SDX/platforms/路径下。一个SDSoC Platform包含DSA(Device Support Archive)文件,定义了硬件平台的设计、接口,以及软件平台,包括OS的boot文件以及runtime文件。在编译过程中SDSoC会调用Vivado从dsa文件读取平台信息复现硬件平台,因此需要提供板卡的board_file,后面会介绍如何自己搭建Platform。在这里我们选择PYNQ platform然后点击Next。
然后进入System Configuration对话框,下面有三个选项。

  • Software Platform:用来选择应用运行在什么操作系统上,是Linux,FreeRTOS还是standalone(裸机),工程使用的是什么类型的代码(C/C++还是OpenCL)。
  • Domain用来选择系统运行在哪个核心上,我们提供的PYNQ Platform搭载了Linux系统,运行在两颗Cortex-A9核心上。有些板卡可能有其他核心,比如ZCU102上搭载的ZU9CG上除了四颗Cortex-A53核心,还有两颗Cortex-R5核心,ZCU102的FreeRTOS系统就运行在两颗R5核心上。
  • Additional Settings:有两个选项,一个是Linux Root File System,后面会讲到这个选项的作用。另一个是Output Type,选择Executable,项目最终会生成一个可执行文件,需要代码中有一个main函数,而选择shared library,项目最终会生成一个.so文件,具体如何使用后面会详细介绍。这里我们选择Executable,点击Next。
    现在进入了Templates对话框,目前PYNQ的Platform并没有提供Example,点击Next,进入默认界面。项目被安排在一系列不同的窗口和编辑器视图中,也称为IDE中的界面。打开SDx工具,如图所示,默认界面上半部分从左至右,分别是项目资源管理器、项目编辑器、大纲,下半部分从左至右,分别是报告,控制台以及目标连接,相信熟悉Eclipse的读者看到这个界面并不陌生。
    SDSoC默认界面

导入源代码

在SDSoC中打开工程后,可以将源代码导入到工程中,右键src文件夹,点击Import。Import对话框允许您指定获取文件的来源,包括从压缩包,已经存在的工程,文件系统以及Git文件夹。我们在这里选择从文件系统中导入,点击File System,在From directory一栏输入$XILINX_SDX /samples/mmultadd,注意不要导入description.json和Makefile文件,这两个文件工具可以自动生成。
从文件系统中导入源代码

Profiling

在选择硬件加速函数之前,我们需要大致了解整个算法各部分消耗多少时间,SDSoC工具提供了Profiling工具,可以自动分析算法各部分消耗了多少时间。首先新建一个Application工程命名为profiling,将我们提供的代码导入到src文件夹下,在Debug模式下编译代码。
将PYNQ与电脑连接在同一个路由器下,并将PYNQ的MicroUSB接口连接到电脑。点击SDx界面右下角的Target Connection->Linux TCF Agent-> Linux Agent [default],弹出Target Connection对话框,Host一栏输入PYNQ的IP地址,点击Test Connection,如果看到Connection Successful对话框则说明连接成功。
配置Linux TCF
右键小蜘蛛,选择System Debugger using Debug_Profiling.elf on Linux Agent,点击OK进入Debug模式。
启动Debug
使能TCF Profiler,Windows->Show View->Other->Debug->TCF Profiler
使能TCF Profiler
点击TCF下绿色三角箭头,弹出TCF Profiler启动界面,勾选Enable stack tracing,点击OK,按F8启动程序
启动TCF Profiler
等待程序运行一段时间,可以看到Profiler显示各函数运行的时间:
TCF Profiler显示各程序运行时间

选择硬件加速函数

创建硬件加速SoC的第一项主要任务是确定应用程序的哪些部分适合在硬件中实现,即将这部分代码放在PL中运行将显著提升整体性能,在上一小节我们介绍了如何找到算法中计算量最大的部分。当您已经决定哪个函数放到硬件进行加速之后,有两种方法指定用于硬件加速函数。

  • 方法1
    双击project.sdx文件进入Application Project Settings如下图所示。点击Hardware Func-tion一栏最右侧的橙色闪电按钮,可以显示当前工程中的候选函数(可能被用来硬件加速的函数),按住ctrl键选择madd和mmult两个函数作为硬件加速函数。
    添加硬件加速函数对话框
  • 方法2
    切换硬件/软件
    点击硬件加速函数所在的.cpp文件左侧的小箭头,找到用于硬件加速的函数,右键点击Toggle HW/SW,这一步是切换某函数是放在软件中运行还是硬件中运行。指定硬件加速函数后的用户界面如上图所示。注意,用于硬件加速的函数需要特定的写法,并不是所有函数都可以被指定为硬件加速函数。硬件加速函数应该编写如何并不是本书的主要内容,会在后面简要介绍。这部分内容请参考UG871,UG902以及Xilinx大学计划翻译的HLS手册https://github.com/xupsh/pp4fpgas-cn-hls

选择硬件加速函数的频率

选择硬件功能后,还需要选择硬件加速函数和数据传输网络的时钟频率。硬件加速函数需要通过CPU从DDR中读取数据,这项工作由专门的硬件——DMA来完成,因此也要指定这部分的频率。每个平台都有一个或多个由SDSoC Platform开发人员定义的时钟源,在开发SDSoC Plaform的时候会指定一个默认时钟源,但是无论是硬件加速函数还是数据传输网络,都可以自由选择时钟而不是限定为默认时钟,此外硬件加速函数和数据传输网络可以使用不同的时钟频率,这部分内容会在之后介绍。
选择硬件加速函数和数据传输网络的时钟频率选择硬件加速函数和数据传输网络的时钟频率

编译并测试

指定硬件加速函数和它们的运行频率之后我们就可以编译工程了。默认界面左上角可以选择当前的编译模式,Release还是Debug,二者的优化级别不同,我们这里选择Release,注意更改编译模式后要重新添加硬件加速函数。右键lab1文件夹选择build project,或点击图片中的小锤子按钮。编译过程根据电脑配置会持续二十分钟到六十分钟不定。编译的过程中SDSoC首先调用Vivado HLS工具将硬件加速函数中的代码转化成RTL代码并打包成IP核,在Release/_sds/iprepo/repo文件夹中可以看到硬件加速函数生成的HLS IP核。
硬件加速函数生成的IP核
然后调用Vivado IP Integrator自动添加DMA模块生成Data motion Network并生成系统的Block Diagram,可以点击Release/_sds/p0/_vpl/ipi/syn/syn.xpr打开Vivado工程,然后Open block diagram查看,不同的SDx生成的Vivado工程路径可能会不同。
SDSoC 调用Vivado IP Integrator自动生成Block Diagram
SDSoC会调用Vivado生成比特流,同时自动生成Data motion network的驱动程序,并将生成的bitstream与fsbl.elf,u-boot.elf打包在一起生成BOOT.bin文件。每一次编译工程SDSoC都会完整地进行一遍Vivado HLS->Vivado IPI->Vivado的流程,Vivado HLS正常情况下只要几分钟就可以完成,HLS运行时间过长说明代码编写有问题,整个流程中最费时间的是Vivado综合布局布线生成比特流的过程。
将sd_card目录下的lab1.elf,BOOT.BIN,image.ub文件拷贝到FAT32的SD卡中。有两种方法连接到PYNQ板卡。将PYNQ的MicroUSB连接到PC,PC会自动安装驱动。然后找到SDx Terminal右侧的“+”,选择合适的端口。需要注意以上操作的顺序:先上电,然后打开串口,波特率保持默认,端口选择COM4。
连接PYNQ板卡
启动之后会打印内核启动信息,直到输出PYNQ login,输入用户名root,密码root。
SDSoC自带的Terminal

$ mount /dev/mmcblk0p1 /mnt  //进入系统后挂载SD卡
$ cd /mnt
$ ./lab1.elf

性能预测模式

SDSoC完整地编译一次工程少则二十分钟,多则几个小时,因此Xilinx提供了性能预测模式可以让开发者快速地评估系统性能。勾选Estimate performance选项然后点击编译按钮,这个模式下SDSoC只会进行HLS的流程,并不会产生Block Diagram并调用Vivado产生比特流,整个编译过程不会持续超过10分钟。
勾选Estimate Performance
编译完成后会弹出一个性能评估报告,包含了资源利用情况以及预测的执行一次硬件加速函数消耗的CPU时钟周期数。
性能预测报告
还有一种办法可以得到在CPU上运行程序的实测周期数。设置好TCF Agent后(在10.2.4节有提到)点击上图中的Click Here就会运行lab1.elf文件,得到实测的CPU周期数,并给出性能对比。
通过Linux TCF Agent得到的性能对比

分析和优化

在执行算法优化时需要考虑两个不同的方向:应用程序代码优化和硬件功能优化。大多数应用程序开发人员都熟悉针对CPU优化软件。这通常要求程序员分析算法的复杂性,总体系统性能和数据局部性。有许多方法指南和软件工具来指导开发者定位性能瓶颈,这些技能在优化针对SDSoC环境中的硬件加速函数时同样适用。
首先,开发者应该分别优化整个工程中每一个函数的性能,在SDSoC环境下进行优化与传统软件开发的最大不同是有一些算法会被放进PL中进行加速,这要求开发者必须考虑到算法的并行性,数据传输,内存使用以及PL的存在。然后,开发者需要指定硬件加速函数,并尽可能地让硬件加速器在数据传输时保持工作,也就是说要尽可能让硬件加速器计算跟通信同时进行。
SDSoC可以在编译过程中自动生成报告,帮助开发者详细地分析软件应用和硬件加速函数,这些报告在Report视图下可以看到,如下图所示
报告视图
双击Data Motion Network Report,我们可以看到Data Motion Network的报告,包含了每个硬件加速函数与PS之间的连接信息,如使用了哪种端口(S_AXI_ACP or S_AXI_HP),哪种Datamover(DMA_SIMPLE or DMA_SG),每次运算的数据搬运量,以及用来存储数据的内存是否连续,这些名词的含义会在后面介绍。
Data Motion Network报告
双击HLS Report,可以看到HLS的详细信息,包括资源利用率,时钟频率以及周期数等信息,开发者要根据这些信息来优化设计。需要注意的是这里估算出来的时钟周期数与HLS估算出来的时钟周期数是有差别的。CPU端的时钟周期数=PL端时钟周期数×(CPU频率/PL频率),而且HLS估算数据加载的时间与实际数据传输时间是有区别的,因此Estimate performance里预测的CPU时钟周期数与实际情况会有一些区别,但是整体来看预测结果还是比较准确的,可以作为参考。
HLS报告

欢迎大家关注Xilinx学术合作以及Pynq的官方公众号,里面有许多优质的学习资源等着你哦
在这里插入图片描述
在这里插入图片描述
希望了解HLS的同学可以关注公众号Xilinx学术合作以及PYNQ中文社区获取最新版《FPGA并行编程-- 以HLS实现信号处理为例》pdf ,关注任一公众号,回复 pp4fpgas 即可获得

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值