Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

設計の変更によるリソース共有の改善

この例では、設計の一部を変更することで、リソース共有によるモデル設計の最適化の機会を高める方法を示します。リソース共有は、ターゲット FPGA デバイスでの設計の面積使用を改善する HDL Coder の最適化です。この最適化では、機能的に等価な複数のリソースを特定し、それらを単一のリソースに置き換えます。詳細については、リソース共有を参照してください。

現在のモデルの解析

次のコードを実行して、必要なサンプル ファイルを一時フォルダーにコピーします。

design_name = 'hdlcoderParkTransform';
design_new_name = 'hdlcoderParkTransformCopy';

hdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos');
hdlc_temp_dir = [tempdir 'hdlcoderParkTransformDir'];

% Create a temporary folder and copy the Simulink model.
cd(tempdir);
[~, ~, ~] = rmdir(hdlc_temp_dir, 's');
mkdir(hdlc_temp_dir);
cd(hdlc_temp_dir);

copyfile(fullfile(hdlc_demo_dir, [design_name,'.slx']), fullfile(hdlc_temp_dir, [design_new_name,'.slx']), 'f');

% Open the model.
open_system(design_new_name);

% Set a SharingFactor of 6 on the subsystem of interest and generate
% HDL along with the corresponding reports from the model.
subsystem = [design_new_name '/DUT'];
hdlset_param(subsystem, 'SharingFactor', 6);
makehdl(subsystem);
### Generating HDL for 'hdlcoderParkTransformCopy/DUT'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderParkTransformCopy', { 'HDL Code Generation' } )">hdlcoderParkTransformCopy</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoderParkTransformCopy'.
### Begin compilation of the model 'hdlcoderParkTransformCopy'...
### Applying HDL optimizations on the model 'hdlcoderParkTransformCopy'...
### <a href="matlab:configset.internal.open('hdlcoderParkTransformCopy','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware.  To disable pipeline insertion for mapping lookup tables to RAM, please set the option to 'Off'.
### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays.
### Output port 1: 43 cycles.
### Output port 2: 43 cycles.
### Begin model generation.
### Model generation complete.
### Begin VHDL Code Generation for 'hdlcoderParkTransformCopy'.
### MESSAGE: The design requires 6 times faster clock with respect to the base rate = 1e-05.
### Working on hdlcoderParkTransformCopy/DUT/nfp_sin_single as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/nfp_sin_single.vhd.
### Working on hdlcoderParkTransformCopy/DUT/nfp_add_single as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/nfp_add_single.vhd.
### Working on hdlcoderParkTransformCopy/DUT/nfp_sub_single as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/nfp_sub_single.vhd.
### Working on hdlcoderParkTransformCopy/DUT/nfp_mul_single as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/nfp_mul_single.vhd.
### Working on hdlcoderParkTransformCopy/DUT/nfp_mul_single as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/nfp_mul_single_block.vhd.
### Working on hdlcoderParkTransformCopy/DUT/nfp_add_single as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/nfp_add_single_block.vhd.
### Working on hdlcoderParkTransformCopy/DUT/nfp_add2_single as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/nfp_add2_single.vhd.
### Working on hdlcoderParkTransformCopy/DUT/nfp_sub_single as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/nfp_sub_single_block.vhd.
### Working on DUT_tc as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/DUT_tc.vhd.
### Working on hdlcoderParkTransformCopy/DUT as hdl_prj/hdlsrc/hdlcoderParkTransformCopy/DUT.vhd.
### Generating package file hdl_prj/hdlsrc/hdlcoderParkTransformCopy/DUT_pkg.vhd.
### Code Generation for 'hdlcoderParkTransformCopy' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/Bdoc22a_1859087_174506/hdlcoderParkTransformDir/hdl_prj/hdlsrc/hdlcoderParkTransformCopy/html/hdlcoderParkTransformCopy_codegen_rpt.html');">hdlcoderParkTransformCopy_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/Bdoc22a_1859087_174506/hdlcoderParkTransformDir/hdl_prj/hdlsrc/hdlcoderParkTransformCopy/DUT_report.html
### HDL check for 'hdlcoderParkTransformCopy' complete with 0 errors, 1 warnings, and 2 messages.
### HDL code generation complete.

生成されたストリーミングおよび共有レポートを確認すると、共有可能と特定されたグループがいくつかあることがわかります。

       Resource Type      Group Size     Block Name
     _________________   ____________   ____________
     Trigonometry        6              sine
     Sum                 2              AddSub2
     Sum                 2              AddSub1
     Product             6              Product
     Product             2              Gain

ネイティブ浮動小数点リソース レポートには、必要な演算子が次のように表示されます。

             Resource             Usage
     _________________________   ________
     Adders                      4
     Multipliers                 2
     Sin                         1
     Subtractors                 2

高水準リソース レポートには、設計のリソース利用の推定結果が次のように表示されます。

             Resource             Usage
     _________________________   ________
     Multipliers                 9
     Adders/Subtractors          152
     Registers                   1121
     Total 1-Bit Registers       15896
     RAMs                        0
     Multiplexers                857
     I/O Bits                    228
     Static Shift operators      5
     Dynamic Shift operators     13

モデルで合成ワークフローを実行することもできます。このモデルの合成結果は次のようになります。

             Resource             Usage
     _________________________   ________
     Slice LUTs                  29381
     Slice Registers             24140
     DSPs                        50
     Block Ram Tile              0
     URAM                        0

