MATLAB Datapath アーキテクチャを使用した、MATLAB Function ブロック境界を越えた HDL 最適化
この例では、MATLAB Function ブロック内、および MATLAB Function ブロック境界を越えた Simulink® モデル内の他のブロックとの間でさまざまな最適化を使用する方法を示します。また、この例は、MATLAB Function ブロックのさまざまな HDL アーキテクチャ設定を使用した場合の面積とタイミングの差異も示しています。
MATLAB Datapath アーキテクチャを使用する理由
MATLAB Function ブロックの HDL コード生成では、2 つの HDL アーキテクチャ MATLAB Function と MATLAB Datapath がサポートされます。MATLAB Function ブロックの [HDL ブロック プロパティ] ダイアログ ボックスで HDL アーキテクチャを指定します。
MATLAB Datapath アーキテクチャを使用して、次を実行します。
MATLAB Function ブロック内で複雑な固定小数点および浮動小数点 MATLAB® アルゴリズムをモデル化し、このアルゴリズムをモデル内の他の Simulink ブロックと連動させる。
MATLAB Function ブロック内、および MATLAB Function ブロック境界を越えたモデル内の他の Simulink ブロックとの間でアルゴリズムを最適化することで、設計の面積とタイミングを大幅に改善する。
MATLAB Datapath アーキテクチャは、浮動小数点型を使用する MATLAB Function ブロックの既定の設定です。固定小数点演算でこのアーキテクチャを有効にすることで、次を含むさまざまな最適化を使用できます。
階層のフラット化
リソース共有とストリーミング
クロックレート パイプライン
適応パイプライン
分散型パイプライン方式
クリティカル パスの推定
MATLAB Datapath アーキテクチャの仕組み
固定小数点 Simulink モデルは既定で MATLAB Function アーキテクチャを使用します。リソース共有や分散型パイプライン方式といった、このアーキテクチャを使用して有効化する特定の HDL 最適化では、MATLAB Function ブロック周辺のブロックと、MATLAB Function ブロック内のアルゴリズムを最適化します。MATLAB Function ブロック内の最適化の効果を確認するには、ブロックに対して生成された HDL コードを調べます。このアーキテクチャは、MATLAB Function ブロック境界を越えた他の Simulink ブロックとの間で最適化を適用しません。
MATLAB Function をブロックのアーキテクチャ設定として指定した場合でも、浮動小数点 Simulink モデルでは MATLAB Datapath アーキテクチャが使用されます。浮動小数点型を使用するときは、ネイティブ浮動小数点モードを指定します。このアーキテクチャでは、コード ジェネレーターはブロックを通常の Subsystem ブロックと同様に扱います。HDL Coder は MATLAB Function ブロック内の MATLAB コードの制御フロー アルゴリズムを Simulink ブロックを使用するデータフロー表現に変換します。MATLAB Datapath アーキテクチャは、この変換によりコード内のループを展開します。ループの最適化の詳細については、MATLAB ループの最適化を参照してください。
MATLAB Datapath アーキテクチャを使用することで、Subsystem ブロックで実行していたさまざまな HDL Coder の最適化を MATLAB Function ブロックでより効果的に実行できます。MATLAB Datapath アーキテクチャは、MATLAB Function ブロック内、および MATLAB Function ブロック境界を越えた Simulink モデル内の他のブロックとの間で、アルゴリズムで指定した最適化設定を適用します。
たとえば、Product ブロックと MATLAB Function ブロックで構成される DUT サブシステムを使用している次のモデルについて考えます。
open_system('hdlcoder_MLFB_simple_datapath') set_param('hdlcoder_MLFB_simple_datapath', 'SimulationCommand', 'Update') open_system('hdlcoder_MLFB_simple_datapath/HDL_DUT')

MATLAB Function ブロックは 2 つの乗算を実装します。
open_system('hdlcoder_MLFB_simple_datapath/HDL_DUT/MATLAB Function')

MATLAB Function ブロックの HDL アーキテクチャは MATLAB Datapath に設定されます。HDL_DUT サブシステムの HDL コードを生成するには、次のコマンドを実行します。
makehdl('hdlcoder_MLFB_simple_datapath/HDL_DUT')
HDL コードを生成するときに、コード ジェネレーターは MATLAB Function ブロックを乗算 c * d と e * f を実行するサブシステムで置き換えます。

