カスケード論理ブロックの MCDC の解析
R2026bこの例では、Simulink® Coverage™ を使用して Logical Operator ブロックのカスケードの MCDC メトリクスを記録する方法を説明します。
モデル例
Simulink には、さまざまなブール論理実装方法があります。たとえば、MATLAB Function ブロックで if ステートメントを使用する、Stateflow チャートで条件付きの遷移を使用する、カスケードで互いに接続されている複数の Logical Operator ブロックを組み合わせるなどです。
モデル例 slvnvdemo_cv_logic_cascade は、MATLAB Function ブロック内の MATLAB コードと Logical Operator ブロックのカスケードで使用することにより、同じ論理式を実装します。
次のコマンドを使用して、モデル slvnvdemo_cv_logic_cascade を開きます。
open_system('slvnvdemo_cv_logic_cascade');

MATLAB Function ブロックを開いて関連する関数を確認します。
open_system('slvnvdemo_cv_logic_cascade/MATLAB Function')

MATLAB Function ブロックで、"(a && (b | | c))" が true である場合は、信号 "Data1" が出力されます。それ以外の場合は、信号 "Data2" が出力されます。
次のコマンドを使用してサブシステム 'Logic Cascade' を開き、このサブシステムが、Logical Operator ブロックおよび Switch を使用してまったく同じロジックを実装することを確認します。
open_system('slvnvdemo_cv_logic_cascade/Logic Cascade');

最後に、信号エディターを開いて、boolean 入力 "a"、"b" および "c" に 3 つの組み合わせが与えられていることを確認します。これらの組み合わせは、FFF、TFT および TTT です。
open_system('slvnvdemo_cv_logic_cascade/Signal Editor');

信号エディターを閉じます。
close_system('slvnvdemo_cv_logic_cascade/Signal Editor', 0);
カバレッジ レポートでの MCDC 結果の比較
モデルのシミュレーションを行い、カバレッジ レポートを生成します。
testObj = cvtest('slvnvdemo_cv_logic_cascade'); testObj.settings.decision = 1; testObj.settings.condition = 1; testObj.settings.mcdc = 1; covdata = cvsim(testObj); % Simulate for coverage cvhtml('exampleReport.html',covdata); % Generate Coverage Report
ans = logical 0
MATLAB Function ブロックの MCDC 結果
生成されたレポートで、MATLAB Function ブロックの詳細に移動します。


MATLAB Function ブロック内の if ステートメントの MCDC 結果は、指定した入力であり、予測されるとおりです。
ロジック カスケードの MCDC 結果
次に、ロジック カスケードの結果を調べます。このブロックの組み合わせでは、MATLAB Function ブロック内の MATLAB コードと同じロジックが実装されることを思い出してください。よって、ここでは MCDC 結果も同じであると予測します。
まず、上流の Or_Block を見てみましょう。

このブロックの MCDC の概要には、"see And_Block" というテキストのリンクがあります。これは、カスケードのルートの Logical Operator を参照しています。このリンクをクリックすると、このブロックの結果を示すレポートの節に移動します。

カスケードのルートにある Logical Operator ブロック (この場合は And_Block) は、カスケード全体の MCDC 結果をレポートします。
カスケードの MCDC 解析の詳細には、まずカスケードに含まれているブロックの数を説明するリンクが表示されます。リンク "Includes 2 blocks" をクリックすると、モデルが表示され、カスケードに含まれている 2 つのブロック (Or_Block および And_Block) が強調表示されます。
レポートのこの節には、カスケードによって表現される論理式 (この場合は C1 && (C2 | | C3)) が表示されます。C1、C2 および C3 は、カスケードに対する 3 つの入力に対応する条件です。各条件に関して、表に、関連するブロックとその入力 (かっこ内) および MCDC 結果が示されています。これらの結果は、入力の組み合わせ TTx、Fxx および TFT はすべて実行されたものの、TFF は実行されていないことを示します。これは、信号エディターによって生成された入力 (TTT、FFF および TFT) に対する予測と一致します。
さらに、予測どおり、このカスケードに関して示されている論理式と MCDC 結果はいずれも、MATLAB Function ブロックで等価のロジックを実装する if ステートメントに関して表示されたものと一致します。
カバレッジ インフォーマーとモデルの色分け
次のコマンドを使用して、モデルのカバレッジ結果を表示します。
cvmodelview(covdata);

カバレッジ レポートで示されていたように、MCDC オブジェクティブはカスケードの個々の Logical Operator ブロックに関しては記録されていません。MCDC オブジェクティブは、カスケード内のブロックに組み合わせによって表現される論理式に関して記録されており、結果はカスケードの最後のブロックでレポートされています。モデルの強調表示も、これを反映しています。3 つの入力 a、b および c に対して入力の組み合わせを FFF、TFT および TTT とすると、Or_Block はフル カバレッジの対象となります。ブロックの条件カバレッジ オブジェクティブがすべて達成されているからです。ただし、このカスケードに関連付けられていて達成されていない MCDC オブジェクティブがあるため、And_block (カスケードの最後のブロック) は赤で強調表示されています。
詳細については、And_block の上にマウスを置いてください。

