Main Content

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

MATLAB 関数のモデル カバレッジ

MATLAB®

MATLAB 関数のモデル カバレッジについて

Simulink® Coverage™ ソフトウェアにより、Simulink モデルのシミュレーションが実行され、MATLAB Function ブロックのコードの判定と条件に対するモデル カバレッジ データがレポートされます。モデル カバレッジの対象となるのは、コード生成用に設定された MATLAB 関数のカバレッジのみです。

たとえば、以下のような if ステートメントについて考えてみます。

if (x > 0 || y > 0)
	reset = 1;

この if ステートメントには、2 つの条件 (x > 0y > 0) がある判定があります。Simulink Coverage ソフトウェアは、モデルのシミュレーション時にすべての判定と条件が実行されることを確認します。

MATLAB 関数のモデル カバレッジの種類

コード生成用に設定された MATLAB 関数について Simulink Coverage ソフトウェアにより記録されるモデル カバレッジの種類は、以下のとおりです。

判定カバレッジ

シミュレーション時に以下の MATLAB Function ブロック ステートメントがテストされ、判定カバレッジが計算されます。

  • 関数ヘッダー — 関数またはローカル関数が実行された場合に、判定カバレッジが 100% になります。

  • ifif 式が少なくとも 1 回ずつ true および false として評価された場合に、判定カバレッジが 100% になります。

  • switch — 実現不可能なケースを含むすべての switch ケースが網羅された場合に、判定カバレッジが 100% になります。

  • for — 同等ループ条件が少なくとも 1 回ずつ true および false として評価された場合に、判定カバレッジが 100% になります。

  • while — 同等ループ条件が少なくとも 1 回ずつ true および false として評価された場合に、判定カバレッジは 100% になります。

条件カバレッジと MCDC カバレッジ

シミュレーション時に MATLAB Function ブロック関数で次の論理条件がテストされ、条件カバレッジと MCDC カバレッジが計算されます。

  • if ステートメント条件

  • 代入ステートメントの論理式

Simulink Design Verifier カバレッジ

次の MATLAB 関数はコード生成と Simulink Design Verifier™ でアクティブとなります。

[コンフィギュレーション パラメーター] ダイアログ ボックスの [カバレッジ] ペインで [オブジェクティブと制約] カバレッジ メトリクスが指定されている場合、Simulink Coverage ソフトウェアによりこれらの関数のカバレッジが記録されます。

これらの関数はいずれも、式 expr (sldv.test(expr) など) を評価します。expr は有効な MATLAB 論理式です。Simulink Design Verifier カバレッジでは、式 exprtrue と評価されるタイム ステップの数が測定されます。

少なくとも 1 つのタイム ステップで exprtrue であれば、その関数の Simulink Design Verifier カバレッジは 100% になります。それ以外の場合、Simulink Coverage ソフトウェアではその関数のカバレッジが 0% としてレポートされます。

カバレッジ レポートでの Simulink Design Verifier 関数のカバレッジ データの例については、Simulink Design Verifier カバレッジを参照してください。

関係演算子の境界カバレッジ

MATLAB Function ブロックに関係演算が含まれる場合は、関係演算子の境界カバレッジ メトリクスがこのブロックに適用されます。

MATLAB Function ブロックが関係演算を含む関数を複数回呼び出すと、関係演算子の境界カバレッジは、関数が呼びされたすべてのインスタンスにおける累積結果をレポートします。関数の関係演算がそれぞれの呼び出しで異なる型のオペランドを使用する場合、関係演算子の境界カバレッジは、より厳格なオペランド型の許容誤差規則を使用します。たとえば、関係演算がある呼び出しで int32 オペランドを使用し、別の呼び出しで double オペランドを使用する場合、関係演算子の境界カバレッジは double オペランドの許容誤差規則を使用します。

許容誤差の規則と型の厳格さの順序については、関係演算子の境界カバレッジを参照してください。

MATLAB 関数のカバレッジを収集する方法

モデルのシミュレーションの実行時に、Simulink Coverage ソフトウェアではコード生成用に設定された MATLAB 関数のカバレッジ データを収集できます。[カバレッジ] アプリからモデル カバレッジを有効にします。

次の MATLAB 関数のモデル カバレッジを収集します。

  • MATLAB Function ブロックの関数

  • 外部 MATLAB ファイルの関数

    外部 MATLAB ファイルのカバレッジを収集するには、[コンフィギュレーション パラメーター] ダイアログ ボックスの [カバレッジ] ペインで、[MATLAB ファイルのカバレッジ] を選択します。

  • Simulink Design Verifier 関数は以下があります。

    これらの関数のカバレッジを収集するには、[コンフィギュレーション パラメーター] ダイアログ ボックスの [カバレッジ] ペインで [オブジェクティブと制約] カバレッジ メトリクスを選択します。