MATLAB Datapath アーキテクチャでは、MATLAB Function ブロック内、および MATLAB Function ブロックを越えた他の Simulink ブロックとの間で最適化を実行できます。この例では、MATLAB Function ブロック内で 2 つの乗算器を共有できます。ブロックを最適化するには、MATLAB Function ブロックで [SharingFactor] を 2 に設定します。
mlsubsys = 'hdlcoder_MLFB_simple_datapath/HDL_DUT/MATLAB Function'; hdlset_param(mlsubsys, 'SharingFactor', 2)
HDL コードを生成するときに、コード ジェネレーターは MATLAB Function ブロック内で乗算を共有します。共有グループが最適化レポートに表示されます。共有グループ内のリンクをクリックすると、HDL Coder は生成されたモデルおよび元のモデルの MATLAB Function ブロック内に共有乗算器を表示します。

MATLAB Function ブロックを越えた他の Simulink ブロックとの間で最適化を適用できます。この例では、MATLAB Function ブロック外の Product ブロックを MATLAB Function ブロック内の乗算器と共有することができます。これらのリソースを共有するには、MATLAB Function ブロックで [SharingFactor] を削除し、親サブシステム HDL_DUT で [FlattenHierarchy] を有効にして、[SharingFactor] を 3 に設定します。
hdlset_param(mlsubsys, 'SharingFactor', 0) hdlset_param('hdlcoder_MLFB_simple_datapath/HDL_DUT', ... 'FlattenHierarchy', 'on', 'SharingFactor', 3)
メモ: ブロックの MATLAB Datapath アーキテクチャで InlineMATLABCode プロパティを使用しないでださい。代わりに FlattenHierarchy を使用してください。
HDL コードを生成するときに、コード ジェネレーターは MATLAB Function ブロック内の乗算を外部の Product ブロックと共有します。3 つの乗算器の共有グループを最適化レポートで確認できます。共有グループ内のリンクをクリックすると、生成されたモデルおよび元のモデルで共有乗算器が強調表示されます。

既定の MATLAB Function アーキテクチャを使用した MATLAB Function ブロック モデル
MATLAB Datapath アーキテクチャ、および MATLAB Function アーキテクチャとの差異を説明しているモデル例については、モデル hdlcoder_MLFB_share_pipeline を開いてください。モデルでは整数型が使用されます。MATLAB Datapath アーキテクチャを浮動小数点型と共に使用する方法について説明している例については、ネイティブ浮動小数点を使用したターゲットに依存しない HDL コードの生成を参照してください。
open_system('hdlcoder_MLFB_share_pipeline') set_param('hdlcoder_MLFB_share_pipeline','SimulationCommand','Update')

モデルには最上位の 2 つの DUT サブシステム HDL_DUT_sharing と HDL_DUT_distpipe が含まれています。これらのサブシステムは、MATLAB Function ブロック境界を越えた他のブロックとの間でリソース共有と分散型パイプライン方式の最適化を使用する方法を示します。どちらのサブシステムも MATLAB Function ブロックの内部と外部で基本的な加算と乗算を実行します。
open_system('hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing')

open_system('hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing/Subsystem')

open_system('hdlcoder_MLFB_share_pipeline/HDL_DUT_distpipe')

モデルに保存されている HDL パラメーターを確認するには、関数 hdlsaveparams を実行します。
hdlsaveparams('hdlcoder_MLFB_share_pipeline')
%% Set Model 'hdlcoder_MLFB_share_pipeline' HDL parameters
hdlset_param('hdlcoder_MLFB_share_pipeline', 'CriticalPathEstimation', 'on');
hdlset_param('hdlcoder_MLFB_share_pipeline', 'HDLSubsystem', 'hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing');
hdlset_param('hdlcoder_MLFB_share_pipeline', 'Oversampling', 40);
hdlset_param('hdlcoder_MLFB_share_pipeline', 'ShareAdders', 'on');
hdlset_param('hdlcoder_MLFB_share_pipeline', 'TargetDirectory', 'hdl_prj\hdlsrc');
hdlset_param('hdlcoder_MLFB_share_pipeline', 'Traceability', 'on');
% Set SubSystem HDL parameters
hdlset_param('hdlcoder_MLFB_share_pipeline/HDL_DUT_distpipe', 'DistributedPipelining', 'on');
hdlset_param('hdlcoder_MLFB_share_pipeline/HDL_DUT_distpipe', 'FlattenHierarchy', 'on');
% Set SubSystem HDL parameters
hdlset_param('hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing', 'FlattenHierarchy', 'on');
hdlset_param('hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing', 'SharingFactor', 8);
既定の MATLAB Function HDL アーキテクチャがこのモデルで MATLAB Function ブロック用に保存されていることがわかります。
MATLAB Function アーキテクチャを使用した HDL コードの生成
共有 DUT 用の HDL コードを生成するには、次のコマンドを実行します。
makehdl('hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing')
ストリーミングおよび共有レポートを開くと、レポートには 4 つの乗算器と 3 つの加算器が共有リソースとして表示されています。

