リソース共有
"リソース共有" とは、HDL Coder™ によって行われる面積の最適化の 1 つです。機能的に等価な複数のリソースが特定され、単一のリソースに置き換えられます。同じ演算を実行するために、データが共有リソース全体で時間多重化されます。
リソース共有の仕組み
サブシステムまたは MATLAB Function ブロックに "共有係数" SF
を指定できます。HDL Coder は、最大 SF
までの特定の数の共有可能な同一のリソース N
の特定を試みます。コード ジェネレーターがこれらのリソースをどう共有するかは、N
、SF
、および Oversampling factor
によって決まります。
既定では、Oversampling factor
は 1 で、リソース共有は、残りの SF
と N
によって決まるオーバークロック係数 (OCF
) に従って共有リソースをオーバークロックします。
if rem(SF,N) == 0 OCF = N; else OCF = SF; end
Oversampling factor
に 1 より大きい値を指定した場合、その設計はターゲット ハードウェア上でより高速なクロック レートで動作します。これは、クロックレート パイプラインが既定で有効になっているためです。[SharingFactor] を指定すると、リソース共有最適化は、最大 N 個のリソースを共有して、次で与えられる係数に従って共有リソースをオーバークロックしようとします。
オーバークロック係数 = (block_rate ÷ DUT_base_rate) × Oversampling
検証モデルを使用して、最適化した 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
に設定されているブロックを含めてはなりません。たとえば、Constant ブロックの [サンプル時間] は -1 に設定しなければなりません。DUT 内のすべての Constant ブロックのサンプル時間を -1 に設定するには、次の MATLAB コードを使用します。blks = find_system(dut, 'BlockType', 'Constant'); for i = 1:length(blks) set_param(blks{i}, 'SampleTime', '-1'); end
バス入力またはバス出力がないこと
調整可能なマスク パラメーターがないこと。これらのブロックを共有するには、マスク エディターで、[調整可能] チェック ボックスをオフにします。
ブロックがフィードバック ループの内部にある場合は、少なくとも 1 つの Unit Delay ブロックまたは Delay ブロックが各出力端子に接続されていること。
ブロック固有の設定とリソース共有の要件については、以下を参照してください。
リソース共有レポート
リソース共有情報をレポートで見るには、各サブシステムまたはモデル参照のコードを生成する前に、最適化レポートを有効にします。このレポートを有効にするには、[HDL コード] タブで、[レポート オプション] を選択して、[最適化レポートを生成] を選択します。
[ストリーミングおよび共有] セクションで最適化レポートを生成すると、リソース共有最適化の効果が分かります。リソース共有に失敗した場合、診断メッセージと、リソース共有が失敗する原因となった問題のブロックがレポートに示されます。
リソース共有に成功した場合、[SharingFactor] と、リソースを共有したブロックのグループを含む表がレポートに示されます。表には、以下が含まれます。
グループ ID: 加算ブロックや乗算ブロックなど、リソースを共有する同様の Simulink® ブロックのグループに対する固有の ID。
リソース タイプ: 共有グループの Simulink ブロックのタイプ。
I/O の語長: 共有グループのブロックへの入力およびブロックからの出力の語長。
グループ サイズ: 共有グループの同タイプのブロック数。
ブロック名: 共有グループに属するブロックの名前。
色の凡例: 共有グループのすべてのブロックを強調表示する色。
Simulink モデルおよび生成されたモデル内の共有リソースを確認するには、[共有リソースと診断を強調表示] のリンクをクリックします。