Vivado-HLS

Vivado HLS 程序优化(基础实例)

前言(本文基于赛灵思官方HLS文档UG871中的7.1节):

          在使用高层次综合,创造高质量的RTL设计时,一个重要部分就是对C代码进行优化。

          Vivado HLS拥有自动优化的功能,试图最小化loop和function的latency,为了实现这一点,软件会在loop和function上并行执行尽可能多的操作(比如说,在function级别上,高级综合总是试图并行执行function)。 

          除了这些自动优化,我们可以手动进行程序优化,即用在不同的solution中添加不同的directive的方法,进行优化和性能对比。其中,对同一个工程,可以建立多个不同的solution(解决方案),为不同的solution添加directive可以达到如下目的: 

1、并行执行多个tasks,例如,同一个function的多次执行或同一loop的多次迭代。这是流水线结构。 

2、调整数组的物理实现((block RAM),函数,循环和端口(I/O),以提高数据的可用性,并帮助数据流更快地通过设计。 

3、提供关于数据dependency的信息,或者缺乏数据dependency,允许执行更多的优化。最终的优化是修改C源代码,以消除在代码中意外的dependency,但是这可能会限制硬件的性能。 

Vivado HLS 开发步骤(高级综合)

对于Vivado Hls来说,输入包括Tesbench,C/C++源代码和Directives,相应的输出为IP Catalog,DSP和SysGen,特别的,一个工程只能有一个顶层函数用于综和,这个顶层函数下面的子函数也是可以被综合的,会生成相应的VHDL和Verilog代码,所以,C综合后的RTL代码结构通常是跟原始C描述的结构是一致的,除非是子函数功能很简单,所需要的逻辑量很小。 通常在main函数以下的函数都可以被综合,也就是说,并不是所有的C/C++都可以被综合,动态内存分配和涉及到操作系统层面的操作不可以被综合。

本文结构框架:

  • Creat New Project新建文档
  • C simulation
  • C systhesis
  • RTL级仿真
  • IP封装
  • 总结
  • 1.Creat New Project新建文档:

    在Vivado HLS中综合时如何指定端口的综合类型

    如果你对Vivado HLS中综合之后端口的ap_none之类的类型指示摸不着头脑的话,那就来一起学习一下它们是如何使用的吧。在Vivado HLS中,我们可以指定端口使用的类型,这样在对C代码进行综合的时候,就可以指定某个端口所使用的转换协议了。常见的类型有:

    1. ap_none

    默认类型,该类型不适用任何I/O转换协议,它用于表示只读的输入信号,对应于HDL中的wire类型。

    2. ap_stable

    只用于输入信号,其具体实现方式仍为ap_none。它用于向Vivado HLS的综合器表明该信号在两次复位之间值是不变的。

    3. ap_vld

    在数据端口port_name的基础上创建一个额外的数据有效信号指示< port_name >_vld。

    4. ap_ack

    在数据端口port_name的基础上创建一个额外的应答信号指示< port_name >_ack。

    5. ap_hs

    使用该类型,则会同时创建额外的数据有效信号和应答信号,其效果相当于ap_vld与ap_ack之和。

    6. ap_ovld

    对于输入信号,其效果与ap_none是一样的。

    Vivado HLS入门

    前言
    FPGA的能耗比优于GPU,且设计自由度高,受到许多深度学习开发者的青睐。但是用HDL语言开发神经网络过于复杂,利用Xilinx公司的高层次综合工具vivado HLS开发RTL逻辑的IP核则可以降低开发难度。

    本文主要描述了如何使用vivado HLS的基本功能。文章内容主要来自于Xilinx官方文档:ug871-vivado-high-level-synthesis-tutorial,所用代码来自于Xilinx官方例程:ug871-design-files\2016.1\Introduction\lab1。读者可以在原文档中阅读到更详细的内容。

    工具说明

    Vivado HLS开发流程简单介绍

    在传统的FPGA设计流程中,一般是自顶向下的模块化设计,这些模块包括用户自己编写的RTL或者是供应商提供的IP核。而在Xilinx新推出的高生产力设计流程中是以IP为核心的,把所有的模块都看做是IP,封装为IP,最主要的是IP的设计是基于C语言的,最后通过HLS将C语言代码转化为RTL,这能极大的加快设计进程。从这段时间的学习来看,HLS综合出来的电路比我自己写的RTL更省资源,在时序方面可能会差一些,因为我自己是习惯性的全流水,但它也满足了时序的要求。HLS还提供了非常多的经过深度优化的库,所以我个人觉得HLS综合的电路已经比很多刚接触FPGA不久的工程师要好了,传统的RTL设计可能不会消失,但很可能会越来越少了。

    HLS在不添加任何优化指令的情况下默认综合电路为最节省资源的情况,即能使用分时复用就使用分时复用,能在一个周期中完成多个操作(满足时钟频率约束的要求)则绝不流水。从这里得到的启发是,设计不要过度的流水,只要能满足时钟频率的需求,我们在一个时钟周期内可以进行多个操作,于是在低频率的系统中,我们可以节省很多的寄存器资源。这样做还有一个好处是我们可以使用assign来完成逻辑设计,然后再对输出进行寄存,可以极大的减少代码量,增加代码的可读性,HLS综合后的RTL代码的风格就是这样的,当然因为命名的原因该代码几乎没有可读性,我们可以不用刻意去读懂它。

    【下载】:Vivado HLS (高层次综合) 教程

    本教程解释和演示所有将C,C ++和SystemC代码转换为RTL实现的步骤。 展示了如何创建初始RTL实现,然后将其转换为低带宽和高吞吐量的实现,方法是在不更改C代码的情况下使用优化指令。敬请点击下载:
    https://china.xilinx.com/support/documentation/sw_manuals/xilinx2017_1/u...

    【视频】:Vivado HLS 需要了解的知识点

    本次课程主讲32张图片、16组卷积滤波、输出16组结果,计算更加复杂,采用不同的IO接口设计,将结果进行比对,找出最佳方案。

    Vivado HLS嵌入式实时图像处理系统的构建与实现

    作者:张艳辉,郭洺宇,何 宾

    摘 要: 传统的基于CPU、GPU和DSP的处理平台难以满足图像实时处理的要求,而FPGA在并行图像处理上有着独一无二的优势,在性能和成本之间提供更加灵活的选择。通过Xilinx最新的Vivado HLS工具,设计实现了可变参数的拉普拉斯算子图像滤波算法,并且在ZYNQ-7000 SoC上构建了可视化的实时嵌入式图像处理系统。实验结果表明,系统可以实现不同的图像处理算法,很好地满足了图像处理的实时性、高性能、低成本要求,对未来高性能图像处理系统的设计和实现提供了很好的借鉴。

    0 引言

    关于Vivado HLS 的三大误读

    作者:高亚军,赛灵思高级战略应用工程师

    目前,在高层次综合(HLS, High Level Synthesis)领域,Vivado HLS可谓独树一帜。它有效地拉近了软件工程师与FPGA之间的距离,加速了算法开发的进程,缩短了产品上市时间。对于工程师,尤其是软件工程师而言是一个福音。在实际工程中,如何利用好这一工具仍值得考究。本文将介绍使用Vivado HLS时的几个误区。

    误区1:只要是C或者C++描述的算法都是可综合(可转换成RTL)的。
    HLS的可综合功能是有限的,并不是所有的C或者C++语句都可转换成相应的RTL代码。下面这些情形是不可综合的。
    1. 动态内存分配
    2. 涉及操作系统层面的操作
    3. 递归函数
    4. 数组规模可变

    误区2:既然Vivado HLS支持C、C++和System C,那么用三者任意一种都行。

    HLS使用指南

    HLS就是从高层次描述,之后综合成可用的网表文件的技术。这里的“高”指采用C、C++等编写程序,而不是传统的HDL语言。然而,实际上Vivado套件中是预先采用Vivado HLS这个软件将C程序转换成为Verilog HDL或者VHDL代码,之后进行下一步操作的,并不是直接综合C代码。

    关于HLS的来历可以从“AutoESL与Xilinx那些人和事”中看到,AutoESL可以直接把C语言转化为硬件描述语言 ,并且质量不仅比现有的所有ESL的工具要至少高2倍。该公司的愿景就是让不懂FPGA的人可以立即使用FPGA. 后来就是Xilinx收购AutoESL。下图HLS使用性能。

    VIVADO HLS具体功能可以参考《。。。Tutorial》和《。。。Synthesis》文档,以下是文档里的功能说明图。

    同步内容