以下の節では、それぞれの状況でのモデル カバレッジの例を紹介します。

例: MATLAB 関数のモデル カバレッジ

MATLAB Function ブロックのモデル カバレッジ

Simulink Coverage ソフトウェアでは、MATLAB Function ブロックの関数のモデル カバレッジが測定されます。

次のモデルでは、MATLAB Function ブロックに 2 つの MATLAB 関数があります。

A MATLAB function block which executes the function run_intersect_test. The MATLAB function block output is connected to a Scope block.

[コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインにある [ソルバーの選択] で、シミュレーション パラメーターを次のように設定します。

  • タイプ固定ステップ

  • ソルバー離散 (連続状態なし)

  • 固定ステップ (基本サンプル時間)1

MATLAB Function ブロックには、以下の 2 つの関数があります。

  • 最上位の関数 run_intersect_test は 2 つの四角形 (1 つは固定、もう 1 つは移動) の座標を引数として rect_intersect に送ります。

  • ローカル関数 rect_intersect は、2 つの四角形の交差をテストします。移動する四角形の原点は、タイム ステップごとに x 方向と y 方向の両方に 1 ずつ増加します。

移動するテスト四角形の原点の座標は、固定データ x1 および y1 (いずれも初期値は -1) で表されます。最初のサンプルでは x1y1 は両方とも 0 に増加します。その後のシミュレーション時の四角形の引数の推移は次の図のようになります。

固定の四角形は太枠で示されていて、左下の原点の座標は (2,4) で、幅と高さは 2 です。時間が t = 0 の時点では、最初のテスト四角形の原点の座標は (0,0) で、幅と高さは 2 です。その後のサンプルでは、テスト四角形の原点の座標は (1,1) ずつ増加しています。サンプル時間 t = 234 での四角形はテスト四角形と交差しています。

ローカル関数 rect_intersect は2 つの四角形の引数が交差しているか確認します。各引数は四角形の左下の角 (原点) の座標、幅、高さで構成されています。左側と右側の x 値と、上側と下側の y 値は、四角形ごとに計算され、入れ子にされた if-else 判定で比較されます。この関数は、四角形が交差している場合は logical 1 を、交差していない場合は logical 0 を返します。

シミュレーション時のスコープの出力は、サンプル時間に対する戻り値のプロットを表し、サンプル時間 23 および 4 で交差している四角形を明示します。

Scope output showing a flat line that starts at zero at time zero, steps up to one at time two, and returns to zero at time five. The signal remains at zero for the rest of the time steps.

シミュレーションが終了すると、モデル カバレッジ レポートがブラウザー ウィンドウに表示されます。概要に続いて、モデル カバレッジ レポートの詳細節にモデルの各部分に関する情報が表示されます。

MATLAB Function ブロックのモデル カバレッジ レポートには、ブロック自体には関数以外に判定はないことが示されています。

この後の各節では、関数、ブロック、モデルという逆の順序でモデル例のモデル カバレッジ レポートを確認します。逆の順序で確認することで、各節の先頭に表示される概要情報の意味がわかりやすくなります。

MATLAB 関数 run_intersect_test のカバレッジ.  MATLAB Function ブロック関数 run_intersect_test のモデル カバレッジは、リンク付きの関数名の下に表示されます。このリンクをクリックすると、エディターで関数が開きます。

リンク付きの関数名の下に、run_intersect_test のコードがある親 MATLAB Function ブロックのモデル カバレッジ レポートへのリンクがあります。

Coverage results for MATLAB function run_intersect_test. The cyclomatic complexity is 7. The function receives 100% decision coverage with 8 out of 8 decision outcomes satisfied, 88% condition coverage with 7 out of 8 condition outcomes satisfied, and 75% MCDC with 3 out of 4 conditions having reversed the decision outcome.

関数のレポートの上半分には、モデル カバレッジ結果の概要が表示されます。run_intersect_test のカバレッジ メトリクスには、判定カバレッジ、条件カバレッジ、MCDC カバレッジがあります。run_intersect_test のコードを調べると、これらのメトリクスについて理解できるようになります。

Code view of the coverage report. Lines 1, 6, 14, and 27 are colored completely in green. Line 30 is colored partially red to indicate that part of the decision does not receive full coverage. The rest of the lines are not colored.

カバレッジ要素がある行の行番号が強調表示されます。

  • 1 行目は、最上位の関数 run_intersect_test が実行されるかどうかの判定カバレッジの対象となります。

  • 6 行目は、if ステートメントの判定カバレッジの対象となります。

  • 14 行目は、ローカル関数 rect_intersect が実行されるかどうかの判定カバレッジの対象となります。

  • 27 行目と 30 行目は、if ステートメントおよび条件の判定カバレッジ、条件カバレッジ、MCDC カバレッジの対象となります。

    これらの各行は、リストに続くレポートの題名になっています。

    30 行目の条件 right1 < left2 は赤色で強調表示されています。これは、この条件がシミュレーションで起こり得るすべての結果に対してテストされているわけではないことを示しています。具体的にどの結果に対するテストが行われていないかは、30 行目の判定に対するレポートに示されています。

この後の各節には、各 run_intersect_test 判定行のカバレッジが表示されます。各行のカバレッジでは、行の内容がそのままタイトルとなります。行をクリックすると、エディターで当該の行が開きます。

1 行目のカバレッジ.  1 行目のカバレッジ メトリクスは、関数 run_intersect_test のカバレッジ データの一部です。

コード生成用に設定された各 MATLAB 関数の 1 行目は、呼び出しに応じて関数を実行する判定のメトリクスとしてカバレッジ解析の対象になります。run_intersect_test のカバレッジは、シミュレーション時に少なくとも 1 回実行されていることを示しています。

Coverage results for run_intersect_test reports 100% decision coverage. The function executed 11 out of 11 time steps.

6 行目のカバレッジ.  "判定解析" 表は、6 行目の判定 (if isempty(x1)) が全部で 8 回実行されていることを表しています。最初に実行された時点で、この判定は true と判定され、run_intersect_test により固定データの値が初期化されました。残りの 7 回の実行では、この判定は false と評価されました。起こり得る両方の結果が発生したため、判定カバレッジは 100% となります。

Coverage results for if isempty(x1) reports 100% decision coverage. The decision is true for 1 out of 11 time steps, and false for 10 out of 11 time steps.

14 行目のカバレッジ.  "判定解析" 表は、テスト時にローカル関数 rect_intersect が実行されたことを示しており、カバレッジも 100% になっています。

Coverage results for rect_intersect reports 100% decision coverage. The function executed 11 out of 11 time steps.

27 行目のカバレッジ.  "判定解析" 表は、27 行目の判定に対して起こり得る結果として、truefalse の 2 つが存在することを示しています。8 回の実行のうち 5 回で、この判定は false と評価されています。残りの 3 回は true と評価されています。起こり得る両方の結果が発生したため、判定カバレッジは 100% となります。

"条件解析" 表からは、27 行目の判定のその他の詳細もわかります。この判定は論理 OR (||) 演算で結合された 2 つの条件で構成されているため、判定が true と評価されるには 1 つの条件だけが true と評価されなければなりません。最初の条件が true と評価された場合は、2 番目の条件を評価する必要はありません。最初の条件 (top1 < bottom2) は 8 回評価され、そのうち 2 回は true と評価されました。つまり、2 番目の条件は 6 回しか評価されていません。そのうち 1 回だけが true と評価されているため、この判定が true と判定された回数は全部で 3 回となり、その値が "判定解析" 表に表示されています。

MCDC カバレッジは、条件結果が T から F または F から T に変化したことが原因で反転した判定を検出します。"MCDC 解析" 表には、判定の反転の原因となる可能性がある条件の結果の組み合わせがすべて表示されます。文字 x は、判定の反転に関連しない条件結果を示しています。シミュレーション時に発生しなかった判定の反転による条件結果は、小かっこで囲まれて表示されます。この例では小かっこは表示されていないため、判定の反転による結果はすべて発生していることになり、27 行目の判定の MCDC カバレッジが完全に網羅されています。

30 行目のカバレッジ.  30 行目の判定 (if (right1 < left2 || right2 < left1)) は 27 行目の判定の if ステートメント内で入れ子になっていて、27 行目の判定が false である場合にのみ評価されます。27 行目の判定が false として 5 回評価されているため、30 行目は 5 回評価され、そのうち 3 回が false でした。truefalse の両方の結果が得られたため、30 行目の判定カバレッジは 100% です。

27 行目と同様に、30 行目には論理 OR 演算子 (||) によって 2 つの条件が関連付けられているため、条件 1 が false の場合にのみ条件 2 がテストされます。条件 1 のテスト結果が 5 回 false になっているため、条件 2 は 5 回テストされます。そのうち、条件 2 のテスト結果は 2 回 true、3 回 false になっているため、この判定の結果は 2 回 true になっているとみなされます。

30 行目の判定では、最初の条件のテスト結果が true にならないため、両方の結果は得られず、最初の条件の条件カバレッジは赤色で強調表示されています。また、この条件の true の結果に基づき、判定の反転に対する MCDC カバレッジも同様に強調表示されています。

run_intersect_test のカバレッジ.  [詳細] タブで、次のように関数 run_intersect_test 全体のカバレッジの概要を示すメトリクスが表示され、繰り返されます。

Coverage results for run_intersect_test reports a cyclomatic complexity of 7, and 100% decision coverage (8 out of 8 decision outcomes satisfied), 88% condition coverage (7 out of 8 condition outcomes satisfied), and 75% MCDC coverage (3 out of 4 conditions reversed the decision outcome).

カバレッジ メトリクスの概要でまとめられている結果から、次のことがわかります。

  • run_intersect_test の 8 つの判定結果がレポート行で報告されています。

    • 1 行目: 1 つ (実行済み)

    • 6 行目: 2 つ (truefalse)

    • 14 行目: 1 つ (実行済み)

    • 27 行目: 2 つ (truefalse)

    • 30 行目: 2 つ (truefalse)

    各行の判定カバレッジは 100% を示しています。これは、run_intersect_test の判定カバレッジが、8 つの起こり得る結果のうちの 8 つ (100%) であることを示しています。

  • run_intersect_test の 4 つの条件がレポート行で報告されています。27 行目と 30 行目にはそれぞれ 2 つの条件があり、各条件には 2 つの条件結果 (truefalse) があるため、run_intersect_test の条件結果は合計で 8 つになります。30 行目 (right1 < left2) の最初の条件を除くすべての条件で、truefalse の両方の結果に対してテスト結果が正になります。つまり、run_intersect_test の条件カバレッジは 8 分の 7 (88%) となります。

  • 27 行目と 30 行目の判定の MCDC カバレッジ表それぞれに、各条件に対し判定の反転のケースが 2 つ挙げられており、可能な反転は全部で 4 つとなります。30 行目の条件 right1 < left2 の評価の変化 (true から false) に対する判定の反転のみが、このシミュレーションでは発生していません。つまり、有効な反転のケースのうちシミュレーション時にテストされたのは 4 つのうち 3 つ (75%) で、カバレッジは 75% となります。

外部ファイルの MATLAB 関数のモデル カバレッジ

ここではMATLAB Function ブロックのモデル カバレッジで使用したモデルと同じモデルで、run_intersect_testrect_intersect という MATLAB 関数が、run_intersect_test.m という外部 MATLAB ファイルに保存されているものとします。

外部ファイルの MATLAB 関数のカバレッジを収集するには、[コンフィギュレーション パラメーター] ダイアログ ボックスの [カバレッジ] ペインで、[MATLAB ファイルのカバレッジ] を選択します。

シミュレーションが完了すると、モデル カバレッジ レポートの概要に、最上位モデルと外部関数に関する節が表示されます。

Coverage report summary shows a total coverage of 88% condition coverage, 100% decision coverage, and 75% MCDC coverage. Item 1 shows coverage for run_intersect_test and reports 88% condition coverage, 100% decision coverage, and 75% MCDC coverage. Item 2 shows coverage for intersecting_rectangles1 and reports 100% decision coverage, and the other metrics not applicable.

run_intersect_test.m のモデル カバレッジ レポートには、関数が MATLAB Function ブロックに保存されている場合と同様のカバレッジ データが記載されます。

外部ファイルの MATLAB 関数のモデル カバレッジ レポートの詳細な例は、外部 MATLAB ファイル カバレッジ レポートを参照してください。

Simulink Design Verifier MATLAB 関数のモデル カバレッジ

MATLAB コードに、コード生成用に設定された次の Simulink Design Verifier 関数のいずれかが含まれている場合は、カバレッジを測定できます。

この例では、MATLAB Function ブロックがある以下のモデルについて考えます。

A model contains a constant block set to 30. The signal from the constant block enters a MATLAB Function block. The signal from the MATLAB function block enters an outport block.

MATLAB Function ブロックには次のコードが含まれます。

function y = fcn(u)
% This block supports MATLAB for code generation.
 
sldv.condition(u > -30)
sldv.test(u == 30)
y = 1;

Simulink Design Verifier MATLAB 関数のカバレッジを収集するには、[コンフィギュレーション パラメーター] ダイアログ ボックスの [カバレッジ] ペインの [その他のメトリクス] で、[オブジェクティブと制約] を選択します。

シミュレーション後に、モデル カバレッジ レポートに関数 sldv.condition と関数 sldv.test のカバレッジが表示されます。sldv.condition については、式 u > -30 が 51 回 true と評価されています。sldv.test については、式 u == 30 が 51 回 true と評価されています。

Simulink Design Verifier ブロックのモデル カバレッジ データの例は、オブジェクティブと制約カバレッジを参照してください。