ツールヒントでは、カスケードの一部の MCDC オブジェクティブが達成されていないため、このブロックがフル カバレッジの対象とならないことが正しくレポートされています。
コマンド ライン
論理ブロック カスケードの MCDC 結果は、MATLAB コマンド ラインから mcdcinfo を使用して取得することもできます。この場合も、カスケードの MCDC オブジェクティブは、カスケードの最後のブロックにあります。
[coverage_casc, description_casc] = mcdcinfo(covdata, ... 'slvnvdemo_cv_logic_cascade/Logic Cascade/And_Block') description_casc.condition(1) description_casc.condition(2) description_casc.condition(3)
coverage_casc =
1 3
description_casc =
struct with fields:
text: 'C1 && (C2 || C3)'
condition: [1×3 struct]
isFiltered: 0
filterRationale: ''
justifiedCoverage: 0
ans =
struct with fields:
text: 'C1 (And_Block In1)'
achieved: 1
trueRslt: 'TFT'
falseRslt: 'Fxx'
isFiltered: 0
isJustified: 0
filterRationale: ''
trueExecutedIn: []
falseExecutedIn: []
ans =
struct with fields:
text: 'C2 (Or_Block In1)'
achieved: 0
trueRslt: 'TTx'
falseRslt: '(TFF)'
isFiltered: 0
isJustified: 0
filterRationale: ''
trueExecutedIn: []
falseExecutedIn: []
ans =
struct with fields:
text: 'C3 (Or_Block In2)'
achieved: 0
trueRslt: 'TFT'
falseRslt: '(TFF)'
isFiltered: 0
isJustified: 0
filterRationale: ''
trueExecutedIn: []
falseExecutedIn: []
カスケードのメンバーである他のブロックは、MCDC オブジェクティブを示しません。
[coverage_or, description_or] = mcdcinfo(covdata, ... 'slvnvdemo_cv_logic_cascade/Logic Cascade/Or_Block')
coverage_or =
[]
description_or =
[]
MCDC の論理式のショートサーキット
モデル例 slvnvdemo_cv_logic_cascade では、カバレッジ設定は、Logical Operator ブロックをショートサーキットとして扱うように設定されます。
この設定により、Logical Operator ブロックのカスケードを解析するとき、対応する論理式の演算子は、MCDC 目的のショートサーキットとして扱われます。上記の結果で示されているように、これは、Logical Operator ブロック内および複数のブロックにまたがって発生するショートサーキットをいずれも MCDC が認識することを意味します。そのため、Logical Operator ブロックのカスケードの MCDC 結果は、MATLAB Function ブロック内の if ステートメントの結果と一致します。後者は常にショートサーキットとして扱われるからです。
ブロック内でのショートサーキット
上記の例では、C2 の [真の出力] MCDC オブジェクティブの結果は TTx です。これは、C1 と C2 がいずれも true の場合、Or_Block 内のショートサーキットにより、C3 は重要ではなくなることを示しています。
複数のブロックにまたがったショートサーキット
さらに、C1、Fxx の [偽の出力] MCDC オブジェクティブの結果について考えます。この結果は、ブロックをまたがったショートサーキットを MCDC 解析がどのように認識するかを説明します。And_Block への最初の入力が false であるため、2 番目の入力はショートサーキットされます。続いて、MCDC の目的で、これは Or_Block (およびその両方の入力) 全体をショートサーキットします。論理ブロック カスケード用の MCDC のショートサーキット動作は、対応する論理式の演算の優先順位に基づいて (シミュレーション時の Logical Operator ブロックの実行順序に関係なく) 発生します。
ショートサーキットなしの論理式
MCDC のマスク定義を使用している場合は、Logical Operator ブロックのカスケードによって表現される論理式を、MCDC 解析時にショートサーキットなしとして扱うこともできます。これを行うには、パラメーター CovLogicBlockShortCircuit を "off" に設定し、CovMcdcMode が "Masking" に設定されていることを確認します。これらは実際、新しいモデルを作成するときの、これらのパラメーターの既定の設定です。
CovLogicBlockShortCircuit が "off" で、CovMcdcMode が "UniqueCause" に設定されている場合は、カスケード内の Logical Operator ブロックは MCDC 目的で個々に解析され、カスケードで表現されている論理式の MCDC 全体は計算されません。
この例のカスケードがショートサーキットとして扱われない場合は、一部の MCDC オブジェクティブが与えられた入力によって達成されなくなることに注意してください。
set_param('slvnvdemo_cv_logic_cascade', 'CovLogicBlockShortCircuit', 'off'); set_param('slvnvdemo_cv_logic_cascade', 'CovMcdcMode', 'Masking');
論理ブロックのショートサーキットをオフにしてカバレッジのシミュレーションを実行してから、カバレッジ レポートを生成します。
covdata_non_sc = cvsim('slvnvdemo_cv_logic_cascade'); cvhtml('exampleReport_non_sc.html',covdata_non_sc);
ans = logical 0
