1、前言:
《Vivado HLS初体验》一文中,使用别人设计的yuv_filter demo文件新建工程,添加了文件,基本掌握了新建工程和算法仿真的流程,由于没有完全按照现有的教程进行学习,所以对整个流程有了较好的理解。接下来,为了更好地理解HLS的设计方法,我打算自己设计一个简单的c算法和c testbench,对接下来的几个流程,如综合、RTL仿真、IP打包等,进行学习。
2、目标:
u对C函数进行综合
u查看RTL仿真结果
u将设计封装成IP
3、准备工作:
新建工程就不多说了,我们这里设计一个最简单的组合逻辑电路:2选1选择器。
Top function:mux21
mux21.c源码如下:
#include "mux21.h"
int1 mux21(int1 sig_a, int1 sig_b, int1 select)
{
if(0==select)
return sig_a;
else
return sig_b;
}
mux21.h内容为:
#include <ap_cint.h>
ap_cint.h这个头文件的包含,是为了使用int1类型,int1表示1位整型数。
testbench mux21_tb.c源码为:
#include
#include "mux21.h"
int main(void)
{
int1 res1 = 0;
int1 res2 = 0;
res1=mux21(1,0,0);
res2=mux21(0,1,1);
if(res1 && res2)
printf("test passed, well done!\n");
return 0;
}
这些代码都很简单,就不多做解释了,代码编写完成后,Run C Simulation,发现测试通过,打印如图1所示。
图1 C仿真结果
注意:编写代码时,发现错误,修改了之后,IDE可能不会自动检测,这里可以尝试使用Index功能,IDE会检测改动,消除错误提示。
举个例子:我使用了int1类型,但是没有包含ap_cint.h文件,显示效果如图2所示。
图2错误提示
这时,就算我修改代码,包含了ap_cint.h文件,错误提示依旧存在。需要手动Index C source,提示才会消除。操作如图3所示:Project > Index C Source,或者点击工具栏中的快捷按钮,图3红色方框内的图标。
图3 Index C Source
4、对算法进行综合
4.1、综合
如图4所示,在菜单中寻找命令:Solution > Run C Synthesis > Active Solution,点击Active Solution菜单,HLS会自动完成综合工作。
图4综合指令
此外,还可以直接点击工具栏中的快捷按钮(图5红色方框内),在下拉菜单中选择“Active Solution”命令,也能够启动综合进程。
图5综合指令快捷按钮
4.2、查看综合结果
进入工程文件夹,找到综合文件夹,查看所综合出的HDL代码,文件结构如图6所示。
图6目录结构
rpt文件显示“General Information(基本信息)”、“Performance Estimates(性能估算)”、“Utilization Estimates(资源利用估算)”、“(Interface接口)”等信息。
verilog文件夹下是综合出来的.v文件,vhdl文件夹下综合出来的是.vhd文件,打开mux21.v,代码为:
`timescale 1 ns / 1 ps
(* CORE_GENERATION_INFO="mux21,hls_ip_2014_2,{HLS_INPUT_TYPE=c,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=1,HLS_INPUT_PART=xc7z020clg484-1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=others,HLS_SYN_CLOCK=1.370000,HLS_SYN_LAT=0,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=0,HLS_SYN_LUT=0}" *)
module mux21 (
ap_start,
ap_done,
ap_idle,
ap_ready,
sig_a,
sig_b,
select_r,
ap_return
);
parameter ap_const_logic_1 = 1'b1;
parameter ap_const_logic_0 = 1'b0;
input ap_start;
output ap_done;
output ap_idle;
output ap_ready;
input [0:0] sig_a;
input [0:0] sig_b;
input [0:0] select_r;
output [0:0] ap_return;
assign ap_done = ap_start;
assign ap_idle = ap_const_logic_1;
assign ap_ready = ap_start;
assign ap_return = ((select_r)? sig_b: sig_a);
endmodule //mux21
主要功能语句:
assign ap_return = ((select_r) ? sig_b : sig_a);
由于这个设计过于简单,ap_start、ap_ready、ap_done、ap_idle以及ap_return信号的作用不太能体现出来,从命名来看,主要是用于控制模块工作的信号。
vhdl文件不多说了,一样的功能。
5、RTL仿真
5.1、HLS GUI操作
Solution > Run C/RTL Cosimulation,仿真完成后,需要在Vivado下查看仿真结果。
注意:Dump Trace选项要选择all,否则不会产生波形数据,位置如图7所示。
图7 Dump Trace
5.2、Vivado GUI操作
打开Vivado,在tcl控制台下键入以下指令:
cd E:/hls/mux21/solution1/sim/verilog/
current_fileset
open_wave_database mux21.wdb
open_wave_config mux21.wcfg
注释:
更改路径
加载工程
加载仿真数据
打开波形窗口
图8仿真结果
注意:此处的仿真结果和我们之前编写的C Testbench文件是对应的,因此,C Testbench要别编写的有针对性,才能很好地体现模块的功能。
我们这个Testbench编写的不够好,编写两个不同频率的方波分别作为sig_a、sig_b,这样仿真才可以更好地体现mux21的功能。习惯了用HDL编写Testbench,换到C还有点不习惯……
6、封装为IP
Solution > Export RTL,或者点击工具栏快捷按钮,打开Export RTL对话框,如图9所示。
图9 Export RTL
命令行会打印提示整个IP封装过程,如图10所示。
图10 IP封装打印信息
如图11所示,IP封装完成后,solution1文件夹下会出现impl文件夹,该文件夹下包含ip、verilog、vdhl三个子文件夹,在这些文件夹中,我们可以找到封装过程中生成的文件。
图11
7、结束语
至此,我们完成了利用HLS工具进行算法设计的全过程。IDE使用方面就不多说了,还是比较方便的。
从使用HDL进行逻辑开发的设计员角度来讲,使用HLS完成算法设计还不太习惯,比如说:C Testbench的编写和HDL Testbench的编写有一定的差异;使用C语言设计算法的时候,还是会先考虑用HDL怎么写,然后把HDL翻译成C;C设计算法时,会考虑什么样的语句能综合出时钟电路,怎么写才能综合出自己想要的电路等等。这些都是设计思维的问题,是HDL语言和高级语言的设计思维方式不同,习惯了HDL设计电路,乍接触高级语言设计电路,还不习惯,在思维的高度需要做一些转变。
接下来,需要学习如何设计C算法、编写C Testbench等,路漫漫……
——cuter