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

SDSoC使用

初次使用SDSoC

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

新建SDSoC工程

SDSoC软硬件协同设计流程系列——2.SDSoC使用_第2张图片
在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软硬件协同设计流程系列——2.SDSoC使用_第3张图片
将我们提供的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软硬件协同设计流程系列——2.SDSoC使用_第4张图片

导入源代码

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

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对话框则说明连接成功。
SDSoC软硬件协同设计流程系列——2.SDSoC使用_第6张图片
右键小蜘蛛,选择System Debugger using Debug_Profiling.elf on Linux Agent,点击OK进入Debug模式。
启动Debug
使能TCF Profiler,Windows->Show View->Other->Debug->TCF Profiler
SDSoC软硬件协同设计流程系列——2.SDSoC使用_第7张图片
点击TCF下绿色三角箭头,弹出TCF Profiler启动界面,勾选Enable stack tracing,点击OK,按F8启动程序
启动TCF Profiler
等待程序运行一段时间,可以看到Profiler显示各函数运行的时间:
SDSoC软硬件协同设计流程系列——2.SDSoC使用_第8张图片

选择硬件加速函数

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

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

选择硬件加速函数的频率

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

编译并测试

指定硬件加速函数和它们的运行频率之后我们就可以编译工程了。默认界面左上角可以选择当前的编译模式,Release还是Debug,二者的优化级别不同,我们这里选择Release,注意更改编译模式后要重新添加硬件加速函数。右键lab1文件夹选择build project,或点击图片中的小锤子按钮。编译过程根据电脑配置会持续二十分钟到六十分钟不定。编译的过程中SDSoC首先调用Vivado HLS工具将硬件加速函数中的代码转化成RTL代码并打包成IP核,在Release/_sds/iprepo/repo文件夹中可以看到硬件加速函数生成的HLS IP核。
SDSoC软硬件协同设计流程系列——2.SDSoC使用_第13张图片
然后调用Vivado IP Integrator自动添加DMA模块生成Data motion Network并生成系统的Block Diagram,可以点击Release/_sds/p0/_vpl/ipi/syn/syn.xpr打开Vivado工程,然后Open block diagram查看,不同的SDx生成的Vivado工程路径可能会不同。
SDSoC软硬件协同设计流程系列——2.SDSoC使用_第14张图片
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。
SDSoC软硬件协同设计流程系列——2.SDSoC使用_第15张图片
启动之后会打印内核启动信息,直到输出PYNQ login,输入用户名root,密码root。
SDSoC软硬件协同设计流程系列——2.SDSoC使用_第16张图片

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

性能预测模式

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

分析和优化

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

欢迎大家关注Xilinx学术合作以及Pynq的官方公众号,里面有许多优质的学习资源等着你哦
SDSoC软硬件协同设计流程系列——2.SDSoC使用_第23张图片
SDSoC软硬件协同设计流程系列——2.SDSoC使用_第24张图片
希望了解HLS的同学可以关注公众号Xilinx学术合作以及PYNQ中文社区获取最新版《FPGA并行编程-- 以HLS实现信号处理为例》pdf ,关注任一公众号,回复 pp4fpgas 即可获得

你可能感兴趣的:(SDSoC软硬件协同设计流程系列——2.SDSoC使用)