HLS 数学関数は、hls_math.h
から合成可能なビット概算関数としてインプリメントされます。ビット概算の HLS math ライブラリ関数の精度は、標準 C 関数の精度と同じにはなりません。ビット概算インプリメンテーションでは、標準 C math ライブラリ のバージョンとは異なる下位アルゴリズムを使用して結果が達成されることがあります。関数の精度は ULP (Unit of Least Precision) で指定されます。この精度の違いは、C シミュレーションと C/RTL 協調シミュレーションの両方に影響します。
ULP の違いは、通常 1-4 ULP の範囲です。
- 標準 C math ライブラリが C ソース コードで使用されると、関数の中に標準 C math ライブラリとは ULP の異なるものがあるため、C シミュレーションと C/RTL 協調シミュレーション間で違いがあることがあります。
- HLS math ライブラリが C ソース コードで使用される場合は、C シミュレーションと C/RTL 協調シミュレーション間で違いはありませんが、HLS math ファイルを使用した C シミュレーションは、標準 C math ライブラリを使用した 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 および namespace std を使用した C++
問題なし。最適な結果となるので、AMDでは次の使用をお勧めします。
- C の場合は
-std=c99
- C および C++ の場合は
-fno-builtin
-std=c99
などの C コンパイル オプションを指定するには、Tcl コマンドの add_files
に -cflags
オプションを使用します。または、[Project Settings] ダイアログ ボックスの Edit CFLAGs ボタンを使用します。