HLS 数学函数由 hls_math.h
库实现为可综合的位近似函数。位近似 HLS 数学库函数无法提供与标准 C 语言函数相同的精度。为了获得期望的结果,位近似的实现可能使用与标准 C 语言数学库版本不同的底层算法。该函数的精度以 ULP(最小精度单位)的形式指定。精度上的差异对 C 语言仿真和 C/RTL 协同仿真都有影响。
ULP 差异通常在 1-4 ULP 范围内。
- 如果在 C 语言源代码中使用标准 C 语言数学库,则由于某些函数与标准 C 语言数学库表现出 ULP 差异,因此 C 语言仿真与 C/RTL 协同仿真之间可能会有差异。
- 如果在 C 语言源代码中使用 HLS 数学库,则 C 语言仿真与 C/RTL 协同仿真之间不会有任何差异。但是,使用 HLS 数学库的 C 语言仿真可能与使用标准 C 语言数学库的 C 语言仿真之间存在差异。
此外,以下 7 个函数可能会显示出一些差异,具体取决于用于编译和运行 C 语言仿真的 C 语言标准:
- copysign
- fpclassify
- isinf
- isfinite
- isnan
- isnormal
- signbit
C90 模式
系统通常仅提供 isinf
、isnan
和 copysign
,并且这些函数仅适用双精度类型。特别是,copysign
始终返回双精度结果。如果必须返回浮点数,则在综合后可能会导致意外结果,这是因为在硬件中引入了双精度至浮点数转换块。
C99 模式 (-std=c99)
在此模式下通常系统可提供全部 7 个函数,并且期望系统头文件会将其重定向到 __isnan(double)
和 __isnan(float)
。常用的 GCC 头文件不会重定向 isnormal
,而是根据 fpclassify
来将其实现。
使用 math.h 的 C++
系统可提供全部 7 个函数,并且这些函数都适用于双精度类型。
copysign
始终返回双精度结果。如果必须返回浮点数,则在综合后可能会导致意外结果,这是因为在硬件中引入了双精度至浮点数转换块。
使用 cmath 的 C++
与 C99 mode(-std=c99)
类似,以下情况除外:
- 系统头文件通常不同。
- 这些函数可正确重载,以用于:
-
float(). snan(double)
-
isinf(double)
-
copysign
和 copysignf
作为内置函数来处理,即使使用 namespace std;
时也是如此。
使用 cmath 和名称空间 std 的C++
没有任何问题。赛灵思建议使用以下方法以获得最佳效果:
- 对于 C,使用
-std=c99
- 对于 C 和 C++,使用
-fno-builtin
注释: 要指定
-std=c99
等 C 语言编译选项,请使用 Tcl 命令 add_files
搭配 -cflags
选项。还可以在“Project Settings”(工程设置)对话框中使用Edit CFLAGs按钮。