本文是关于Xilinx HLS的简单介绍,从HLS是什么以及HLS的优势出发,进一步阐述了其功能,并针对Xilinx官方的例子对其进行了分析。关键观点包括

  • HLS采用C/C++等高级语言描述功能,可以降低FPGA代码的开发时间
  • HLS的应用对象是硬件工程师,IP的架构设计依旧由工程师自行指定
  • Vivado HLS提供了一套较为完整的代码开发、性能分析和优化、C/RTL仿真、IP导出流程

1.使用HLS的动机

HLS(High Level Synthesis,高层次综合)是一种代码的综合技术,特别的,本文中描述的HLS特指Xilinx FPGA上应用的HLS。FPGA的基本知识可以从FPGA学习之基本结构得到。Xilinx的文档《Introduction to FPGA Design with Vivado High-Level Synthesis》中的两幅图可以很好的回答这一问题。

上图表明,虽然FPGA具有的高的性能,然而采用RTL设计FPGA代码需要较长的开发时间。

然而,采用HLS之后,FPGA开发的时间大大降低了,甚至可能低于DSP和GPU;这大大加速的FPGA的开发时间,使得开发具有了更强的灵活性和高效性,HLS的逐步完善使得FPGA的开发高效性更进一步。技术的发展使得人们可以把精力放在设计上,而更少的去关注底层的具体实现。

2.HLS是什么?

Vivado的HLS工具的前世今生可以从AutoESL与Xilinx那些人和事中看到,这篇文章写得很有趣。HLS是高层次综合的的简称,“综合”即“Synthesis”,在ug627《XST User Guide》中解释综合是将程序代码翻译为称为NGC的特殊网表文件中,这样才能够对其进行实现。

至于“层次”,或许可以这样理解。书中一般把FPGA设计分为以下几个级别(对于这个分级实际上没有一个特定的说法,可以参考第13章抽象级别的描述):

  • 系统级
  • 算法级
  • RTL级
  • 门级、开关级

一般认为RTL级及以下设计是可用的,“层次”即从什么角度去描述想要实现的功能。譬如,a xor b采用门级描述就是a,b是一个异或门的输入;而采用高一点层次描述就是a+b。显然,越低层次的描述越困难,后文例子中也能发现这一点。

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

3.Vivado HLS的使用

《Vivado Design Suite Tutorial :High-level Synthesis》是一本针对Xilinx HLS的很好的入门指南。通过几个具体的例子,文档手把手的介绍了Vivado HLS的使用方式以及功能。本节将更进一步的对其进行补充

3.1 C代码编写

Vivado HLS实现的最基本的功能是将C/C++代码综合为HDL代码。所以编程使用的语言是C/C++语言。下面是其中的一个例子(代码为Xilinx例程)

 *******************************************************************************/
#include "fir.h" void fir (
data_t *y,
coef_t c[N],
data_t x
) {
#pragma HLS INTERFACE ap_vld port=x #pragma HLS RESOURCE variable=c core=RAM_1P_BRAM static data_t shift_reg[N];
acc_t acc;
data_t data;
int i; acc=;
Shift_Accum_Loop: for (i=N-;i>=;i--) {
if (i==) {
shift_reg[]=x;
data = x;
} else {
shift_reg[i]=shift_reg[i-];
data = shift_reg[i];
}
acc+=data*c[i];;
}
*y=acc;
}

代码实现了一个FIR滤波器,输入输出关系如下式所示

和编写一般的C代码不同,编写HLS代码依旧需要保留硬件的思想,时刻注意硬件的限制。这一点也可以从工具的名字看出,Vivado这套设计套件是提供给硬件工程师使用的。在进行C代码设计之前,我们需要对数据从哪来,写到哪里去,计算过程中的并行度/流水线和各类存储的访问有明确的设计。C代码实际上只是具体设计的描述,其编写方式不是随意的。

3.2 Pragma

和一般C代码不同,HLS里有特定的Pragma来对代码进行进一步指定,这是因为从C代码中,编译器往往得不到足够的信息来完成优化工作,譬如

  • 数据的输入输出采用何种接口
  • 程序内部的计算并行度是多少
  • 计算过程中是否需要进行流水线设计

这一些无法在C代码中指定的内容,可以采用Pragma进行指定,以对综合过程进行更高的控制。

譬如在上述FIR滤波器的例子中,可以使用采用更多的资源进行乘加操作,以达到更高的性能,同时对存储进行设计以防止访存的冲突,具体的pragma为

#pragma HLS UNROLL

#pragma HLS ARRAY_PARTITION variable=shift_reg complete dim = 1

3.3 性能分析

可以在综合后的报告中对Performance进行评估,也可以在Analysis窗口进行其调度的进一步分析,以判断性能是否满足预期,如下图所示

可以看到当了UNROLL LOOP操作后,吞吐量得到了提升(solution3 v.s. solution1)。上述优化以吞吐量为目标的,利用流水结构以及Unrolled loop可以优化吞吐量,原因如下图所示

3.4 C/RTL仿真

在HLS中进行仿真较为简单,采用testbench完成c语言的仿真后,RTL的仿真过程可由综合器自动完成,点击按钮即可。也可具体查看仿真波形。

