Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

HDL ブロック プロパティ: ネイティブ浮動小数点

概要

ブロック実装パラメーターにより、特定のブロック実装用に生成されたコードの詳細を制御できます。GUI またはコマンド ラインからブロック実装およびパラメーターを選択する方法については、HDL モデルおよびブロック パラメーターの設定と表示を参照してください。

プロパティ名は文字ベクトルとして指定します。プロパティ値のデータ型はプロパティに固有です。この節では、[HDL ブロック プロパティ] の [Native Floating Point] タブで指定できる各ブロック実装パラメーターの構文について説明します。パラメーターの指定が生成されるコードにどのような影響を与えるかが分かります。

ライブラリ ブロックの HDL ブロック プロパティ

ライブラリ ブロックの HDL ブロック プロパティは、マスク パラメーターと同様に扱われます。モデルでライブラリ ブロックをインスタンス化する場合、そのライブラリ ブロックの現在の HDL ブロック プロパティは、モデルのそのブロックのインスタンスにコピーされます。それらのインスタンスの HDL ブロック プロパティは、ライブラリ ブロックの HDL ブロック プロパティと同期していません。つまり、ライブラリ ブロックの HDL ブロック プロパティを変更すると、この変更は Simulink® モデルに既に追加されているライブラリ ブロックのインスタンスには伝播されません。ライブラリ ブロックの HDL ブロック プロパティをモデル内のそのインスタンスと同期させる場合、Subsystem を作成してから、このブロックをその Subsystem 内に配置します。ライブラリ ブロック内にあるブロックの HDL ブロック プロパティは、モデル内の対応するインスタンスと同期します。

HDL アーキテクチャが Module に設定されている Subsystem ブロックがライブラリに含まれているとします。このブロックをモデルでインスタンス化する場合、ブロックのインスタンスは HDL アーキテクチャとして Module を使用します。ライブラリ内の Subsystem ブロックの HDL アーキテクチャを BlackBox に変更しても、モデル内のその Subsystem ブロックの既存のインスタンスは、HDL アーキテクチャとして Module を引き続き使用します。モデルでライブラリから Subsystem ブロックのインスタンスを追加すると、新しいブロックのインスタンスは、現在の HDL ブロック プロパティのコピーを取得します。したがって、HDL アーキテクチャとして BlackBox を使用します。ライブラリ内の Subsystem ブロックの HDL アーキテクチャをモデル内のそのインスタンスと同期させる場合は、必要な HDL アーキテクチャがこの Subsystem 内に含まれる、ラッパー サブシステムを作成します。

CheckResetToZero

ネイティブ浮動小数点モードでは、Math Function ブロックの関数 mod および rem で、[CheckResetToZero] プロパティを使用できます。この設定では、商 a/b が整数に近い数 ab があるとき、ab の整数倍とし、rem(a,b)=0 として扱います。この結果は数値的に正確であり、Simulink シミュレーション結果に一致します。しかし、この結果を計算するには追加のリソースが利用されるため、ターゲット FPGA デバイスの面積のフットプリントが大きくなります。

たとえば、このような数の組について、[CheckResetToZero] 設定を有効にした場合と無効にした場合では、異なるシミュレーション結果が得られます。

CheckResetToZero の設定説明
'on' (既定の設定)

商が整数に近く、浮動小数点データ型を超える精度を持つ 2 つの数の mod または rem を計算した場合、HDL Coder™ は、商が整数に近いときに mod または rem の結果を 0 として出力するのに必要なロジックを追加します。

'off'

HDL Coder は商を計算するための追加のロジックを挿入しないため、ターゲット FPGA デバイスの面積が節約されます。

Math Function ブロックにおける CheckResetToZero の設定

[HDL ブロック プロパティ] ダイアログ ボックスでブロックに対して [CheckResetToZero] を設定するには、次を行います。

  1. ブロックを右クリックします。

  2. [HDL コード][HDL ブロック プロパティ] を選択します。

  3. [CheckResetToZero][on] または [off] を設定します。

Simulink モデル my_design のサブシステム my_dut 内の Math Function ブロックに対して [CheckResetToZero] を設定するには、次のようにします。

