如果 C/C++ 语言函数编译为可执行文件,则函数中使用的数据类型会影响结果的准确性以及存储器要求,并且可能影响性能。
- 32 位整数 int 数据类型可包含更多数据,因此精度比 8 位 char 类型更高,但需更多存储空间。
- 如果在 32 位系统上使用 64 位
long long
类型,则会影响运行时,因为通常需要多次访问以读取和写入相应的值。
同样,将 C/C++ 语言函数综合到 RTL 实现中时,这些数据类型会影响 RTL 设计的精度、面积和性能。用于变量的数据类型可判定所需的运算符大小,因此可判定 RTL 的面积和性能。
Vitis HLS 支持对所有标准 C/C++ 语言类型进行综合,包括精确宽度整数类型。
-
(unsigned) char
、(unsigned) short
和(unsigned) int
-
(unsigned) long
和(unsigned) long long
-
(unsigned) intN_t
(其中,N
为 8、16、32 或 64,在 stdint.h 中定义) -
float
和double
精确宽度整数类型可用于确保设计在各种类型的系统之间的可移植性。
C/C++ 语言标准规定 (unsigned)long
类型在 64 位操作系统上作为 64 位类型来实现,在 32 位操作系统上作为 32 位类型来实现。综合可根据运行 Vitis HLS 的操作系统类型来匹配此行为并生成不同大小的运算符,从而生成不同 RTL 设计。在 Windows 操作系统上,Microsoft 将 long 类型定义为 32 位,与操作系统无关。
- 针对 32 位,使用
(unsigned)int
或(unsigned)int32_t
数据类型代替(unsigned)long
类型。 - 针对 64 位,使用
(unsigned)long long
或(unsigned)int64_t
数据类型代替(unsigned)long
类型。
注释: C/C++ 编译选项
-m32
可用于指定按对应 C/C++ 语言仿真的方式来编译此代码,并按 32 位架构规范来对此代码进行综合。这样可确保将 long 数据类型作为 32 位值来实现。该选项可通过使用 -CFLAGS
选项来应用于 add_files
命令。赛灵思强烈建议在单一公用头文件中定义所有变量的数据类型,该头文件可包含在所有源文件中。
- 在一般 Vitis HLS 工程中,可对部分数据类型进行调优,例如,用于减小其大小和支持更高效的硬件实现。
- 提高工作的抽象层次的主要作用之一在于能够快速创建新设计实现。通常在后续工程中使用的文件是相同的,但可能使用的数据类型不同(更小、更大或更准确)。
在单一位置更改数据类型更便于完成这 2 项任务:替代方法是对多个文件进行编辑。
重要: 在头文件中使用宏时,请始终使用专有名称。例如,如果头文件中定义了 1 个名为
_TYPES_H
的宏,由于此名称较为常见,在其它系统文件中可能也会定义相同名称,它可能会启用或禁用某些其它代码,从而导致不可预见的意外结果。提示:
std::complex<long double>
数据类型在 Vitis HLS 中不受支持,不应使用。