クローン検出と置換によるリソース共有の改善
この例では、クローン検出器 (Simulink Check)アプリを使用して、繰り返しパターンを自動的に特定して置き換える方法を示します。結果として、リソース共有を使用してモデルを最適化する機会も向上します。クローン検出器アプリは、設計内のクローンを特定し、そのクローンをライブラリ内のサブシステム ブロックへのリンクに置き換えてモデルをリファクタリングします。この例では、リソース共有が最適になるようにクローン検出器アプリを使用して変更済みのモデルを使用します。これらの変更の詳細については、設計の変更によるリソース共有の改善を参照してください。
クローン検出
クローン検出は、カスタム ライブラリ ファイルを使用して入力として指定したいくつかのサンプル パターンを基準に、それに似た設計内のモデリング パターンを特定するために使用できるツールです。クローン検出器アプリは、それらのパターンを特定すると、パターンを Atomic サブシステムに置き換えます。これにより、コードの再利用によって最適なコードを生成できるようになり、Atomic サブシステムでのリソースの共有によってリソースの利用が改善されます。クローン検出の詳細については、クローン検出を使用したコンポーネント再利用の有効化 (Simulink Check)を参照してください。
リソース共有用のモデルの設定
編集後のモデルは hdlcoderParkTransformShare.slx
という名前で保存されています。次のコマンドを使用して、このバージョンのモデルを一時ディレクトリにコピーします。
design_name = 'hdlcoderParkTransformShare'; design_new_name = 'hdlcoderParkTransformShareCopy'; copyfile(fullfile([design_name,'.slx']), fullfile([design_new_name,'.slx']), 'f'); % Open the model. open_system(design_new_name);
対象のサブシステムでブロック プロパティ "SharingFactor" を 6 に設定し、モデルから対応するレポートと共に HDL を生成します。
subsystem = [design_new_name '/DUT']; hdlset_param(subsystem, 'SharingFactor', 6); save_system(design_new_name); makehdl(subsystem);
### Working on the model hdlcoderParkTransformShareCopy ### Generating HDL for hdlcoderParkTransformShareCopy/DUT ### Using the config set for model hdlcoderParkTransformShareCopy for HDL code generation parameters. ### Running HDL checks on the model 'hdlcoderParkTransformShareCopy'. ### Begin compilation of the model 'hdlcoderParkTransformShareCopy'... ### Working on the model 'hdlcoderParkTransformShareCopy'... ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 1: 38 cycles. ### Output port 2: 38 cycles. ### Working on... GenerateModel ### Begin model generation 'gm_hdlcoderParkTransformShareCopy'... ### Rendering DUT with optimization related changes (IO, Area, Pipelining)... ### Model generation complete. ### Generated model saved at hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/gm_hdlcoderParkTransformShareCopy.slx ### Delay absorption obstacles can be diagnosed by running this script: hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/highlightDelayAbsorption.m ### To clear highlighting, click the following MATLAB script: hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/clearhighlighting.m ### Generating new validation model: 'gm_hdlcoderParkTransformShareCopy_vnl'. ### Validation model generation complete. ### Begin VHDL Code Generation for 'hdlcoderParkTransformShareCopy'. ### MESSAGE: The design requires 6 times faster clock with respect to the base rate = 6. ### Begin VHDL Code Generation for 'DUT_tc'. ### Working on DUT_tc as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT_tc.vhd. ### Code Generation for 'DUT_tc' completed. ### Working on hdlcoderParkTransformShareCopy/DUT/nfp_sincos_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_sincos_single.vhd. ### Working on hdlcoderParkTransformShareCopy/DUT/nfp_sub_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_sub_single.vhd. ### Working on hdlcoderParkTransformShareCopy/DUT/nfp_mul_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_mul_single.vhd. ### Working on hdlcoderParkTransformShareCopy/DUT/nfp_add_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_add_single.vhd. ### Working on hdlcoderParkTransformShareCopy/DUT/nfp_mul_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_mul_single_block.vhd. ### Working on hdlcoderParkTransformShareCopy/DUT/nfp_uminus_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_uminus_single.vhd. ### Working on hdlcoderParkTransformShareCopy/DUT as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT.vhd. ### Generating package file hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT_pkg.vhd. ### Code Generation for 'hdlcoderParkTransformShareCopy' completed. ### Generating HTML files for code generation report at index.html ### Creating HDL Code Generation Check Report DUT_report.html ### HDL check for 'hdlcoderParkTransformShareCopy' complete with 0 errors, 0 warnings, and 2 messages. ### HDL code generation complete.
生成された "高水準リソース レポート" には、設計のリソース利用の推定結果が次のように表示されます。
乗算器 | 13 |
加算器/減算器 | 175 |
レジスタ | 1053 |
1 ビット レジスタの合計 | 14097 |
RAM | 0 |
マルチプレクサー | 601 |
I/O ビット | 196 |
静的シフト演算子 | 15 |
動的シフト演算子 | 8 |
モデルで合成ワークフローを実行することもできます。このモデルの合成結果は次のようになります。
リソース | 使用 | 使用可能 | 使用率 (%) |
スライス LUT | 8470 | 303600 | 2.79 |
スライス レジスタ | 8510 | 607200 | 1.40 |
DSP | 13 | 2800 | 0.46 |
ブロック RAM タイル | 0 | 1030 | 0.00 |
URAM | 0 | 0 | 0 |
合成ワークフローの詳細については、Simulink モデルからの HDL コード生成と FPGA 合成を参照してください。
クローン検出を使用したリソース共有用のモデルの最適化
クローン検出器アプリを使用する前に、モデル内の各繰り返しパターンを Atomic サブシステムとして格納するカスタム ライブラリを作成します。この例では、hdlcoderParkTransformShareLib.slx
という名前のカスタム ライブラリが用意されています。
% Copy the library into the temporary directory lib_name = 'hdlcoderParkTransformShareLib'; lib_new_name = 'hdlcoderParkTransformShareLibCopy'; copyfile(([lib_name,'.slx']), fullfile([lib_new_name,'.slx']), 'f'); % Open the custom library open_system('hdlcoderParkTransformShareLibCopy');
モデルのパターンを Atomic サブシステムを含むライブラリに置き換えます。クローン検出器アプリの設定方法とクローンの置き換え方法については、クローン検出を使用したコンポーネント再利用の有効化 (Simulink Check)を参照してください。具体的には、"クローン検出のためのパラメーターの設定" セクションの手順に従って、クローン検出用のライブラリをリンクし、[一致しないブロック パラメーターの最大数] の値を 0
に設定します。
その後、「クローンの置換」の節に従って、このライブラリを厳密クローンの置換用のモデルに適用します。
以下に示すように、元のモデル内のすべてのパターンがライブラリの Atomic サブシステムに置き換えられます。
<<../hdlcoderParkTransform_result_model.PNG>>
このシステムに対する変更を保存します。Simulink エディターの [シミュレーション] タブで、[保存] をクリックします。
最適化されたモデルの結果の比較
このモデルには Atomic サブシステムの内部に Sin、Cos、および Product のブロックが含まれているため、それらを共有してリソース利用を改善できます。
subsystem = [design_new_name '/DUT']; hdlset_param(subsystem, 'SharingFactor', 3); % Generate HDL code and the corresponding reports for the optimized model makehdl(subsystem);
### Working on the model hdlcoderParkTransformShareCopy ### Generating HDL for hdlcoderParkTransformShareCopy/DUT ### Using the config set for model hdlcoderParkTransformShareCopy for HDL code generation parameters. ### Running HDL checks on the model 'hdlcoderParkTransformShareCopy'. ### Begin compilation of the model 'hdlcoderParkTransformShareCopy'... ### Working on the model 'hdlcoderParkTransformShareCopy'... ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 1: 32 cycles. ### Output port 2: 32 cycles. ### Working on... GenerateModel ### Begin model generation 'gm_hdlcoderParkTransformShareCopy'... ### Rendering DUT with optimization related changes (IO, Area, Pipelining)... ### Model generation complete. ### Generated model saved at hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/gm_hdlcoderParkTransformShareCopy.slx ### Delay absorption obstacles can be diagnosed by running this script: hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/highlightDelayAbsorption.m ### To clear highlighting, click the following MATLAB script: hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/clearhighlighting.m ### Generating new validation model: 'gm_hdlcoderParkTransformShareCopy_vnl'. ### Validation model generation complete. ### Begin VHDL Code Generation for 'hdlcoderParkTransformShareCopy'. ### MESSAGE: The design requires 3 times faster clock with respect to the base rate = 6. ### Begin VHDL Code Generation for 'DUT_tc'. ### Working on DUT_tc as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT_tc.vhd. ### Code Generation for 'DUT_tc' completed. ### Working on hdlcoderParkTransformShareCopy/DUT/nfp_sincos_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_sincos_single.vhd. ### Working on hdlcoderParkTransformShareCopy/DUT/nfp_sub_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_sub_single.vhd. ### Working on hdlcoderParkTransformShareCopy/DUT/nfp_mul_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_mul_single.vhd. ### Working on hdlcoderParkTransformShareCopy/DUT/nfp_add_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_add_single.vhd. ### Working on hdlcoderParkTransformShareCopy/DUT/nfp_uminus_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_uminus_single.vhd. ### Working on hdlcoderParkTransformShareCopy/DUT as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT.vhd. ### Generating package file hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT_pkg.vhd. ### Code Generation for 'hdlcoderParkTransformShareCopy' completed. ### Generating HTML files for code generation report at index.html ### Creating HDL Code Generation Check Report DUT_report.html ### HDL check for 'hdlcoderParkTransformShareCopy' complete with 0 errors, 0 warnings, and 2 messages. ### HDL code generation complete.
共有後の高水準リソース レポートには、設計のリソース利用の推定結果が次のように表示されます。
Resource Usage _________________________ ________ Multipliers 13 Adders/Subtractors 177 Registers 1004 Total 1-Bit Registers 16657 RAMs 0 Multiplexers 610 I/O Bits 196 Static Shift operators 8 Dynamic Shift operators 8
Atomic サブシステムの共有後に [加算器/減算器]、[レジスタ]、および [1 ビット レジスタの合計] の数が少なくなったことがわかります。
モデルで合成ワークフローを実行することもできます。このモデルの合成結果は次のようになります。
Resource Usage _________________________ ________ Slice LUTs 8848 Slice Registers 8308 DSPs 13 Block Ram Tile 0 URAM 0
共有後に [Slice Registers] の数が少なくなったことがわかります。