Vitis HLS 构建项目并生成IP核(Vivado HLS)

Vitis HLS 构建项目并生成IP核(Vivado HLS),第1张

前言

Vitis HLS,可以通过它,用C和C++建立和封装一个IP核,从Vivado 2021的版本开始内置,用于替代Vivado HLS,由于它太新了,网上有关教程很少(2020的版本还是Vivado HLS),所以这个系列的文章,用于记录如何使用Vitis HLS。

使用Vitis HLS开发时,最好不要再使用C语言,而是C++,同时,使用一些旧教程中提到的"ap_cint.h"头文件会报错,这点请看后文提到的“错误1”。

所以本文所有代码将使用C++。

新建工程 建立工程

打开软件后,新建一个工程。


设置好工程目录和工程名。


一路next,它要我们添加两个文件,我们这里略过。

到了选择器件一栏。


我这里使用的是xc7z020clg400-2。


点击ok,然后点击finish,就到了开发界面。


编辑源码

一开始,我们关注左上角的窗口。


在Source一栏,我们新建两个源文件。


在工程目录下新建一个“src”文件夹用于存放代码文件。

这里新建一个h头文件和一个cpp文件。

由于使用的是C++,文件名后缀是cpp。


新建好了后,窗口会显示。


这里给出两个文件的代码。

  • led_twinkle.h
#include 
void led_twinkle(ap_int<1> *led);
  • led_twinkle.cpp
#include "led_twinkle.h"

#define DELAY_TIME 50000000
#define DELAY_TIME_HALF 25000000 //optimize
//50000000

void led_twinkle(ap_int<1> *led){
	int i;
	for(i = 0;i < DELAY_TIME;i++){
		if(i < DELAY_TIME_HALF)
			*led=0;
		else
			*led=1;
	}
}

注意:以下所有截图中代码都有错,请按上面列出的代码运行

设置端口

在led_twinkle.cpp文件下,关注右上角的窗口。


给函数添加一个指令。


按照下面图片设置。

注意,这里如果设置不对,后期会报错,具体参见错误4。


给输出端口也添加一个指令。


同样地,要按下图设置,设置不对会报错,具体参见错误4。


设置好了后,源码中会自动添加有关代码,这里不建议自己添加,最好用软件自动生成。


添加测试

在“Test Bench”里,新建一个源文件,叫做led_twinkle_test.cpp。


源码如下。

  • led_twinkle_test.cpp
#include "led_twinkle.h"

ap_int<1> led_1;

int main(){
	led_twinkle(&led_1);
	printf("Run successfully!");
	return 0;
}

然后需要设置顶层函数。


选择刚刚设置好的函数。


验证测试

要想正确生成IP核,以下四个测试都必须通过。


C语言仿真

运行C语言仿真。


除了本身的语法错误会报错,如果用的是C语言写的,而非C++,此处也会报错,见错误1。

printf代码的结果,会在这里显示,和C语言的控制台一样,输出一些自己编写的测试信息。


C语言综合

运行C语言综合。


如果没有安装最新的补丁,此处可能会报错,见错误2。

而如果端口设置错误,会出现错误4。

仿真结束后会接口信息等有关的信息。


C/RTL仿真

运行C/RTL仿真。


按照如下的设置。


结束之后会出现结果。


导出RTL

运行导出RTL。


默认即可,可以不用设置输出目录。


会提示导出成功。


IP核被生成在默认的目录下。


最终结果

生成的IP核可以在Vivado中显示了。

验证和测试将放到下一篇文章。


报错集合 错误1
unexpected top argument type: type of the parameter is C language  Arbitray-precesion type

找了很久的答案,发现了问题,是这个头文件出错。

从Vitis 2021开始(Vivado 2021),官方明确不再支持这个头文件,同时推荐使用C++开发。

而很多老旧教程的代码中依然使用这个头文件,它们用的是C语言。


官方给出的说明和解决方法:

Vitis HLS:C 语言支持

解决方法是将引用的改为,同时有关的数据类型需要进行修改。


错误2
clang compile failed: child process exited abnormally

其实这里已经提示了,找不到有关的头文件,但是头文件明明是包含在工程中的。


其实是因为使用include的时候,双引号引用和尖括号引用的区别。

在本次错误中,错误地使用了双引号引用。


改成双引号引用即可。


错误3
Failed to generate IP

这个报错。

控制台中没有给出具体的信息,其实只要安装最新的补丁即可。

参考下面的链接。

Export IP Invalid Argument / Revision Number Overflow Issue (Y2K22)

将下载好的补丁解压到软件目录中,按住Shift键再按鼠标右键,打开控制台。


输入README中给出的代码即可。


运行结果。

补丁安装成功,重启软件就可以了。


错误4

出现警告

WARNING: [RTGEN 206-101] Port 'led' with mode 'ap_none' may require an associated data valid signal to correctly communicate with other blocks or a test bench; automatic C/RTL co-simulation may not be able to verify such a port.

出现错误

ERROR: [COSIM 212-4] *** C/RTL co-simulation finished: FAIL ***  

出现类似错误的,都是因为端口设置出错。

很多旧教程中,说到函数要设置成"ap_ctrl_none",以及端口设置成"ap_none",但是这会带来不确定性。

正确的做法是设置成"ap_ctrl_hs"以及"ap_hs",这样就不会报错了,结果也是一致的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/674936.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存