ihc_hls_enqueue(void *retptr, void *funcptr,/*function arguments*/)
ihc_hls_enqueue_noret(void* funcptr,/*function arguments*/)
ihc_hls_component_run_all(void* funcptr)
HLS简介
HLS(High-Level Synthesis)高层综合,就是将 C/C++的功能用 RTL 来实现,将 FPGA 的组件在一个软件环境中来开发,这个模块的功能验证在软件环境中来实现,无缝的将硬件仿真环境集合在一起,使用软件为中心的工具、报告以及优化设计,很容易的在 FPGA 传统的设计工具中生成 IP。
传统的 FPGA 开发,首先写 HDL 代码,然后做行为仿真,最后做综合、时序分析等,最后生成可执行文件下载到 FPGA 使用,开发周期比较漫长。
使用 HLS,用高级语言开发可以提高效率。
因为在软件中调试比硬件快很多,在软件中可以很容易的实现指定的功能,而且做 RTL仿真比软件需要的时间多上千倍。
普通仿真就是不调用以上函数,不使用流水线进行仿真。
#include "HLS/stdio.h"
#include "HLS/hls.h"
#include "assert.h"
#include "stdio.h"
component int multi(int a,int b)
{
return a*b;
}
int main()
{
srand(0);//0是随机数的种子
int x,y,z,i;
for(i = 0;i<10;i++)
{
x = rand() % 10;
y = rand() % 10;
z = multi(x,y);
// printf("%d = %d + %d \n",z,x,y);
// assert(z == x+y);//断言函数,出错时报错
}
return 0;
}
cd ..
,使用两次,然后有一个init_hls.bat
文件,用它来初始化每次打开一个终端都要进行初始化.
在默认情况下是生成
a.exe
文件,如果需要指定 则在后面加-o b.exe
下一节流水线会用到
_inst
文件到wavemulti_inst
使用流水线仿真,我们不会用到第二个函数。
#include "HLS/stdio.h"
#include "HLS/hls.h"
#include "assert.h"
#include "stdio.h"
component int multi(int a,int b)
{
return a*b;
}
int main()
{
srand(0);//0是随机数的种子
int x[10],y[10],z,i;
for(i = 0;i<10;i++)
{
x[i] = rand() % 10;
y[i] = rand() % 10;
ihc_hls_enqueue(&z,&add,x[i],y[i]);
}
ihc_hls_component_run_all(multi);
return 0;
}
在默认情况下是生成
a.exe
文件,如果需要指定 则在后面加-o b.exe
为了方便查看生成的报告,所以我们这里的命令后会加-o x.exe
i++ -march=x86-64 multi.c -v -o b.exe
b
i++ -march=CycloneV multi.c -v -ghdl -o b
b
vsim b.prj\verification\vsim.wlf
可见同样有延时并是流水线进行,一组数据直接没有时间间隔。
a.prj
与b.prj
下的报告a.prj
可见两者所用资源情况完全相同。
ifdef
条件编译来分块使用#include "HLS/stdio.h"
#include "HLS/hls.h"
#include "assert.h"
#include "stdio.h"
#define DEBUG //不注释掉时使用前面的代码
component int multi(int a,int b)
{
return a*b;
}
int main()
{
srand(0);//0是随机数的种子
#ifdef DEBUG
int x,y,z,i;
for(i = 0;i<10;i++)
{
x = rand() % 10;
y = rand() % 10;
z = multi(x,y);
// printf("%d = %d + %d \n",z,x,y);
// assert(z == x+y);//断言函数,出错时报错
}
#else
int x[10],y[10],z,i;
for(i = 0;i<10;i++)
{
x[i] = rand() % 10;
y[i] = rand() % 10;
// z[i] = add(x[i],y[i]); //不能赋值
ihc_hls_enqueue(&z,&add,x[i],y[i]);
}
ihc_hls_component_run_all(multi);
#endif
return 0;
}