hdlset_param('my_design/my_dut/Math', 'CheckResetToZero, 'on')
hdlset_paramも参照してください。

DivisionAlgorithm

逆数モードの Divide ブロックと Math Function ブロックで Native Floating Point モードを有効にする場合、DivisionAlgorithm プロパティを使用できます。

DivisionAlgorithm の設定説明
Radix-2 (既定の設定)

既定の Radix-2 モードは、減算を繰り返し行い、各反復で商の 1 ビットを計算します。

レイテンシのトレードオフを行いながら面積利用率を下げるよう設計するには、Radix-2 モードを使用します。

Radix-4

Radix-4 モードは、減算を繰り返し行い、各反復で商の 2 ビットを計算します。Radix-4 モードで計算結果を得るために使用される反復回数は、Radix-2 モードの半分です。

面積のトレードオフを行いながらレイテンシを下げるよう設計するには、Radix-4 モードを使用します。

Xilinx Virtex-7 における単精度除算のリソース利用率と最大クロック周波数

DivisionAlgorithm モードLatencyStrategyレイテンシFmaxLUTレジスタ
Radix-2MIN17334.4 MHz12481011
MAX32454.5 MHz12941797
Radix-4MIN11245.5 MHz1956865
MAX20453.1 MHz18541522

Math Function ブロックまたは Division ブロックへの DivisionAlgorithm の指定

[HDL ブロック プロパティ] ダイアログ ボックスでブロックに対して [DivisionAlgorithm] を指定するには、次を行います。

  1. ブロックを右クリックします。

  2. [HDL コード][HDL ブロック プロパティ] を選択します。

  3. [Native Floating Point] タブで、[DivisionAlgorithm] を指定します。

コマンド ラインで [DivisionAlgorithm] をブロックに指定するには、hdlset_param を使用します。たとえば、以下のコマンドは、Simulink モデル my_design 内のサブシステム my_dutDivide ブロックに Radix-4 モードを指定します。

hdlset_param('my_design/my_dut/Divide, 'DivisionAlgorithm', 'Radix-4')

HandleDenormals

Native Floating Point モードで HDL コード生成をサポートする特定のブロックに対して HandleDenormals プロパティを使用できます。非正規数とは、その大きさが仮数の先頭にゼロを付けずに表現できる最小の浮動小数点数より小さい数値のことです。この設定を使用して、HDL Coder で設計に非正規数を処理する追加ロジックを挿入するかどうかを指定できます。詳細については、非正規数を参照してください。

HandleDenormals 設定説明
'inherit' (既定の設定)

親サブシステムの非正規数の処理設定を使用します。このサブシステムが最上位のサブシステムの場合、モデルの非正規数の処理設定を使用します。

'on'

これらのブロック入力に非正規数がある場合、HDL Coder は非正規数を正規化するロジックを追加します。

'off'

HDL Coder は、設計に非正規数を処理する追加のロジックを挿入しません。コード ジェネレーターは、計算を実行する前に、非正規値を 0 として処理します。

モデル内のブロックに対して HandleDenormals を有効にするには、そのブロックのパラメーター HandleDenormals'on' に設定します。

ブロックの非正規数の処理の設定

[HDL ブロック プロパティ] ダイアログ ボックスでブロックに対して非正規数の処理を設定するには、次を行います。

  1. ブロックを右クリックします。

  2. [HDL コード][HDL ブロック プロパティ] を選択します。

  3. [HandleDenormals] で、[inherit][on] または [off] を選択します。

コマンド ラインでブロックに対する非正規数の処理を設定するには、hdlset_param を使用します。たとえば、Simulink モデル my_design でサブシステム my_dut 内の Product ブロックに対して非正規数の処理を有効にするには、次を行います。

hdlset_param('my_design/my_dut/Product', 'HandleDenormals', 'on')
非正規数の処理も参照してください。

InputRangeReduction

Native Floating Point モードでは、Trigonometric Function ブロックの関数 sincostansincoscos+jsin[InputRangeReduction] プロパティを使用できます。既定では、この設定はブロックに対して有効になっており、入力範囲には制限がないものとみなされています。ブロックへの入力が、範囲 [-pi, pi] に制限されている場合、その設計には入力範囲を狭めるためのロジックは必要ありません。そのような場合は、この設定を無効にすることで、ブロック実装に伴うレイテンシが小さくなり、ターゲット ハードウェアで利用されるリソースも減少します。この設定を無効にした場合、生成されたモデルには、入力が範囲 [-pi, pi] に制限されているかどうかを検証するブロックが含まれます。入力が制限されていない場合、生成されたモデルでは、シミュレーション中にアサーションがトリガーされます。

InputRangeReduction の設定説明
'on' (既定の設定)

入力範囲が無制限であるとみなします。アルゴリズムを計算する前に入力引数の範囲を [-pi, pi] に縮小する、追加のロジックが挿入されます。

'off'

入力引数の範囲が [-pi, pi] に制限されているとみなします。入力引数の範囲を縮小する追加のロジックは挿入されません。この実装では、レイテンシが低くなり、ターゲット プラットフォームに占める面積を節約できます。

Trigonometric Function ブロックにおける InputRangeReduction の設定

[HDL ブロック プロパティ] ダイアログ ボックスでブロックに対して [InputRangeReduction] を設定するには、次を行います。

  1. ブロックを右クリックします。

  2. [HDL コード][HDL ブロック プロパティ] を選択します。

  3. [Native Floating Point] タブの [InputRangeReduction] で、[on] または [off] を選択します。

Simulink モデル my_design のサブシステム my_trigonometric 内の Trigonometric Function ブロックに対して [InputRangeReduction] を無効にするには、次のようにします。

hdlset_param('my_design/my_dut/my_trigonometric', ...
                          'InputRangeReduction, 'off')
hdlset_paramも参照してください。

LatencyStrategy

固定小数点型と浮動小数点型の HDL コード生成をサポートする特定のブロックに対して LatencyStrategy プロパティを使用できます。浮動小数点型を使用する場合、モデル コンフィギュレーション パラメーター [浮動小数点の使用] を選択します。固定小数点型の場合、このプロパティでは、ゼロ、最大、またはカスタム レイテンシを指定します。浮動小数点型の場合、このプロパティでは、ブロックを演算子の最小、最大、またはカスタム レイテンシにマップするかどうかを指定します。

LatencyStrategy 設定説明
'inherit' (既定の設定)

親サブシステムのレイテンシ手法設定を使用します。このサブシステムが最上位のサブシステムの場合、モデルのレイテンシ手法設定を使用します。

'Max'

コードの生成時に、HDL Coder はネイティブ浮動小数点演算子に最大レイテンシ値を使用します。

'Min'

コードの生成時に、HDL Coder はネイティブ浮動小数点演算子に最小レイテンシ値を使用します。

'Zero'

コードの生成時に、HDL Coder はネイティブ浮動小数点演算子に対するレイテンシを追加しません。

'Custom'

コード生成中に、HDL Coder によってネイティブ浮動小数点演算子の [CustomLatency] 設定または [NFPCustomLatency] 設定で指定した値に相当するレイテンシが追加されます。この設定は、ネイティブ浮動小数点モードで特定のブロックに使用できます。設定を指定できるブロックを確認するには、NFPCustomLatencyを参照してください。

モデル内のブロックに対して最小レイテンシ オプションを指定するには、そのブロックのパラメーター LatencyStrategy'MIN' に設定します。

モデルレベルのレイテンシ手法設定を設定する方法については、ネイティブ浮動小数点のレイテンシに関する考慮事項を参照してください。

固定小数点ブロックのレイテンシ手法の設定

固定小数点型を使用する場合、それらのブロックの [LatencyStrategy] を指定します。

  • HDL アーキテクチャとして [ShiftAdd] をもつ Divide ブロックと Reciprocal ブロック。

  • HDL アーキテクチャとして [SqrtFunction] をもつ Sqrt ブロック。

  • [関数] が [sin]、[cos]、[sincos]、[cos+jsin]、または [atan2] に設定されていて、[近似法] が [CORDIC] に設定されている Trigonometric Function ブロック。

[HDL ブロック プロパティ] ダイアログ ボックスからサブシステムのレイテンシ手法を設定するには、次の手順に従います。

  1. Simulink ツールストリップの [アプリ] タブで、[HDL Coder] を選択します。

  2. ブロックを選択し、[HDL コード] タブで [HDL ブロック プロパティ] ボタンをクリックします。

  3. [一般] タブで、[LatencyStrategy] を指定します。[LatencyStrategy][Custom] に設定する場合、[CustomLatency] の値を指定しなければなりません。

コマンド ラインでブロックのレイテンシ手法を指定するには、hdlset_param を使用します。たとえば、Simulink モデル my_design のサブシステム my_dut 内の Product ブロックに対して最小レイテンシを指定するには、次のように指定します。

hdlset_param('my_design/my_dut/Product', 'LatencyStrategy', 'MAX')
hdlset_paramも参照してください。

浮動小数点ブロックのレイテンシ手法の設定

[HDL ブロック プロパティ] ダイアログ ボックスからサブシステムのレイテンシ手法を設定するには、次の手順に従います。

  1. Simulink ツールストリップの [アプリ] タブで、[HDL Coder] を選択します。

  2. ブロックを選択し、[HDL コード] タブで [HDL ブロック プロパティ] ボタンをクリックします。

  3. [ネイティブ浮動小数点] タブで、[LatencyStrategy] を指定します。[LatencyStrategy][Custom] に設定する場合、[NFPCustomLatency] の値を指定しなければなりません。

詳細については、各ブロック ページの [HDL コード生成] セクションを参照してください。カスタム レイテンシを指定できるブロックの詳細については、NFPCustomLatencyを参照してください。

コマンド ラインでブロックのレイテンシ手法を指定するには、hdlset_param を使用します。たとえば、Simulink モデル my_design のサブシステム my_dut 内の Product ブロックに対して最小レイテンシを指定するには、次のように指定します。

hdlset_param('my_design/my_dut/Product', 'LatencyStategy', 'MIN')
hdlset_paramも参照してください。

CustomLatency

固定小数点型の特定のブロックに、カスタム レイテンシを指定できます。カスタム レイテンシ手法を使用して、クロック周波数と電力消費との間でトレードオフできます。カスタム レイテンシ手法を指定するには、[LatencyStrategy]CUSTOM に設定し、[CustomLatency] の値を指定します。詳細については、各ブロック ページの [HDL コード生成] セクションを参照してください。

固定小数点型のブロックに対して [CustomLatency] 設定を指定できます。

  • HDL アーキテクチャとして [ShiftAdd] をもつ Divide ブロックと Reciprocal ブロック。

  • HDL アーキテクチャとして [SqrtFunction] をもつ Sqrt ブロック。

  • [関数] が [sin]、[cos]、[sincos]、[cos+jsin]、または [atan2] に設定されていて、[近似法] が [CORDIC] に設定されている Trigonometric Function ブロック。

ブロックのカスタム レイテンシ値の設定

[HDL ブロック プロパティ] ダイアログ ボックスからサブシステムのカスタム レイテンシ値を設定するには、次の手順に従います。

  1. Simulink ツールストリップの [アプリ] タブで、[HDL Coder] を選択します。

  2. ブロックを選択し、[HDL コード] タブで [HDL ブロック プロパティ] ボタンをクリックします。

  3. [一般] タブで、[LatencyStrategy][Custom] に設定し、[CustomLatency] の値を指定します。

コマンド ラインでブロックのレイテンシ手法を指定するには、hdlset_param を使用します。たとえば、Simulink モデル my_design でサブシステム my_dut 内の Product ブロックに対するカスタム レイテンシを 4 に指定するには、次の手順に従います。

hdlset_param('my_design/my_dut/Product', 'LatencyStrategy', 'Custom')
hdlset_param('my_design/my_dut/Product', 'CustomLatency', 4)
hdlset_paramも参照してください。

NFPCustomLatency

ネイティブ浮動小数点モードで特定のブロックにカスタム レイテンシを指定できます。カスタム レイテンシ手法を使用して、クロック周波数と電力消費との間でトレードオフできます。カスタム レイテンシ手法を指定するには、[LatencyStrategy]Custom に設定し、[NFPCustomLatency] の値を指定します。カスタム レイテンシ値は、1 からブロックの [Max] レイテンシまでの範囲で指定できます。浮動小数点演算子のレイテンシ値の詳細については、浮動小数点演算子のレイテンシ値を参照してください。

singledouble の両方のデータ型のブロックに対して [NFPCustomLatency] 設定を指定できます。

single データ型のブロックに対して、[NFPCustomLatency] 設定を指定することもできます。

ブロックのカスタム レイテンシ値の設定

[HDL ブロック プロパティ] ダイアログ ボックスからサブシステムのカスタム レイテンシ値を設定するには、次の手順に従います。

  1. ブロックを右クリックします。

  2. [HDL コード][HDL ブロック プロパティ] を選択します。

  3. [Native Floating Point] タブの [LatencyStrategy] で、[Custom] を選択します。

  4. [NFPCustomLatency] の値を指定します。

コマンド ラインでブロックのレイテンシ手法を指定するには、hdlset_param を使用します。たとえば、Simulink モデル my_design でサブシステム my_dut 内の Product ブロックに対するカスタム レイテンシを 4 に指定するには、次の手順に従います。

hdlset_param('my_design/my_dut/Product', 'LatencyStategy', 'Custom')
hdlset_param('my_design/my_dut/Product', 'NFPCustomLatency', 4)
hdlset_paramも参照してください。

MantissaMultiplyStrategy

ネイティブ浮動小数点モードで HDL コード生成をサポートする乗算器に対して MantissaMultiplyStrategy プロパティを使用できます。この設定をもつブロックには、ProductDivideMath Function (逆数モード) などがあります。この設定を使用して、HDL Coder でブロックの仮数乗算演算を実装する方法を指定できます。

MantissaMultiplyStrategy の設定説明
'inherit' (既定の設定)

親サブシステムの仮数乗算手法設定を使用します。このサブシステムが最上位のサブシステムの場合、モデルの仮数乗算手法設定を使用します。

'FullMultiplier'

HDL Coder は、乗算器を使用してネイティブ浮動小数点演算子の仮数乗算演算を実行します。乗算器はターゲット デバイスの DSP ユニットを利用できます。

'PartMultiplierPartAddShift'

HDL Coder は、実装を 2 つの部分に分割します。1 つは乗算器で実装されます。もう 1 つは加算器とシフターの組み合わせで実装されます。乗算器は、ターゲット デバイスの DSP ユニットを利用できます。加算器とシフターの組み合わせでは DSP を利用しません。

'NoMultiplierFullAddShift'

HDL Coder は加算器とシフターを使用して仮数乗算を実装します。このオプションではターゲット デバイスの DSP ユニットを利用しません。このオプションは、ターゲット デバイスに DSP ユニットが含まれない場合にも使用できます。

加算器とシフターを使用して仮数乗算を実装するには、そのブロックの MantissaMultiplyStrategy'NoMultiplierFullAddShift' に設定します。

ブロックの仮数乗算手法の設定

[HDL ブロック プロパティ] ダイアログ ボックスからサブシステムの適応パイプラインを設定するには、次の手順に従います。

  1. ブロックを右クリックします。

  2. [HDL コード][HDL ブロック プロパティ] を選択します。

  3. [Native Floating Point] タブの [MantissaMultiplyStrategy] で、[inherit][FullMultiplier][PartMultiplierPartAddShift] または [NoMultiplierFullAddShift] を選択します。

コマンド ラインでブロックの仮数乗算手法を指定するには、hdlset_param を使用します。たとえば、Simulink モデル my_design でサブシステム my_dut 内の Product ブロックに対して、加算器とシフターを使用して仮数乗算を実装するには、次のように指定します。

hdlset_param('my_design/my_dut/Product', ... 
                'MantissaMultiplyStrategy', 'PartMultiplierPartAddShift')
hdlset_paramも参照してください。

MaxIterations

Native Floating Point モードでは、Math Function ブロックの関数 mod および remMaxIterations プロパティを使用できます。非常に大きい整数である ab がある場合、[MaxIterations] の設定を大きくすることで、Simulink シミュレーション結果に合わせることができます。しかし、この結果を計算するには追加のリソースが利用されるため、ターゲット FPGA デバイスの面積のフットプリントが大きくなります。

MaxIterations の設定説明
32 (既定の設定)

Native Floating Point モードで関数 mod および rem の結果を計算する際の既定の反復回数。大きい整数では、Simulink シミュレーション結果と数値的不一致が起こる可能性があります。

64

Native Floating Point モードで関数 mod および rem の結果を計算する際の反復回数として 64 を指定します。このモードの実装では、かなり大きな整数の場合でも Simulink シミュレーション結果と一致する可能性が高くなりますが、ハードウェア リソースの使用量も増加する可能性があります。

128

Native Floating Point モードで関数 mod および rem の結果を計算する際の反復回数として 128 を指定します。このモードの実装では、大きな整数の場合でも Simulink シミュレーション結果と一致しますが、ハードウェア リソースの使用量も増大します。

Math Function ブロックにおける MaxIterations の設定

[HDL ブロック プロパティ] ダイアログ ボックスでブロックに対して [MaxIterations] を設定するには、次を行います。

  1. ブロックを右クリックします。

  2. [HDL コード][HDL ブロック プロパティ] を選択します。

  3. [Native Floating Point] タブの [MaxIterations] で、[32][64]、または [128] を選択します。

コマンド ラインでブロックに対する非正規数の処理を設定するには、hdlset_param を使用します。たとえば、Simulink モデル my_design でサブシステム my_dut 内の Product ブロックに対して適応パイプラインを有効にするには、次を行います。

hdlset_param('my_design/my_dut/Product', 'HandleDenormals', 'on')
hdlset_paramも参照してください。

関連する例

詳細