Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

サポートされていないブロックのブロック置換

この例では、Simulink® Design Verifier™ の関数を使用して、サポートされていないブロックを置換する方法と、特定の要件に対してテスト ベクトルの生成をカスタマイズする方法について説明します。

サポートされていないブロックを含むモデル

モデル例には、出力が Sqrt ブロックで制御される Switch ブロックが含まれます。それぞれのスイッチについて、1-D Lookup Table ブロックによりモデルの出力が計算されます。このモデルの例では、以下を達成させるテスト ケースを生成することを目的とします。

1.ルックアップ テーブルの 100% カバレッジが達成される。

2.最初と 3 番目の入力端子の値が異なる場合、テスト ベクトルがそれぞれの Switch ブロックの位置を示す。

open_system('sldvdemo_sqrt_blockrep');

モデルの互換性のチェック

関数 sqrt はサポートされていないので、このモデルの Simulink Design Verifier との互換性は部分的です。

sldvcompat('sldvdemo_sqrt_blockrep');
20-Jul-2023 16:48:58
Checking compatibility for test generation: model 'sldvdemo_sqrt_blockrep'
Compiling model...done
Building model representation...done

20-Jul-2023 16:49:18

'sldvdemo_sqrt_blockrep' is partially compatible for test generation with Simulink Design Verifier.

The model can be analyzed by Simulink Design Verifier. 
It contains unsupported elements that will be stubbed out during analysis. The results of the analysis might be incomplete. 
See the Diagnostic Viewer for more details on the unsupported elements.

非互換性を回避するカスタム ブロック置換ルールの作成

このモデルは、サポートされていない Sqrt ブロックを自動的にスタブすることにより、テスト生成の解析が可能です。しかし Sqrt ブロックは Simulink Design Verifier に認識されない上、その出力が Switch ブロックに影響するため、Switch ブロックの位置に対するテスト ケースを生成できません。Switch ブロック用のテスト ケースを必要とすることから、Sqrt ブロックを、機能的に同等なサポートされているブロックに置き換える必要があります。以下に示すライブラリ ブロック sldvdemo_custom_blockreplib は、入力信号を [0 10000] の範囲に制約し、1-D Lookup Table ブロックを使用して関数 sqrt を近似します。

テーブル データは、[0 10000] の範囲において最大誤差 0.2sqrt の値と一致するように計算されています。ルックアップ テーブル データの値については、sldvdemo_custom_blockreplib ライブラリの Sqrt_Approx ブロックのマスク初期化ペインを参照してください。

置換ルールは、MATLAB ファイル sldvdemo_custom_blkrep_rule_sqrt.m で定義されます。Sqrt ブロックの置換ブロック sldvdemo_custom_blockreplib は double 型と single 型でのみ有効であるため、このルールにより、ブロック置換を行う前にそれらの条件が確実に満たされます。

   function rule = sldvdemo_custom_blkrep_rule_sqrt
       rule = SldvBlockReplacement.blockreprule;
       rule.fileName = mfilename;
       rule.blockType = 'Sqrt';
       rule.replacementPath = sprintf('sldvdemo_custom_blockreplib/Sqrt_Approx');
       rule.replacementMode = 'Normal';
       parameter.OutMin = '$original.OutMin$';
       parameter.OutMax = '$original.OutMax$';
       parameter.OutDataTypeStr = '$original.OutDataTypeStr$';
       rule.parameterMap = parameter;
       rule.isReplaceableCallBack = @replacementTestFunction;
   end
   function out = replacementTestFunction(blockH)
       out = false;
       acceptedOutDataTypeStr = {'double','single',...
                         'Inherit: Inherit via back propagation',...
                         'Inherit: Same as input'};
       I = strmatch(get_param(blockH,'OutDataTypeStr'),acceptedOutDataTypeStr,'exact');
       if ~isempty(I)
           portDataTypes = get_param(blockH,'CompiledPortDataTypes');
           out = any(strcmp(portDataTypes.Inport,{'double','single'})) &&  ...
                 strcmp(portDataTypes.Inport,portDataTypes.Outport);
       end
   end
