任意精度的数据类型
u 代表 unsigned,fixed代表定点数据,即常数
采用任意精度的数据类型可以使用更少的资源,硬件友好性
数据类型定义在 header file 中
表示任意进制
cpp
ap_int<6> a("101010",2); //二进制数据101010
ap_int<6> b("52",8); //八进制数据52
ap_int<6> c("2A",16); //十六进制数据2A
ap_int<6> d(-22); //十进制数据-22
可使用 typeid
来获取变量的数据类型
cpp
#include <typeinfo>
ap_int<4> v1 = 3;
cout << typeid(v1).name() << endl;
复合数据类型
1. 结构体类型 Struct
Scalar (标量) 被实现成 scalar 端口
Array 被实现成 memory 端口
结构体中的数据可以被打包成一个 vector
,通过 data packing
优化
以下是两种打包方式 Byte_pad
field_level:先将独立得每个元素都扩展为标准8bits,然后打包这个结构体
struct_level:先打包这个结构体,再将打包后得结构体扩展为标准8bits
Data Pack
可以减少 latency
和 initial interval
2. 结构体类型 enum
本质就是将一个数值定义为一个符号常量,每个枚举类型都会被自动地分配为一个int类型
这个例子中 M_INIT 对应到 0
基本运算
同C语言
Test Bench
Test Bench 既可以用来验证 C算法正确性,又可以用来验证RTL设计是否正确。
写 Test Bench 的规范要给出 Reference Result
, 用来和 C算法得到的结果进行对比,以验证算法的正确性
接口综合
Block-level interface protocol
1.仅用于函数或者函数的返回值
- 三种基本协议类型,ap_ctrl_hs、ap_ctrl_none、ap_ctrl_chain
标量接口映射
ap_ctrl_hs hs表示handshake,即握手协议
ap_none 即没有 I/O 协议
ap_ovld is for use with in-out arguments,即又是输入又是输出的情况
此时, 对于输入是 ap_none,输出是 ap_vld ,即输出有效标志位
数组接口映射
默认映射成 RAM
端口,可以自定义是单端口、双端口RAM还是FIFO接口
默认采用 ap_memory
协议,当数据是 stream 格式的,将被映射为 ap_fifo
协议
Port-level interface protocol
学习资源
B站视频
跟Xilinx SAE 学HLS系列视频讲座-高亚军
Xilinx官方文档
UG871 & UG902