2 つ目の共有グループをクリックすると、コード ジェネレーターは MATLAB Function ブロックの周辺にある 3 つの加算器を強調表示します。共有グループには、サブシステム内の 2 つの加算器と外部の Add ブロックが含まれています。コード ジェネレーターでは、MATLAB Function ブロック内にある乗算器と加算器は共有されていませんでした。
クリティカル パスの推定がモデルで有効になっています。クリティカル パスに注釈を付けるときに、MATLAB Function ブロックはこの最適化の障壁となります。クリティカル パスが MATLAB Function ブロック内にあり、クリティカル パスを強調表示する場合は、MATLAB Datapath アーキテクチャを使用します。

HDL_DUT_distpipe の HDL コードを生成するには、次のコマンドを実行します。
makehdl('hdlcoder_MLFB_share_pipeline/HDL_DUT_distpipe')
分散型パイプライン方式のレポートを開き、[分散型パイプライン方式を抑制するブロックを強調表示] リンクをクリックすると、コード ジェネレーターによって HDL_DUT_distpipe サブシステム内のパイプラインが移動されたが、MATLAB Function ブロック内でパイプラインが分散されなかったことがわかります。

MATLAB Function ブロックおよびその他の Simulink ブロックでの最適化の適用
設計の面積とタイミングを向上させるには、MATLAB Datapath アーキテクチャを使用します。HDL_DUT_sharing サブシステムでは、リソース共有とクロックレート パイプラインを組み合わせて、MATLAB Function ブロック内および MATLAB Function ブロックを越えた他のブロックとの間でリソースを共有することができます。
リソースを共有するには、次を行います。
1. [FlattenHierarchy] を有効にして、親サブシステム HDL_DUT_sharing で [SharingFactor] を指定します。[SharingFactor] を 8 に設定します。
share_subsys = 'hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing'; hdlset_param(share_subsys, 'FlattenHierarchy', 'on', 'SharingFactor', 8);
2. HDL_DUT_sharing サブシステム内の MATLAB Function ブロックに対して MATLAB Datapath アーキテクチャを指定します。
share_mlfcn1 = 'hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing/MATLAB Function'; share_mlfcn2 = 'hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing/Subsystem/MATLAB Function'; hdlset_param(share_mlfcn1, 'architecture', 'MATLAB Datapath'); hdlset_param(share_mlfcn2, 'architecture', 'MATLAB Datapath');
HDL_DUT_distpipe の HDL コードを生成するには、次のコマンドを実行します。
makehdl('hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing')
ストリーミングおよび共有レポートを開くと、レポートには 8 つの乗算器の共有グループが 1 つと、加算器の共有グループが 2 つ表示されています。

最初の共有グループを選択すると、最適化によって MATLAB Function 内の乗算器が外部の 4 つの Gain ブロックと共有されたことが分かります。2 つ目の共有グループは、2 つの MATLAB Function ブロックのそれぞれに含まれる加算器で構成されています。
分散型パイプライン方式の最適化は HDL_DUT_distpipe サブシステムで使用できます。最上位の分散型パイプライン方式を有効にして、MATLAB Function の HDL アーキテクチャを [DistributedPipelining] が on に設定された MATLAB Datapath に設定します。
dist_subsys = 'hdlcoder_MLFB_share_pipeline/HDL_DUT_distpipe/MATLAB Function'; hdlset_param(dist_subsys, 'architecture', 'MATLAB Datapath'); hdlset_param(dist_subsys, 'DistributedPipelining', 'on');
HDL_DUT_distpipe の HDL コードを生成します。
makehdl('hdlcoder_MLFB_share_pipeline/HDL_DUT_distpipe')
HDL コードの生成後、生成されたモデルを開きます。HDL Coder は分散型パイプライン方式を使用して、ブロック全体でパイプライン レジスタを移動させます。