合成ワークフローの詳細については、Simulink モデルからの HDL コード生成と FPGA 合成を参照してください。

モデル内のパターンの検出

モデルをさらに解析すると、リソース共有を改善するために変更できるパターンがいくつか見つかります。

そのようなパターンの 1 つは、名前が AddSub で始まり、出力が Sin ブロックに送られる、Add ブロックと Subtract ブロックにあります。

2 つ目のパターンは、Gain ブロックが続く Sum (加算または減算) ブロックに該当します。

これらのパターンのいずれにも、強調表示されたブロックに最適なリソース共有を妨げる相違がいくつかあります。次のような相違です。

まず、Gain ブロックの近くの領域にある Sum ブロックの符号が異なります。符号は、上から下の順に +++--- です。

この不一致は次のように変更して修正できます。

  1. 下の Sum ブロックの符号を --- から +++ に切り替えます。

  2. 下の 3 つの Sin ブロックを Cos ブロックにします。

  3. Cos ブロックおよび下の 2 つの Sum ブロックへの入力を Inport 5 ShiftedTheta から Inport 4 Theta に変更します。

次に、さまざまな領域にある Sum ブロックの符号が異なります。符号は、上から下の順に +-+++-++ です。

両方の符号が正のブロックは、2 つの符号が異なるブロックとは別に共有されています。両方の符号が正のブロックと 2 つの符号が異なるブロックのこの分離により、必要なリソースが多くなっています。モデルをさらに簡潔にすれば、モデル内の Sum ブロックの数を減らすことができ、リソース共有も改善します。Sum ブロックへの入力も同様であり、必要な Sum ブロックの数を 2 つに削減できます。符号の不一致は、その後に Unary Minus ブロックを導入して簡単に解決できます。

これで相違が解決され、元のモデルよりも多くのリソースが共有されるようになります。

この編集後のモデルは hdlcoderParkTransformShare.slx という名前で保存されています。次のコマンドを使用して、このバージョンのモデルを一時ディレクトリにコピーします。

design_name = 'hdlcoderParkTransformShare';
design_new_name = 'hdlcoderParkTransformShareCopy';

copyfile(fullfile(hdlc_demo_dir, [design_name,'.slx']), fullfile(hdlc_temp_dir, [design_new_name,'.slx']), 'f');

% Open the model.
open_system(design_new_name);

最適化されたモデルの結果の比較

このモデルはリソース共有用に改善されており、より多くのリソースを共有してリソース利用を改善できます。対象のサブシステムで SharingFactor を 3 に設定し、最適化されたモデルから対応するレポートと共に HDL を生成します。

subsystem = [design_new_name '/DUT'];

hdlset_param(subsystem, 'SharingFactor', 6);
makehdl(subsystem);
### Generating HDL for 'hdlcoderParkTransformShareCopy/DUT'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderParkTransformShareCopy', { 'HDL Code Generation' } )">hdlcoderParkTransformShareCopy</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoderParkTransformShareCopy'.
### Begin compilation of the model 'hdlcoderParkTransformShareCopy'...
### Applying HDL optimizations on the model 'hdlcoderParkTransformShareCopy'...
### <a href="matlab:configset.internal.open('hdlcoderParkTransformShareCopy','LUTMapToRAM')">'LUTMapToRAM'</a> is set to 'On' for the model. This option is used to map lookup tables to a block RAM in hardware.  To disable pipeline insertion for mapping lookup tables to RAM, please set the option to 'Off'.
### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays.
### Output port 1: 39 cycles.
### Output port 2: 39 cycles.
### Begin model generation.
### Model generation complete.
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoderParkTransformShareCopy_vnl')">gm_hdlcoderParkTransformShareCopy_vnl</a>.
### 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.
### 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 DUT_tc as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT_tc.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 <a href="matlab:web('/tmp/Bdoc22a_1859087_174506/hdlcoderParkTransformDir/hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/html/hdlcoderParkTransformShareCopy_codegen_rpt.html');">hdlcoderParkTransformShareCopy_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/Bdoc22a_1859087_174506/hdlcoderParkTransformDir/hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT_report.html
### HDL check for 'hdlcoderParkTransformShareCopy' complete with 0 errors, 1 warnings, and 2 messages.
### HDL code generation complete.

設計の変更後のネイティブ浮動小数点リソース レポートには、必要な演算子が更新されて次のように表示されます。

             Resource             Usage
     _________________________   ________
     Adders                      2
     Multipliers                 2
     SinCos                      1
     Subtractors                 1
     Unary Minus                 1

共有後に [加算器][乗算器]、および [減算器] の数が少なくなったことがわかります。

共有後の高水準リソース レポートには、設計のリソース利用の推定結果が次のように表示されます。

              Resource            Usage
     _________________________   ________
     Multipliers                 13
     Adders/Subtractors          178
     Registers                   1012
     Total 1-Bit Registers       16888
     RAMs                        0
     Multiplexers                610
     I/O Bits                    196
     Static Shift operators      8
     Dynamic Shift operators     8

モデルで合成を実行した後、次のような結果が表示されます。

             Resource             Usage
     _________________________   ________
     Slice LUTs                  8792
     Slice Registers             8419
     DSPs                        13
     Block Ram Tile              0
     URAM                        0

共有後に [Slice LUTs][Slice Registers]、および [DSPs] の数が少なくなったことがわかります。

クローン検出アプリケーションによる繰り返しパターンの自動置き換えを使用してリソース共有をさらに改善する方法については、クローン検出と置換によるリソース共有の改善を参照してください。