カバレッジ データの演算の実行
この例では、オーバーロードされた演算子 +、*、および - を使用し、カバレッジ結果を組み合わせて、結果の和集合、共通集合、差集合を求める方法を示します。
モデルを開く
slvnvdemo_cv_mutual_exclusion モデルを開きます。モデルには、2 つのサブシステムのイネーブル端子に接続された Constant ブロックが含まれています。サブシステムの 1 つはイネーブル端子の前に NOT ブロックが配置されています。これは、一度に有効にできるサブシステムは 1 つのみであることを意味します。
modelName = "slvnvdemo_cv_mutual_exclusion";
open_system(modelName)

Simulink.SimulationInput オブジェクトを作成し、setModelParameter を使用してカバレッジ パラメーターを設定します。
simIn = Simulink.SimulationInput(modelName);
CovEnable パラメーターを on に設定して、モデルに対してカバレッジ解析を有効にします。
simIn = setModelParameter(simIn,"CovEnable","on");
構造カバレッジ レベルを Decision に設定します。
simIn = setModelParameter(simIn,"CovMetricStructuralLevel","Decision");
CovSaveOutputData を off に設定することで、ファイルの場所ではなく MATLAB® でカバレッジ データを表示します。これにより、シミュレーション後に Simulink® Coverage® がカバレッジ データをファイルに自動保存することもなくなります。
simIn = setModelParameter(simIn,"CovSaveOutputData","off");
sim への入力として simIn を使用してモデルをシミュレートします。SimulationOutput オブジェクトには、CovSaveName コンフィギュレーション パラメーターの値と等しい名前をもつプロパティとしてカバレッジ データが含まれます。既定値は covdata です。
simOut1 = sim(simIn); data1 = simOut1.covdata
data1 = ... cvdata
version: (R2025b)
id: 310
type: TEST_DATA
test: cvtest object
rootID: 312
checksum: [1x1 struct]
modelinfo: [1x1 struct]
startTime: 12-Aug-2025 18:01:13
stopTime: 12-Aug-2025 18:01:14
intervalStartTime:
intervalStopTime:
simulationStartTime: 0
simulationStopTime: 10
filter:
simMode: Normal
setBlockParameter メソッドを使用して Constant ブロックの値を 0 から 1 に変更して有効なサブシステムを変更し、モデルを再度シミュレートします。
simIn = setBlockParameter(simIn,modelName+"/Constant","value","1"); simOut2 = sim(simIn); data2 = simOut2.covdata
data2 = ... cvdata
version: (R2025b)
id: 363
type: TEST_DATA
test: cvtest object
rootID: 312
checksum: [1x1 struct]
modelinfo: [1x1 struct]
startTime: 12-Aug-2025 18:01:14
stopTime: 12-Aug-2025 18:01:15
intervalStartTime:
intervalStopTime:
simulationStartTime: 0
simulationStopTime: 10
filter:
simMode: Normal
関数 decisioninfo を使用して、各シミュレーションから判定カバレッジを抽出し、達成された判定結果の割合 (%) を判別します。
cov1 = decisioninfo(data1,modelName); percent1 = 100*(cov1(1)/cov1(2)) cov2 = decisioninfo(data2,modelName); percent2 = 100*(cov2(1)/cov2(2))
percent1 =
50
percent2 =
50
両方のシミュレーションともカバレッジは 50% です。2 つのシミュレーションが同じ 50% の判定結果をカバーしているかどうかをチェックするには、2 つのオブジェクトの和集合および共通集合を確認します。
カバレッジの和集合の検出
+ 演算子を使用して、data1 と data2 の cvdata オブジェクトの和集合を表す 3 番目の cvdata オブジェクトを派生させます。2 つ以上の cvdata オブジェクトの和集合は、"累積カバレッジ" や "集計されたカバレッジ" とも呼ばれます。
その他のシミュレーション結果を組み合わせて cvdata オブジェクトを作成すると、新しいオブジェクトの type プロパティは DERIVED_DATA になります。
dataUnion = data1 + data2
dataUnion = ... cvdata
version: (R2025b)
id: 0
type: DERIVED_DATA
test: []
rootID: 312
checksum: [1x1 struct]
modelinfo: [1x1 struct]
startTime: 12-Aug-2025 18:01:13
stopTime: 12-Aug-2025 18:01:15
intervalStartTime:
intervalStopTime:
filter:
simMode: Normal
判定カバレッジの結果を抽出し、dataUnion で関数 decisioninfo を呼び出して、達成された判定結果の割合 (%) を判別します。
covU = decisioninfo(dataUnion,modelName); percentU = 100*(covU(1)/covU(2))
percentU = 100
2 つのシミュレーション レポートの和集合で、100% の判定結果が達成されていることがレポートされます。この結果は、2 つのシミュレーションのカバレッジにはオーバーラップがなく、すべての判定結果が達成されていることを示しています。
カバレッジの共通集合の検出
* 演算子を使用して data1 と data2 の共通集合を求めることにより、2 つのシミュレーションの間でカバレッジがオーバーラップしていないことを確認します。共通集合では、両方の cvdata オブジェクトで達成されているカバレッジ結果のみが返されます。
dataIntersection = data1 * data2 covI = decisioninfo(dataIntersection,modelName); percentI = 100*(covI(1)/covI(2))
dataIntersection = ... cvdata
version: (R2025b)
id: 0
type: DERIVED_DATA
test: []
rootID: 312
checksum: [1x1 struct]
modelinfo: [1x1 struct]
startTime: 12-Aug-2025 18:01:13
stopTime: 12-Aug-2025 18:01:15
intervalStartTime:
intervalStopTime:
filter:
simMode: Normal
percentI =
0
2 つのシミュレーションのカバレッジにはオーバーラップがないため、共通集合の判定カバレッジは 0% です。
カバレッジの差の計算
- 演算子を使用して、左右のオペランドの差集合を表す cvdata オブジェクトを作成します。演算の結果には、左のオペランドでは達成され、右のオペランドでは達成されていないカバレッジ結果が含まれます。この演算は、特定のシミュレーションに起因する追加カバレッジの程度を判別する場合に使用します。
この例では、1 番目と 2 番目のシミュレーション カバレッジの和集合と、1 番目のシミュレーション カバレッジの差が、2 番目のシミュレーションで提供された追加カバレッジの程度を示します。判定カバレッジ結果にはオーバーラップがないため、2 番目のシミュレーションによる新しい判定カバレッジは 50% です。
newCov2 = dataUnion - data1
covN = decisioninfo(newCov2,'slvnvdemo_cv_mutual_exclusion');
percentN = 100*(covN(1)/covN(2))
newCov2 = ... cvdata
version: (R2025b)
id: 0
type: DERIVED_DATA
test: []
rootID: 312
checksum: [1x1 struct]
modelinfo: [1x1 struct]
startTime: 12-Aug-2025 18:01:13
stopTime: 12-Aug-2025 18:01:15
intervalStartTime:
intervalStopTime:
filter:
simMode: Normal
percentN =
50
派生したカバレッジ データ オブジェクトの使用
派生した cvdata オブジェクトは、レポートや解析のすべての関数で、また、それ以降の演算への入力として使用できます。たとえば、派生した dataIntersection オブジェクトからカバレッジ レポートを生成し、新しい cvdata 和集合を作成します。
cvhtml('intersect_cov', dataIntersection);
newUnion = dataUnion + dataIntersection
newUnion = ... cvdata
version: (R2025b)
id: 0
type: DERIVED_DATA
test: []
rootID: 312
checksum: [1x1 struct]
modelinfo: [1x1 struct]
startTime: 12-Aug-2025 18:01:13
stopTime: 12-Aug-2025 18:01:15
intervalStartTime:
intervalStopTime:
filter:
simMode: Normal

参考
cvdata | Simulink.SimulationInput | sim