参考资料https://www.bilibili.com/video/BV1bt41187RW?p=4
HLS
工程新建
通过hls建立一个VectorAdd工程
记得芯片选xc7z020clg400-1
源文件
首先添加头文件VectorAdd.h
#define N 5
typedef int data_t;
void VectorAdd(data_t A[N],data_t t,data_t B[N]);
然后添加源文件VectorAdd.cpp
#include "VectorAdd.h"
void VectorAdd(data_t A[N],data_t t,data_t B[N])
{
unsigned int i;
myloop:
for(i=0;i<N;i++)
{
B[i] = A[i] + t;
}
}
还有一个testbench文件
#include <iostream>
#include <iomanip>
#include "VectorAdd.h"
using namespace std;
int main(){
data_t A[N] = {-4,-3,0,1,2};
data_t c = 5;
data_t B[N] = {0};
data_t RefB[N] = {1,2,5,6,7};
unsigned int i = 0;
unsigned int errcnt = 0;
VectorAdd(A,c,B);
cout<<setfill('-')<<setw(30)<<'-'<<'\n';
cout<<setfill(' ')<<setw(10)<<left<<"A";
cout<<setfill(' ')<<setw(10)<<left<<"C";
cout<<setfill(' ')<<setw(10)<<left<<"B"<<'\n';
cout<<setfill('-')<<setw(30)<<left<<'\n';
for ( i = 0;i<N;i++)
{
cout<<setfill(' ')<<setw(10)<<left<<A[i];
cout<<setfill(' ')<<setw(10)<<left<<c;
cout<<setfill(' ')<<setw(10)<<left<<B[i];
if(B[i] == RefB[i])
{
cout<<'\n';
}
else
{
cout << "(" << RefB[i] << ")" << '\n';
errcnt ++ ;
}
}
cout << setfill('-') << setw(30) << '-' <<'\n';
if(errcnt > 0)
{
cout << "Test Failed" << '\n';
return 1;
}
else{
cout<< "Test Passed" << '\n';
return 0;
}
}
仿真
执行C仿真,可以得到一个结果
是根据我们的testbench文件进行的向量相加。
OK,接下来C综合,然后跑一下RTL和C的联合仿真
dump trace选择auto
之后点击查看波形
Vivado将会被自动打开
可以根据需要查看波形
pipeline 优化
新建一个solution
对myloop insert一个derivative
然后继续综合
选择compare reports来进行一下比较
solution2的latency和interval确实吧1小了
这个优化也可以被直接写到源文件中,循环变为
myloop:
for(i=0;i<N;i++)
{
#pragma HLS PIPELINE
B[i] = A[i] + t;
}