本节开始学习Xilinx另一个很牛逼的软件工具SDSoC, 它到底有多强,在学习使用之前读者还是有必要了解一些该软件的功能以及使用它开发的优势。
此文为转载其他新闻/博客内容!如有雷同必定是笔者搬运之~
近年来“Software Define ” 软件定义这个词持续火热,全球知名技术研究和咨询公司Gartner早在对2014年最有战略意义的十大技术与趋势做出预测时,便提出了软件定义一切(Software Defined Anything)的概念,他们预测这类技术会在未来三年里拥有巨大潜力,并在同行业中产生重大影响。两年后的今天回顾这一概念和技术的发展,不难看出,Software Define的确成为了行业风向标,其应用可谓无处不在。
相信一直关注赛灵思技术动向的工程师们对SDx这个词并不陌生,概括来讲,Xilinx的SDx指的是一系列新工具,专为系统和软件工程师而设计,可以使那些只有很少或根本没有FPGA设计经验的研发人员直接使用高级编程语言在强大的可编程硬件上进行设计,并且与那些嵌入芯片内部的或是在片外连接的业界标准处理器例如ARM或x86一起协同工作。 可以看到SDx系列目前有三个主要成员,包括SDSoC、SDAccel和SDNet。
SDx | 支持器件 | 优势 |
SDSoC | Zynq SoC和MPSoC | 100倍软件性能加速 |
SDAccel | Kintex和virtex | 25倍性能功耗比优势 |
SDNet | Kintex, Virtex, Zynq SoC & MPSoC | 性能,灵活性,安全性 |
SDSoC™ 开发环境允许嵌入式和应用软件开发人员更广泛的利用Zynq® SoC和MPSoCs的性能,提供超过100倍的软件性能加速。
SDAccel™ 开发环境针对的是OpenCL™,C和C ++的设计应用,与那些CPU和GPU在数据中心和医疗影像等领域的实现方案相比,利用FPGA进行加速可获得高达25倍的性能功耗比提升。
SDNet是“软”定义网络的解决方案。具体来说就是SDNet结合赛灵思的全面可编程器件,打造出了“软”定义网络这样的交叉技术,从而将可编程能力和智能化功能从控制层扩展至数据层,不仅支持SDN,而且还可以突破性地支持任何软件定义网络架构。
从以上简要的介绍可以看出SDx系列的三个工具所针对的器件与市场各有侧重,但总体上都是面向软件和系统工程师的全面可编程抽象化设计工具,是赛灵思业界领先技术实力的进一步体现。
其中,专门用作提高赛灵思异构Zynq SoC以及MPSoC的设计生产力而生的SDSoC开发环境就是这篇短文将要介绍的重点,在以下的篇幅中,我们会为大家分析SDSoC主要针对的市场和应用,SDSoC的各种创新,应用SDSoC的好处和优势等。
我们今天的主要内容是介绍SDSoC,但在开始之前,需要提一下Vivado HLS这个在高级抽象语言与底层硬件描述语言之间架起了一座桥梁的高阶综合工具。
相信大部分赛灵思的用户对Vivado HLS已经不再陌生,甚至有可能已经是HLS的用户。的确,经过了三四年的上市推广,Vivado HLS早已不再是一个全新的工具,我们已经有超过1000家成功的客户。HLS的灵活性和生产力优势是显而易见的,甚至赛灵思的IP开发部门在交付Vivado 2015.1版本及以后的部分视频IP时也都是使用HLS从C/C++语言开始设计。
Vivado HLS可以在很短的时间内生成与手工编码质量相当的RTL代码,并且允许用户将同样在C测试平台生成的测试向量用在C仿真和RTL验证中,从而大幅加速验证过程。对那些使用C / C ++描述规范的算法设计类客户来说,这是理想的解决方案,可以将其已有的各类浮点或定点算法无缝实现到FPGA硬件中,比较典型的应用就是各类视频运算、加解密等DSP算法等等。
使用Vivado HLS可以实现真正意义上基于C语言的IP,通过HLS,我们可以把用户的C/C++以及System C算法以VHDL或Verilog的形式输出,然后通过Vivado IPI或SysGen等赛灵思的工具,整合到你的FPGA设计工程中去。也就是说,使用Vivado HLS可以更便捷高效地完成从高阶抽象语言C/C++到赛灵思FPGA可编程逻辑硬件的设计实现过程。
Vivado HLS不仅是简单的翻译工具或是综合工具,更为重要的是,我们可以将其产生的RTL以IP的形式导出到Vivado IPI中,或者直接调用HLS生成的RTL文件到另一个RTL项目,甚至是输出到DSP设计的SysGen工程中。
以下图片展示了赛灵思Zynq SoC器件的架构图。SDSoC所针对的器件就是包括Zynq SoC和下一代的MPSoC在内的多核异构可编程逻辑芯片。
Zynq-7000 系列是赛灵思推出的业界第一款将ARM A9双核处理器与28nm低功耗可编程逻辑紧密集成在一起的SoC产品。从图中可以可以看出左上角处理器所在的区域称作Processing System即PS,而其余可编程逻辑所在的区域则称作Programmable Logic即PL。
位于PS侧的ARM内部用硬件实现了AXI总线协议,提供GP、HP和ACP等性能各不相同的数个物理接口。而PL侧则需要使用可编程逻辑来搭建相应的AXI接口。在具体设计时,可以在Vivado IPI中使用赛灵思提供的IP如AXI-Stream等等来实现。此外,软硬件之间有数据交互的设计就牵扯到在软硬件之间如何进行数据搬移,这种情况下,我们还需要一个或数个DataMover,这也同样需要在PL侧使用可编程逻辑来搭建。
之所以要花几页篇幅来介绍Vivado HLS的作用与Zynq的架构,就是为了更清楚地描述全面可编程Zynq SoC的开发流程。
对于以C/C++等高阶语言为起点来进行SoC开发的用户来说,由C/C++算法开始,首先需要对软硬件进行分区,选择哪些部分放入PL侧进行加速,哪些部分仍然在PS侧用软件实现。对那些指定到放入可编程逻辑上用于硬件加速的部分,还需要完成C代码到RTL IP的转换。接下来,就是完成软/硬件之间的连接,包括使用怎样的DataMover、PS与PL之间的接口如何配置等,接下来还要完成配套的软件驱动程序。所有这些往往牵扯到数个不同团队和专业人员的通力合作,需要通过数次迭代来探索最佳的实现方案和系统架构。这个流程图很清晰地描绘了SoC的开发流程,每一步都是耗时耗力的工作。
具体到每一步的工作来看,传统的Zynq设计流程大致分为五个步骤:
首先,系统架构师来决定将哪些部分用于软件实现,哪些部分放入硬件加速,即所谓的软硬件分区。划分为硬件实现的功能将需要使用RTL代码来开发,或是使用HLS将C/C++代码综合成Vivado中可实现的IP。然后,要在Vivado IPI中搭建DataMover和接口。后是应用软件和驱动程序的开发。
这无疑是一个十分耗时的过程,需要多个部门和团队之间的设计切换。有时候,即便这样完成后的设计可以正常工作,却可能无法满足你在吞吐量、延迟或面积等方面的设计性能要求。此时就可能需要通过修改系统连接来重新搭建硬件架构来对系统性能进一步优化。但这么做,又将导致软件应用程序和驱动程序的变化。因此,你往往需要与多个软件和硬件团队紧密合作,通过多次迭代设计来试着满足最终需求。
在某些情况下,设计不能满足你的性能要求的原因在于 软件性能不够,或是硬件的占用率太高。这时候,你就需要返回到最初的设计,重新修改软/硬件分区方案,然后前面所说的硬件实现,系统连接,软件驱动等所有步骤都要重新再来一边,这势必要求更多的团队一起配合,改变设计来探索另一种架构,而且可能面临更多次的设计迭代,进一步拉长设计周期。
毫无疑问,用在系统优化上的时间对TIme-to-market的影响巨大。此外,我们也注意到在Zynq SoC的设计中,用户最关注的部分往往是算法的最终实现和算法模块的优化,包括IP或是软件功能块。因此,SDSoC的设计理念也致力于解决这些用户最关注的问题。
如下图所示,在应用了SDSoC的Zynq设计流程中,工具可以自动搭建软硬件之间的通讯部分,包括DataMover、软件驱动程序和硬件连接接口。工具还可以将整个开发过程抽象到C/C++的应用层面,以C/C++为起点来进行算法开发,当然,工具也可以调用以传统的IP方法开发的算法模块,包括已经由Vivado HLS转换后的RTL IP,也包括那些本身就由Verilog或VHDL硬件描述语言编写的IP。在调用这类IP时,只需将其封装为C可调用库的形式即可。 在SDSoC中,我们能够轻松进行软件/硬件的划分,用户仅需在图形化界面中用鼠标单击指定那些需要进行硬件加速的模块即可。
相比较传统SoC设计流程,SDSoC通过自动生成硬件连接和软件驱动程序大大简化了Zynq SoC和MPSoC的开发过程。它会自动调用Vivado HLS来将那些用C/C++开发的算法模块转化为Vivado可综合的RTL IP,它也可以将那些已经优化过的HDL IP模块通过C可调用库的方式进行重用。用户可以在软件中通过简单点击某个功能块将其应用到PL上进行加速来迅速修改软/硬件的分区,因此,它也有助于系统架构设计人员运行快速假设性分析来评估系统的性能和面积。
在应用SDSoC之后,我们可以非常迅速地将你的设计应用在Zynq系统上,即使第一遍实现后的性能不达标,也可以使用SDSoC快速选择不同的用于硬件加速的功能块,探索不同的硬件/软件分区方案,或是通过pragma等手段来指导工具产生不同的系统配置等方法来进一步优化设计。统计显示,使用SDSoC开开发Zynq系统,可以将整体开发时间从原本的数周缩短至数日甚至数个小时。
现在我们稍作总结就会发现,SDSoC开发环境提供了一个大大简化的C / C ++编程体验,用户现在可以在嵌入式开发人员所熟悉的基于Eclipse™的IDE上完成整个Zynq SoC的开发。SDSoC带来了业界首个C / C ++的全系统优化编译器,提供系统级的Profiling特征分析,自动将软件代码放入可编程逻辑中加速,自动产生系统连接,和相关的库以加速开发。SDSoC也为用户和第三方平台开发者提供了流程支持,通过提供平台描述文件的的手段,可以使他们自己设计的包含有Zynq SoC的开发板在SDSoC开发环境中使用。
应用SDSoC,开发人员可以从整个设计的C / C ++代码开始系统级特征分析,从而找出系统设计的瓶颈。然后用户只需选择将那些性能瓶颈的功能块放入PL中加速。 SDSoC的全系统优化编译器会使用Vivado HLS自动创建RTL IP,生成最优的系统连接,配置软件驱动程序。最终的结果是一个可运行的FPGA配置比特流文件和软件的引导映像。所有这些,完全由一个基于Eclipse的嵌入式开发环境生成。
SDSoC提供给用户的是一个可以用来完成整个Zynq SoC和MPSoC开发的基于Eclipse的软件环境,这个环境对那些已经在使用DSP芯片、视频SoC 和CPU处理器的嵌入式开发人员来说是在熟悉不过的。
在IDE中,用户可以简单地选择用来放入PL中加速的功能块,无需手动创建用于硬件实现的Vivado工程或是软件驱动程序。另外,已经有很多针对FPGA硬件优化过的IP库可以经由Vivado HLS导出,除了赛灵思和ARM,我们也有很多合作伙伴提供更多特定的算法库,包括视频类,加解密,OpenCV等等。帮助用户进一步提高生产力。
关于操作系统,目前的SDSoC版本中已经支持的目标平台Platform大都支持多种OS,包括Linux,FreeRTOS和Standalone,如果用户需要其他操作系统的支持,只要将所需OS打包到所用的目标平台中即可。具体做法涉及SDSoC目标平台的创建,我们稍后会在另外的文章中做详细介绍。
SDSoC提供系统级特征分析功能。包括快速的性能估算,允许用户通过快速的性能反馈来调整和优化软硬件代码分区、调整系统构建,从而达到系统要求的性能和面积,同时为整个开发过程节省了大量时间。这个估算是对整个系统的性能估算,包括可编程逻辑、数据通信和处理器系统等,SDSoC还可以报告出部分功能块加速后的软件/硬件的周期性能、可编程逻辑部分的硬件占用率。SDSoC也可以通过在ARM上的快速运行反馈来报告出全软件实现方案的周期性能,同时跟硬件加速方案性能估算进行对比,快速报告出性能提升比例。帮助用户在最短的时间内探索出最佳的设计实现方案。
在目标平台上运行时,SDSoC还可以通过使用ARM 处理器提供的性能计数器和自动插入到可编程逻辑的AXI总线性能监视器即APM来收集包括自动化高速缓存,内存和总线利用率等等的硬件性能数据,报告系统性能测量数据。
SDSoC的核心技术可谓业界首创的全系统优化编译器,这个编译器是一个统一的界面,不仅可以针对基于ARM的处理器系统,也可以针对片内的可编程逻辑。SDSoC开发环境旨在为系统架构师以及软件开发团队提供一个可以使用唯一的“黄金C / C ++代码”来快速配置,并同步生成构建系统所需的各类软硬件架构的可能。软硬件统一的编译器,可以从系统视角出发,带来最佳的系统构建与连接,优化的存储器接口和软件驱动等。全系统优化编译器的另一大优势是支持快速的设计空间探索,允许开发者在性能和吞吐量,延迟及面积之间作出权衡,同时保持较短的设计迭代次数。
具体到提升设计生产力这一点来说,我们就以一个32乘32 的浮点矩阵乘法设计来举例,如上图所示,正因为SDSoC开发环境特有的全系统优化编译器和系统级特征分析等功能,使得使用SDSoC进行设计后,用户可以在很短的时间内迅速生成系统配置和各种宏观、微观架构,探索最佳的互联和存储器接口,从而使得用户可以在最短的时间内探索出使用Zynq SoC设计的十几种可能的配置,并找到其中性能最佳的组合(图中用绿色圈出),继而继续使用SDSoC来具体进行设计实现和调试。
配合使用ARM 处理器提供的性能计数器和自动插入到可编程逻辑的AXI总线性能监视器收集到的各种性能数据,SDSoC还可以帮助系统架构师在最短的时间内探索出针对自己的应用平台和设计应用来说性能最佳的系统设计方案。与传统的软件硬件分别开发的流程相比可以节约大量的开发时间和成本。
介绍了这么多SDSoC的优势,相信不难看出,SDSoC提供的是一个真正的端到端流程。对用户来说,从C/C++代码入手,经过SDSoC,可以完成软硬件分区,生成RTL IP功能块,完成PS和PL之间的功能连接,包括硬件接口和软件驱动,最后针对目标设计平台产生出可以用来加载FPGA的比特流文件和可以用来启动操作系统的软件引导映像。所有这些在以往需要多个部门通力合作的工序如今都已经简化到SDSoC这一个开发环境中。
这里我们要强调一下,虽然对用户来说,整个图形化操作界面是软件和嵌入式开发人员非常熟悉的,所有的工序也都是在SDSoC这一个开发环境中执行和实现。但SDSoC并不是完全独立完成了包括估算、编译、调试和配置等等的过程,真正完成这些工序的仍然是在后台被SDSoC自动调用的各种赛灵思已经成熟商用的软件,包括Vivado、HLS、IPI和SDK等等。
换句话说,SDSoC的问世并不是为了替代在它之前已经用于Zynq SoC开发的各个独立的工具,而是将其整合在一起,并提供全系统编译和特征分析。是提升SoC开发的设计效率和生产力的一大利器。
首先,所有算法输入可以都是由C/C++写成,或是有部分为Vivado HLS生成的IP,甚至可以就是由HDL写成的IP,只要将其设为C语言可调用IP即可。 主函数下面包含一个矩阵乘法,和一个矩阵加法。SDSoC读入设计的源代码,我们选择将矩阵乘法和加法在PL中加速,而主函数仍然留在PS中运行。要实现这样的软硬件分区,用户仅需在 SDSoC中选择需要硬件加速的功能函数并指定即可。SDSoC会根据用户的划分来生成PS和PL之间的DataMover、配置硬件接口和软件驱动,输出成Vivado IPI工程,同时提供全系统性能分析和估算。用户可以根据需要对系统实现方式进行干预和改动。最后,SDSoC可以输出整个设计的FPGA比特流文件和可以用来启动操作系统的软件引导映像。
这一过程全部都在SDSoC的界面中完成,并且可以在短短数个小时内探索多个系统配置方案,找到相对最佳性能的实现方案,并加载到目标板上进行调试和验证。放在以往软硬件分别设计的传统流程上简直不可想象。
赛灵思在2015年七月宣布开放正式版SDSoC开发环境,现在我们的官网可以下载这一软件,正式支持的开发板也在逐步增加中,除了在目前版本上打开SDSoC可以看到的包括赛灵思ZC702、706等开发平台,还有很多已经认证的第三方开发平台,更多的平台正在逐步加入。
打开SDSoC创建一个新的工程,就可以看到可选的Platform,下拉菜单显示的是目前版本上已经支持的所有内置平台。有些特定应用平台可能需要额外下载和安装,具体所有支持的平台列表可以在官网链接上查看。
此外赛灵思及其函数库合作伙伴还提供包括OpenCV、线性代数和信号处理在内的库函数。我们还新增了八家认证设计服务联盟成员以扩展生态系统,从而使世界各地的设计团队能够充分发挥全面可编程 Zynq SoC和MPSoC的性能进行自己的设计开发。
如果上面所列这些开发平台都不能满足您的设计需要,也没有问题,因为SDSoC同样支持您自己开发的含有Zynq SoC或MPSoC的开发板。当然,在使用SDSoC在您的开发板上进行设计之前,还需要把您的开发板转换成相应的设计平台描述文件,导入到SDSoC中,这样,在启动SDSoC并开始一个新的设计时,便可以在目标开发平台的下拉菜单中找到您自己的开发板。
要在SDSoC中创建客户定制平台并不复杂,只需要从现有的Vivado IPI工程和软件项目工程中导出工具所需的硬件平台和软件平台元数据,最后将数据以SDSoC要求的形式打包放入指定的路径即可。更具体的操作方法和流程,欢迎查看SDSoC安装目录下的UG1146文档以及相关快速入门视频,具体做法在本文不做深入讨论。
这篇短文旨在帮助大家了解赛灵思针对提升异构Zynq SoC以及MPSoC的设计生产力而推出的SDSoC开发环境,通过对赛灵思软件定义相关解决方案的介绍,以及对使用SDSoC前后Zynq SoC开发流程的比较,希望让大家有个更直观的认识,选用更先进高效的设计工具,提升SoC设计生产力。
再次说明,以上为其他博文转载内容,仅供读者作为后续继续学习ZYNQ之前需要了解的基本概念。