Vitis HLS,可以通过它,用C和C++建立和封装一个IP核,从Vivado 2021的版本开始内置,用于替代Vivado HLS,由于它太新了,网上有关教程很少(2020的版本还是Vivado HLS),所以这个系列的文章,用于记录如何使用Vitis HLS。
使用Vitis HLS开发时,最好不要再使用C语言,而是C++,同时,使用一些旧教程中提到的"ap_cint.h"头文件会报错,这点请看后文提到的“错误1”。所以本文所有代码将使用C++。
一路next,它要我们添加两个文件,我们这里略过。到了选择器件一栏。
在工程目录下新建一个“src”文件夹用于存放代码文件。这里新建一个h头文件和一个cpp文件。由于使用的是C++,文件名后缀是cpp。
这里给出两个文件的代码。
#include
void led_twinkle(ap_int<1> *led);
#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;
}
}
注意:以下所有截图中代码都有错,请按上面列出的代码运行
按照下面图片设置。注意,这里如果设置成ap_ctrl_none,在C/RTL仿真时会报错,具体参见错误4(当然也可以跳过C/RTL仿真)。
同样地,要按下图设置,设置成ap_none会弹警告,具体参见错误4(也可以不理会,设置成ap_none)。
设置好了后,源码中会自动添加有关代码,这里不建议自己添加,最好用软件自动生成。
在“Test Bench”里,新建一个源文件,叫做led_twinkle_test.cpp。
源码如下。
#include "led_twinkle.h"
ap_int<1> led_1;
int main(){
led_twinkle(&led_1);
printf("Run successfully!");
return 0;
}
除了本身的语法错误会报错,如果用的是C语言写的,而非C++,此处也会报错,见错误1。printf代码的结果,会在这里显示,和C语言的控制台一样,输出一些自己编写的测试信息。
如果没有安装最新的补丁,此处可能会报错,见错误2。而如果端口设置错误,会出现错误4。仿真结束后会接口信息等有关的信息。
结束之后会出现结果。如果将函数设置成ap_ctrl_none,会报错,具体参见错误4(当然也可以跳过C/RTL仿真)。
生成的IP核可以在Vivado中显示了。验证和测试将放到下一篇文章。
如果函数和端口分别设置"ap_ctrl_none"和"ap_none",则是下面这样。在下一篇验证IP核的文章将使用按这样设置产生的IP核。
unexpected top argument type: type of the parameter is C language Arbitray-precesion type
找了很久的答案,发现了问题,是
官方给出的说明和解决方法:
Vitis HLS:C 语言支持
clang compile failed: child process exited abnormally
其实这里已经提示了,找不到有关的头文件,但是头文件明明是包含在工程中的。
其实是因为使用include的时候,双引号引用和尖括号引用的区别。在本次错误中,错误地使用了双引号引用。
Failed to generate IP
这个报错。控制台中没有给出具体的信息,其实只要安装最新的补丁即可。参考下面的链接。
Export IP Invalid Argument / Revision Number Overflow Issue (Y2K22)
将下载好的补丁解压到软件目录中,按住Shift键再按鼠标右键,打开控制台。
出现警告
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",这样就不会报错了,结果也是一致的。
但是设置将函数设置成"ap_ctrl_hs",也就是一种双向协议,会引入很多IO口。使用"ap_ctrl_none"也是可以的,就是需要跳过C/RTL仿真。
Vitis IDE launch failed
这个错误在使用SDK开发的时候会出现。一些教程中会教你,使用Vivado生成PS核之后,用Vitis生成顶层文件。但是如果安装软件的时候选择的是免费版,或者选择第二项Vivado,则会少安装Vitis这个软件。
注意:Vitis HLS和Vitis是两个不同的软件。免费版不包含Vitis。