一、实验目的
-
HLS是什么?与VHDL/Verilog编程技术有什么关系?
-
HLS有哪些关键技术问题?目前存在什么技术局限性?
-
在win10(或者Ubuntu系统下)安装 Intel 或者 Xilinx 的支持HLS的FPGA编程开发软件(Quartus18或者Vivado18),设置好环境,完成一个入门级的HLS程序,并进行仿真或者实际开发板运行。
二、HSL介绍
高层次综合(HLS)-简介
HLS高层次综合(High Level Synthesis)是Xilinx公司推出的最新一代的FPGA设计工具,它能让用户通过编写C/C++等高级语言代码实现RTL级的硬件功能。
HLS是高层综合(High level Synthesis)是将C或者c++语言编译为FPGA能够读懂和运行的RTL级别的语言。
Verilog可以精准的控制电路实现,但实现起来需要较长的周期,而HLS虽然可快速迭代,但其从软件到硬件翻译无论是面积还是资源均难以控制。
HLS的时钟周期没办法顺利过渡到verilog的时钟控制,不存在哪种良好的转换关系。
三、关键技术与局限
1. HLS关键技术
1、将高级语言转化为RTL电路
2、循环优化,并行处理
2.关键技术问题
动态参数:HLS禁止动态分配指针,因为硬件设计通常具有多个存储空间,并且该工具必须知道函数打算访问哪个存储空间,以便可以相应地放置电线连接。动态传递函数参数的一种方法是通过静态定义所有可能的函数调用并对每个参数进行硬编码来引入间接层,然后使用条件语句动态选择正确的调用。
并行执行:为了确保正确执行,HLS禁止访问同一数组的函数并行运行。由于不支持常量参数,因此它包括只读函数,因为无法对它们进行分类。必须拆分或复制数组,或者必须合并函数以启用并行执行。
内存过度分配:有两种方法可以将大型阵列合成为多个 BRAM 块链。首先是宽度扩展,它可以在多个 BRAM块之间分配字位,并在每次使用内存的情况下同时激活多个块。第二个是深度扩展,它在每个块中存储完整的字,并使用多路复用器在每次存储访问中激活一个块,但会增加逻辑和延迟。为了实现高性能设计,HLS似乎更喜欢宽度扩展,这会导致禁止使用 BRAM,尤其是在字非常宽且块未充分利用时。这样,将大型阵列拆分为较小的阵列以充分利用 BRAM 块可以大大减少内存使用量。
资源重用:序列化执行和重用逻辑的最有效方法是通过内联子功能提取公共逻辑。相反,关闭内联会重复资源并启用并行执行,尽管这种方法并不总是成功。确保并行执行的一种肯定但不太方便的方法是复制函数并以不同的方式重命名它们。当然,这种方法使代码难以维护,但是在某些情况下可能是不可避免的。
浮点累加器:由于没有浮点累加支持,实现累加的最有效方法是使用部分和和树加法器。
3.局限
1、与Verilog相比,能做到的优化十分有限
2、HLS编译器是静态工具,对理解代码的动态特性没有任何帮助
3、对于一些简单的逻辑,HLS实现结果较为臃肿
4、HLS对开发人员的要求比较高。
四、环境搭建
1、初始化
1.打开系统命令管理器cmd,定位到init_hls.bat的路径,并运行
d:
cd D:\intelFPGA\18.1\hls
init_hls.bat
2、编写测试文件
在桌面新建文件夹prj,创建text.cpp,编写如下乘法器代码:
#include “HLS/hls.h”
#include “stdio.h”
component int mul(int a,int b)
{
int c =0;
c = a*b;
return c;
}
int main()
{
int a=0,b=0,c=0,i=0;
for(i=0;i<5;i++)
{
a= i+1;
b= i+2;
c = mul(a,b);
printf("%d * %d = %d\n",a,b,c);
}
return 0;
}
3、编辑测试文件
1.切换到刚刚新建的工程目录
c:
cd C:\Users\han\Desktop\prj
i++ -march=x86-64 -o mul.exe test.cpp 用于生成mul.exe文件
2.运行mul.exe文件
mul.exe
3.生成镜像文件
i++ -march=CycloneV -o mul test.cpp -ghdl
4.继续运行mul.exe文件,产生波形文件vsim.wlf
mul.exe
5.查看报告
3、导入自编辑IP核
将生成的 components 文件夹的路径导入到quartus中
Tools–>Options–>IP Setting–>IP Catalog Search Locations
五、总结
通过本次实验对HLS与Verilog编程技术关系有了一定理解,查阅资料按步骤成功搭建好了环境。