MATLAB 関数のモデル カバレッジ
カバレッジを有効にしてモデルをシミュレートすると、Simulink® Coverage™ はモデルを解析してモデル カバレッジ データをレポートします。MATLAB Function ブロックや外部 MATLAB® 関数の呼び出しなどで MATLAB コードがモデルに含まれている場合、Simulink Coverage は選択されたメトリクスについてそのコードを解析します。
MATLAB 関数のモデル カバレッジの収集
MATLAB Function ブロックや外部 MATLAB 関数をカバレッジについて解析するには、まずブロックまたは関数内の MATLAB コードがコード生成との互換性をもつようにする必要があります。コード生成用に MATLAB コードを構成する方法の詳細については、コード生成のために MATLAB コードを準備するワークフロー (MATLAB Coder)を参照してください。
たとえば、以下のような if
ステートメントについて考えてみます。
if (x > 0 || y > 0) reset = 1;
この if
ステートメントには、2 つの条件 (x > 0
と y > 0
) がある判定があります。Simulink Coverage はモデルのシミュレーション時に各判定と条件を解析し、それぞれの結果が生じた回数をレポートします。たとえば、x
の入力信号がすべてのシミュレーション タイム ステップで真の場合、偽のケースが生じていないため、その条件の条件カバレッジが 50% であるとレポートします。
MATLAB 関数のカバレッジを収集する際には、以下を考慮します。
モデルに MATLAB Function ブロックが含まれていて、選択したカバレッジ メトリクスが適用されるコードが関数に含まれている場合は、MATLAB Function ブロックはカバレッジ解析の対象となります。
外部 MATLAB ファイル内の関数のカバレッジを収集するには、[コンフィギュレーション パラメーター] ダイアログ ボックスの [カバレッジ] ペインの [解析に含める] の下にある [MATLAB ファイル] を選択します。
以下の Simulink Design Verifier™ 関数のカバレッジを収集するには、次のようにします。
sldv.condition
(Simulink Design Verifier)sldv.test
(Simulink Design Verifier)sldv.assume
(Simulink Design Verifier)sldv.prove
(Simulink Design Verifier)
[コンフィギュレーション パラメーター] ダイアログ ボックスの [カバレッジ] ペインの [その他のメトリクス] で、[オブジェクティブと制約] を選択します。
MATLAB 関数のモデル カバレッジの種類
Simulink Coverage が MATLAB 関数に対して解析するモデル カバレッジの種類は以下のとおりです。
判定カバレッジ
シミュレーション時に Simulink Coverage は以下の MATLAB ステートメントを解析して判定カバレッジとしてレポートします。
関数ヘッダー — 関数またはローカル関数が 1 回以上実行された場合に、判定カバレッジが 100% になります。
if
—if
式が少なくとも 1 回ずつtrue
およびfalse
として評価された場合に、判定カバレッジが 100% になります。switch
— 実現不可能なケースを含むすべてのswitch
ケースが少なくとも 1 回網羅された場合に、判定カバレッジが 100% になります。for
— 同等ループ条件が少なくとも 1 回ずつtrue
およびfalse
として評価された場合に、判定カバレッジが 100% になります。while
— ループ条件が少なくとも 1 回ずつtrue
およびfalse
として評価された場合に、判定カバレッジが 100% になります。
条件カバレッジと MCDC カバレッジ
条件および MCDC カバレッジを収集すると、Simulink Coverage は if
ステートメントの条件および代入ステートメントの論理式を解析します。
論理式とは、logical AND
(&&
) や logical OR
(||
) などの論理演算子が含まれている式です。モデル カバレッジでは以下のような単純な logical の代入は解析されません。
b = true;
b = a < 1;
Simulink Design Verifier カバレッジ
次の MATLAB 関数はコード生成と Simulink Design Verifier でアクティブとなります。
sldv.condition
(Simulink Design Verifier)sldv.test
(Simulink Design Verifier)sldv.assume
(Simulink Design Verifier)sldv.prove
(Simulink Design Verifier)
[コンフィギュレーション パラメーター] ダイアログ ボックスの [カバレッジ] ペインで [オブジェクティブと制約] カバレッジ メトリクスを選択した場合、Simulink Coverage によりこれらの関数が解析されます。
これらの関数はいずれも、式 (sldv.test(
など) を評価します。expr
)expr
は有効な MATLAB 論理式です。Simulink Design Verifier カバレッジでは、式 expr
が true
と評価されるタイム ステップの数が測定されます。
少なくとも 1 つのタイム ステップで expr
が true
であれば、その関数の Simulink Design Verifier カバレッジは 100% になります。それ以外の場合、その関数に対してレポートされるカバレッジは 0% です。
カバレッジ レポートでの Simulink Design Verifier 関数のカバレッジ データの例については、Simulink Design Verifier カバレッジを参照してください。
整数オーバーフローで飽和カバレッジ
[整数オーバーフローで飽和] パラメーターを選択した場合、Simulink Coverage は、整数データ型が含まれている MATLAB 関数のステートメントを解析します。
整数オーバーフローで飽和カバレッジでは、ステートメントが整数オーバーフローで飽和する回数を記録します。論理ステートメントが少なくとも 1 回整数オーバーフローで飽和し、かつ少なくとも 1 回飽和しない場合に、テスト ケースでフル カバレッジが得られます。
関係演算子の境界カバレッジ
少なくとも 1 つの関係演算が含まれている MATLAB Function ブロックの関係演算子の境界カバレッジを収集できます。
MATLAB Function ブロックが関係演算を含む関数を複数回呼び出すと、関係演算子の境界カバレッジは、関数が呼びされた各インスタンスにおける累積結果をレポートします。関数の関係演算がそれぞれの呼び出しで異なる型のオペランドを使用する場合、関係演算子の境界カバレッジは、より厳格なオペランド型の許容誤差規則を使用します。たとえば、関係演算がある呼び出しで int32
オペランドを使用し、別の呼び出しで double
オペランドを使用する場合、関係演算子の境界カバレッジは double
オペランドの許容誤差規則を使用します。
許容誤差の規則と型の厳格さの順序については、関係演算子の境界カバレッジを参照してください。
実行時の最適化のため、ハードコーディングされた制約入力を使用したデッド ロジックは、関係演算子の境界カバレッジでは解析されません。たとえば、以下の関数について考えます。
function out = myFun(x,y) if nargin < 2 y = 3; end
if
ステートメントの内容はデッド ロジックになります。これは、この if ステートメントがすべてのタイム ステップで偽になるからです。この場合、Simulink Coverage は関係演算子の境界カバレッジでこのステートメントを解析しません。