3.5 导出IP

4. 参考资料

ug902《Vivado Design Suite User Guide:High-level Synthesis》

ug871《Vivado Design Suite Tutorial :High-level Synthesis》

高层次综合(HLS)-简介的更多相关文章

  1. Java高并发综合

    这篇文章是研一刚入学时写的,今天整理草稿时才被我挖出来.当时混混沌沌的面试,记下来了一些并发的面试问题,很多还没有回答.到现在也学习了不少并发的知识,回过头来看这些问题和当时整理的答案,漏洞百出又十分 ...

  2. TensorFlow高层次机器学习API (tf.contrib.learn)

    TensorFlow高层次机器学习API (tf.contrib.learn) 1.tf.contrib.learn.datasets.base.load_csv_with_header 加载csv格 ...

  3. mysql高可用架构 -> MHA简介-01

    作者简介 松信嘉範:MySQL/Linux专家2001年索尼公司入职2001年开始使用oracle2004年开始使用MySQL2006年9月-2010年8月MySQL从事顾问2010年-2012年 D ...

  4. Kotlin将Realm提升到更高层次

    作者:Víctor Manuel Pineda 时间:Feb 14, 2017 原文链接:https://antonioleiva.com/kotlin-realm-extensions/ 当有人问我 ...

  5. <转>Java 高并发综合

    并发模型 悲观锁和乐观锁的理解及如何实现,有哪些实现方式? 悲观锁 悲观锁假设最坏的情况(如果你不锁门,那么捣蛋鬼就会闯入并搞得一团糟),并且只有在确保其他线程不会干扰(通过获取正确的锁)的情况下才能 ...

  6. 基于URL的高层次Java网络编程

    一致资源定位器URL URL(Uniform Resource Locator)是一致资源定位器的简称,它表示Internet上某一资源的地址.通过URL我们可以访问Internet上的各种网络资源, ...

  7. Zynq开发之HLS

    Zynq开发之HLS 由 FPGA菜鸟 于 星期三, 06/28/2017 - 11:53 发表 HLS简介 HLS(High Level Synthesis)即高层次综合,不同于以往的FPGA逻辑开 ...

  8. ZED-Board从入门到精通系列(八)——Vivado HLS实现FIR滤波器

    http://www.tuicool.com/articles/eQ7nEn 最终到了HLS部分.HLS是High Level Synthesis的缩写,是一种能够将高级程序设计语言C,C++.Sys ...

  9. Xilinx HLS

    Xilinx 的高层次综合(High Level Synthesis, HLS)技术是将C/C++/SystemC软件语言转换成Verilog或VHDL硬件描述语言的技术.现已应用在SDAccel,S ...

随机推荐

  1. 使用jsonp进行跨域访问

    一.使用场景 当我们请求非本服务器的资源的时候,浏览器会禁止访问,并提示不允许跨域访问.此时我们可以使用jsonp这种请求方式,从其他服务器获取资源.在客户端调用提供jsonp支持的接口,获取json ...

  2. Eclipse 快捷键 篇

    1. Ctrl+Shift+R:打开资源这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xml ...

  3. BIG biang教你误删oracle 怎么办,

    今天无意中在网上看到了关于oracle误删除数据恢复的一条信息,发现的确很好使,下面就我的测试向大家汇报下. 1. select * from t_viradsl2 t         //查询t_v ...

  4. 烂泥:LVM学习之逻辑卷LV及卷组扩容VG

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 上篇文章中介绍了有关LVM基础的知识,这篇文章我们来介绍如何给LVM的逻辑卷LV及卷组VG扩容. LVM的逻辑卷,我们知道它最后相当于一个分区,既然是一 ...

  5. diff, cmp, patch

    diff 以行为单位比较两个文件之间的差异,经常用来查看同一个文件的新旧版本的差异,通常用在文本文件的比较,可以使用重定向'>'制作补丁文档,通常以.patch结尾 \(diff [-bBi] ...

  6. libstdc++

    一.简介 二.安装 http://www.linuxfromscratch.org/lfs/view/development/chapter05/gcc-libstdc++.html 三.其他 1)l ...

  7. HBase性能调优

    因官方Book Performance Tuning部分章节没有按配置项进行索引,不能达到快速查阅的效果.所以我以配置项驱动,重新整理了原文,并补充一些自己的理解,如有错误,欢迎指正. 配置优化 zo ...

  8. codeforces 711B B. Chris and Magic Square(水题)

    题目链接: B. Chris and Magic Square 题意: 问在那个空位子填哪个数可以使行列对角线的和相等,就先找一行或者一列算出那个数,再验证是否可行就好; AC代码: #include ...

  9. C# Reflection BindingFlags

    定义包含在搜索中的成员 下列 BindingFlags 筛选标志可用于定义包含在搜索中的成员: 为了获取返回值,必须指定 BindingFlags.Instance 或 BindingFlags.St ...

  10. js知识体系的梳理一

    今天简单的总结了js的一些东西,梳理下整个体系,每一次的总结都会有不同的收获:js总结一一.[获取元素]: 1.通过ID: var oBtn=document.getElementById('btn1 ...