ネイティブ浮動小数点演算の ULP の考慮事項
無限の実数を有限のビット数で表現するには近似が必要です。この近似によって、浮動小数点計算で丸め誤差が発生することがあります。丸め誤差を測定するために、浮動小数点標準では相対誤差と ULP (Units in the Last Place) を使用します。相対誤差については、相対精度と ULP の考慮事項を参照してください。
指数範囲に上限がない場合、浮動小数点数 x の Units in Last Place (ULP) は、x をまたぐ直近の 2 つの浮動小数点数 a と b との間の距離を表します。IEEE-754 標準では、加算、乗算、除算などの基本的な算術演算の結果を正しく丸める必要があります。正しく丸められた結果とは、丸められた結果が正確な結果の 0.5 ULP 内であることを意味します。
IEEE-754 標準へのネイティブ浮動小数点演算子の準拠
HDL Coder™ におけるネイティブ浮動小数点テクノロジーは、浮動小数点演算の IEEE 標準に従っています。加算、減算、乗算、除算、逆数といった基本的な算術演算は、ULP 誤差をゼロにするために IEEE によって規定されています。これらの演算をネイティブ浮動小数点モードで実行した場合、生成された HDL コードから得られる数値結果が元の Simulink® モデルと一致します。
指数、対数、三角関数演算子といった高度な数学演算にはすべて、マシン固有の実装動作が伴います。これは、演算子がテイラー級数や remez 式に基づく反復的な実装を使用するためです。これらの演算子をネイティブ浮動小数点モードで使用すると、Simulink モデルと生成された HDL コード間の数値結果の誤差を比較的小さくすることができます。
数値結果の誤差を相対誤差または ULP として測定できます。これらの演算子の ULP が非ゼロでも、IEEE 標準に準拠していないわけではありません。1 ULP は相対誤差の 10^-7
と等しくなります。こうした比較的小さい誤差は、HDL テスト ベンチの生成時に ULP にカスタム許容誤差値を指定することで無視できます。たとえば、カスタム浮動小数点許容誤差として 1 ULP を指定することで、生成されたコードの検証時に誤差を無視することができます。詳細については、コンフィギュレーション パラメーター [浮動小数点許容誤差チェックの基準] および [許容誤差の値] を参照してください。
浮動小数点演算子の ULP 値
以下の表では、非ゼロの ULP をもつ浮動小数点演算子の ULP を列挙しています。これらの演算子に加えて、HDL Reciprocal ブロックの ULP は 5 です。
数学関数
Math Operations
Simulink ブロック | データ型 | ULP (Units in the Last Place) 誤差 |
---|---|---|
HDL Reciprocal | single | 5 |
Reciprocal Sqrt | double | 1 |
考慮事項
特定の浮動小数点入力値では、一部のブロックで MATLAB® のシミュレーション結果とは異なるシミュレーション結果となる場合があります。結果の相違を確認するには、コードを生成する前に、検証モデルの生成を有効にします。[コンフィギュレーション パラメーター] ダイアログ ボックスの [HDL コード生成] ペインで [検証モデルを生成] チェック ボックスをオンにします。
複素数および
Inf
やNaN
などの例外を含む計算を実行すると、ネイティブ浮動小数点による HDL シミュレーションの結果が Simulink のシミュレーション結果と異なるものになる可能性があります。たとえば、Inf
で複素数入力を乗算すると、Simulink のシミュレーション結果はInfi
となりますが、HDL のシミュレーション結果はNaN+Infi
となります。HDL Coder では、参照とネイティブ浮動小数点の両方の値が符号に関係なく
NaN
である場合、それらの値の間の不一致エラーは生成されません。負の数値の平方根または対数を計算すると、ネイティブ浮動小数点を使用した HDL のシミュレーション結果は
0
になります。この結果は、SystemVerilog DPI テスト ベンチを使用して設計を検証したときのシミュレーション結果と一致します。Simulink では、得られる結果はNaN
になります。IEEE-754 標準に従って、負の数値の平方根または対数を計算すると、結果はその数値そのものになります。Direct Lookup Table (n-D) への入力が浮動小数点データ型であっても、table の要素が小さいデータ型を使用している場合、生成される HDL コードは正しくない可能性があります。たとえば、入力のデータ型が
single
型で、要素はuint8
型を使用する場合です。正確な HDL のシミュレーション結果を取得するには、入力信号とルックアップ テーブルの要素に対して同じデータ型を使用します。入力
-7.729179E28
または7.729179E28
を指定した Cosine ブロックを使用する場合、生成される HDL コードの ULP は 4 です。他のすべての入力では、ULP は 2 です。Math Function ブロックを使用して
mod(a,b)
またはrem(a,b)
を計算する場合、a
を被除数、b
を除数とすると、ネイティブ浮動小数点モードのシミュレーション結果は、次の場合の MATLAB のシミュレーション結果とは異なるものになります。の場合、ネイティブ浮動小数点モードのシミュレーション結果は 0 になります。数値
a
とb
の間の大きさにこのような有意差がある場合、この実装により、ターゲットの FPGA デバイス上の面積が節約されます。の場合、ネイティブ浮動小数点モードのシミュレーション結果は MATLAB のシミュレーション結果と異なるものになる可能性があります。