open_system('sldvdemo_custom_blockreplib');
open_system('sldvdemo_custom_blockreplib/Sqrt_Approx/1-D Lookup Table');

Simulink® Design Verifier™ のブロック置換オプションの設定

ブロック置換を有効にしたテスト生成モードで Simulink Design Verifier を実行します。Switch ブロックの位置に対するテスト ケースを生成するには、カスタム置換ルール sldvdemo_custom_blkrep_rule_sqrt.m を使用しなければなりません。

ルックアップ テーブルもカバーしようとする場合は、組み込みブロックの置換 blkrep_rule_lookup_normal.m が必要です。これは区間ごとにテスト オブジェクティブと 1-D Lookup Table ブロックへのブレークポイント値を挿入します。さらに、組み込みルール blkrep_rule_switch_normal.m も必要です。これは、最初と 3 番目の入力端子の値が異なる場合、それぞれのスイッチの位置に使われる必要があります。

解析は最大 30 秒間実行され、ハーネス モデルが生成されます。レポート生成も有効になります。その他の Simulink Design Verifier オプションは既定値に設定されます。

opts = sldvoptions;
opts.Mode = 'TestGeneration';
opts.MaxProcessTime = 80;
opts.BlockReplacement = 'on';
opts.BlockReplacementRulesList = ['sldvdemo_custom_blkrep_rule_sqrt.m,' ...
                                  'blkrep_rule_lookup_normal.m,'...
                                  'blkrep_rule_switch_normal.m'];
opts.SaveHarnessModel = 'on';
opts.ModelReferenceHarness = 'on';
opts.SaveReport = 'on';

ブロック置換によるテスト生成の実行

関数 sldvrun は、sldvoptions オブジェクト opts で定義された設定を使用してモデルを解析します。生成されたレポートには、モデル上で実行されたブロック置換についてまとめられた章があります。

[status,fileNames] = sldvrun('sldvdemo_sqrt_blockrep', opts, true);
Warning: Cannot tune parameters in block '<a href="matlab:open_and_hilite_hyperlink ('sldvdemo_sqrt_blockrep/1-D Lookup Table','error')">sldvdemo_sqrt_blockrep/1-D Lookup
Table</a>' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block '<a href="matlab:open_and_hilite_hyperlink ('sldvdemo_sqrt_blockrep/1-D Lookup Table','error')">sldvdemo_sqrt_blockrep/1-D Lookup
Table</a>' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 

ハーネス モデルのテストの実行

ルックアップ テーブル カバレッジのメトリクスを有効にしてから、ハーネス モデルを使用してテスト ケースを実行します。テスト スイートは、[コンフィギュレーション パラメーター] ダイアログからルックアップ テーブル カバレッジを有効にしてから、[信号エディター] ダイアログ ボックスの [すべて実行] ボタンをクリックして実行することもできます。[カバレッジ] タブで、[カバレッジ解析を有効にする] を選択し、[カバレッジ メトリクス][その他のメトリクス][ルックアップ テーブル] を選択します。

次に示されるカバレッジ レポートは、Simulink Design Verifier が生成したテスト ベクトルで 100% のルックアップ テーブル カバレッジを達成できることを示しています。

[harnessModelPath,harnessModel] = fileparts(fileNames.HarnessModel);
set_param(harnessModel,'covMetricSettings','dcmte');
sldvdemo_playall(harnessModel);

クリーン アップ

すべてのモデルを閉じて Simulink Design Verifier が生成したファイルを削除し、例を完了します。

close_system('sldvdemo_custom_blockreplib');
close_system(fileNames.HarnessModel,0);
close_system(fileNames.BlockReplacementModel,0);
close_system('sldvdemo_sqrt_blockrep',0);
delete(fileNames.HarnessModel);
delete(fileNames.BlockReplacementModel);
delete(fileNames.DataFile);