提起C/C++中本身的数据类型(native data types),我们会想到char、int、long等。这些数据类型对应的位宽是以8为边界的。相比于软件开发,FPGA设计中数据的位宽(也可称之为字长)是一个非常重要的因素。例如:一个输入数据均为18bit的乘法运算需要消耗1个DSP48,若输入数据位宽增至32bit,则需要消耗4个DSP48。可是C本身是无法声明一个18bit的数据。为此,Vivado HLS对数据类型做了扩展,设置了任意精度数据类型,以满足硬件设计的需求。更为重要的是,这种任意进度的数据类型继承了原有C数据类型所支持的操作,使得FPGA开发更为高效。此外,对于复合数据类型struct和enum,Vivado HLS也是支持的。
一个好的代码风格是将数据类型定义在头文件中,同时可通过#define切换数据类型,例如,C仿真时,可将数据类型设置为float,便于调试,以快速验证算法功能,C综合时,再切换到目标数据类型。
更为深入的介绍可以阅读以下文档:
ug902(v2018.1) High-Level Synthesis User Guide page 76 - page 83
ug871(v2018.1) High-level Synthesis Tutorial Ch5: Arbitrary Precision Types
Lab 1,Lab 2