リソース共有
"リソース共有" とは、HDL Coder™ によって行われる面積の最適化の 1 つです。機能的に等価な複数のリソースが特定され、単一のリソースに置き換えられます。同じ演算を実行するために、データが共有リソース全体で時間多重化されます。
リソース共有の仕組み
サブシステムまたは MATLAB Function ブロックに共有係数を指定できます。HDL Coder は、最大で共有係数の値までの特定の数の共有可能な同一のリソースを特定しようとします。HDL Coder がこれらのリソースをどう共有するかは、設計におけるリソースの数、共有係数、およびオーバーサンプリング値によって決まります。設計のオーバーサンプリング値の設定方法の詳細については、オーバーサンプリング値の指定を参照してください。
既定では、オーバーサンプリング値は 1 であり、リソース共有は、残りの共有係数とリソースの数によって決まるオーバークロック係数に従って共有リソースをオーバークロックします。次のコードでは、OCF
はオーバークロック係数、N
は共有可能なリソースの数、SF
は共有係数です。
if rem(SF,N) == 0 OCF = N; else OCF = SF; end
[Simulink のレートを実際のハードウェアのレートとして扱う] パラメーターを使用して自動で、または [オーバーサンプリング係数] パラメーターを使用して手動で、1 より大きいオーバーサンプリング値を指定した場合、クロックレート パイプラインが有効になっていると、設計はターゲット ハードウェア上でより高速なクロック レートで動作します。[SharingFactor] を指定すると、リソース共有最適化は、最大 N
個のリソースを共有して、次で与えられる係数に従って共有リソースをオーバークロックしようとします。
オーバークロック係数 = (block_rate ÷ DUT_base_rate) × オーバーサンプリング値
検証モデルを使用して、最適化した DUT の出力が元の DUT で生成される結果に対してビットトゥルーであるかどうかの検証できます。検証モデルの詳細は、生成されたモデルと検証モデルを参照してください。
リソース共有の利点とコスト
リソース共有によりチップ面積を大幅に削減できます。たとえば、生成されたコードで 1 つの乗算器を使用して、元のモデルにあるまったく同じに構成された複数の乗算器の演算を実行することができます。ただし、リソース共有には次のデメリットもあります。
使用するマルチプレクサーの数が増え、レジスタの数が増える可能性がある。
HDL Coder はクロック レートの境界を超えてパイプラインを挿入できないので、分散型パイプライン方式やリタイミングを利用できる機会が減少する。
ターゲット ハードウェアのクロック レートがリソース共有係数で乗算される。
異なるブロックにおける共有可能なリソース
MATLAB Function ブロックに非ゼロのリソース共有係数を指定すると、HDL Coder は機能的に等価な乗算器を特定し、共有します。
Subsystem に非ゼロの共有係数を指定した場合、HDL Coder は次のタイプのブロックと機能的に等価なインスタンスを特定して共有します。
Gain
Product
Multiply-Add
2 つの入力をもつ Add または Sum
Atomic Subsystem
MATLAB Function
コード ジェネレーターは、固定小数点型をもつ機能的に等価な MATLAB Function ブロックを共有します。浮動小数点型を使用する場合、または固定小数点型をもつ MATLAB Function ブロックの MATLAB Datapath
アーキテクチャを使用する場合、HDL Coder は MATLAB Function ブロックを通常の Subsystem として扱います。これにより、機能的に等価なリソースを MATLAB Function ブロック内で共有できます。詳細については、MATLAB Function ブロックと共有するための MATLAB Datapath アーキテクチャの使用を参照してください。
リソース共有の指定
UI からリソース共有を指定するには、次の手順に従います。
[アプリ] タブで、[HDL Coder] を選択します。[HDL コード] タブが表示されます。サブシステム、モデル参照、または MATLAB Function ブロックを選択して、[HDL ブロック プロパティ] をクリックします。[SharingFactor] フィールドに共有可能なリソースの数を入力します。
サブシステム、モデル参照、または MATLAB Function ブロックを右クリックして、[HDL コード] 、 [HDL ブロック プロパティ] を選択します。[SharingFactor] フィールドに共有可能なリソースの数を入力します。
コマンド ラインで、以下の例に示すように hdlset_param
を使用して SharingFactor
を設定します。
modelname = 'sfir_fixed' dut = 'sfir_fixed/symmetric_fir'; open_system(modelname) hdlset_param(dut,'SharingFactor', 4);
リソース共有のブロック要件
ブロックを共有するには、ブロックは次の要件を満たさなければなりません。
シングル レートであること。
DUT に、サンプル時間が
inf
のブロックを含めてはなりません。HDL コードの生成時、inf
のサンプル時間は、サンプル時間が DUT 出力に伝播しない場合にのみ HDL Coder で解決されます。詳細については、Constant ブロックの離散および有限サンプル時間の使用を参照してください。バス入力またはバス出力がないこと
調整可能なマスク パラメーターがないこと。これらのブロックを共有するには、マスク エディターで、[調整可能] チェック ボックスをオフにします。
ブロックがフィードバック ループの内部にある場合は、少なくとも 1 つの Unit Delay ブロックまたは Delay ブロックが各出力端子に接続されていること。
ブロック固有の設定とリソース共有の要件については、以下を参照してください。
リソース共有レポート
リソース共有情報をレポートで見るには、各サブシステムまたはモデル参照のコードを生成する前に、最適化レポートを有効にします。このレポートを有効にするには、[HDL コード] タブで、[レポート オプション] を選択して、[最適化レポートを生成] を選択します。
[ストリーミングおよび共有] セクションで最適化レポートを生成すると、リソース共有最適化の効果が分かります。リソース共有に失敗した場合、診断メッセージと、リソース共有が失敗する原因となった問題のブロックがレポートに示されます。
リソース共有に成功した場合、[SharingFactor] と、リソースを共有したブロックのグループを含む表がレポートに示されます。表には、以下が含まれます。
グループ ID: 加算ブロックや乗算ブロックなど、リソースを共有する同様の Simulink® ブロックのグループに対する固有の ID。
リソース タイプ: 共有グループの Simulink ブロックのタイプ。
I/O の語長: 共有グループのブロックへの入力およびブロックからの出力の語長。
グループ サイズ: 共有グループの同タイプのブロック数。
ブロック名: 共有グループに属するブロックの名前。
色の凡例: 共有グループのすべてのブロックを強調表示する色。
Simulink モデルおよび生成されたモデル内の共有リソースを確認するには、[共有リソースと診断を強調表示] のリンクをクリックします。
リソース共有の制限
マルチレート共有では、適応パイプラインから挿入されたパイプラインの数が異なるリソースは共有できません。
リソース共有では、モデル参照はサポートされません。