Main Content

本页采用了机器翻译。点击此处可查看英文原文。

对覆盖率数据执行操作

此示例显示如何使用重载运算符 +*- 将覆盖率结果组合成并集、交集或差集。

打开模型

打开 slvnvdemo_cv_mutual_exclusion 模型。该模型包含一个连接到两个子系统的使能端口的 Constant 模块。其中一个子系统在启用端口之前放置了一个 NOT 模块,这意味着一次只能启用其中一个子系统。

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");

使用 simIn 作为 sim 的输入来仿真模型。SimulationOutput 对象包含覆盖率数据作为属性,其名称等于 CovSaveName 配置参数的值。默认值为 covdata

simOut1 = sim(simIn);
data1 = simOut1.covdata
data1 = ... cvdata
            version: (R2024a)
                 id: 310
               type: TEST_DATA
               test: cvtest object
             rootID: 312
           checksum: [1x1 struct]
          modelinfo: [1x1 struct]
          startTime: 20-Apr-2024 10:48:42
           stopTime: 20-Apr-2024 10:48:42
  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: (R2024a)
                 id: 363
               type: TEST_DATA
               test: cvtest object
             rootID: 312
           checksum: [1x1 struct]
          modelinfo: [1x1 struct]
          startTime: 20-Apr-2024 10:48:43
           stopTime: 20-Apr-2024 10:48:43
  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%。要检查两个仿真是否涵盖相同的 50% 决策结果,请查看两个对象的并集和交集。

找到覆盖率的联盟

使用 + 运算符派生第三个 cvdata 对象,该对象表示 data1data2 cvdata 对象的并集。两个或多个 cvdata 对象的联合也称为累计覆盖率聚合覆盖率

当您通过组合其他仿真结果创建 cvdata 对象时,新对象的 type 属性为 DERIVED_DATA

dataUnion = data1 + data2
dataUnion = ... cvdata
            version: (R2024a)
                 id: 0
               type: DERIVED_DATA
               test: []
             rootID: 312
           checksum: [1x1 struct]
          modelinfo: [1x1 struct]
          startTime: 20-Apr-2024 10:48:42
           stopTime: 20-Apr-2024 10:48:43
  intervalStartTime: 
   intervalStopTime: 
             filter: 
            simMode: Normal

通过对 dataUnion 调用 decisioninfo 函数来提取决策覆盖率结果并确定满足的决策结果的百分比。

covU = decisioninfo(dataUnion,modelName);
percentU = 100*(covU(1)/covU(2))
percentU =

   100

两次仿真的结合表明,100% 的决策结果都得到满足。这个结果表明两次仿真之间的覆盖率没有重叠,并且所有决策结果都得到满足。

查找覆盖率的交叉点

通过将 data1data2* 运算符相交,确认两次仿真之间的覆盖率不重叠。交集仅返回两个 cvdata 对象均满足的覆盖率结果。

dataIntersection = data1 * data2

covI = decisioninfo(dataIntersection,modelName);
percentI = 100*(covI(1)/covI(2))
dataIntersection = ... cvdata
            version: (R2024a)
                 id: 0
               type: DERIVED_DATA
               test: []
             rootID: 312
           checksum: [1x1 struct]
          modelinfo: [1x1 struct]
          startTime: 20-Apr-2024 10:48:42
           stopTime: 20-Apr-2024 10:48:43
  intervalStartTime: 
   intervalStopTime: 
             filter: 
            simMode: Normal


percentI =

     0

交叉点的决策覆盖率为 0%,因为两个仿真之间的覆盖率没有重叠。

计算覆盖率差异

使用 - 运算符创建一个 cvdata 对象,表示左操作数和右操作数之间的集合差异。运算结果包含左操作数满足但右操作数不满足的覆盖率结果。使用此操作来确定有多少额外覆盖率归因于特定仿真。

在此示例中,第一次和第二次仿真覆盖率的并集与第一次仿真覆盖率之间的差值表示第二次仿真提供了多少额外覆盖率。由于没有任何决策覆盖率结果重叠,第二次仿真的新决策覆盖率为 50%。

newCov2 = dataUnion - data1

covN = decisioninfo(newCov2,'slvnvdemo_cv_mutual_exclusion');
percentN = 100*(covN(1)/covN(2))
newCov2 = ... cvdata
            version: (R2024a)
                 id: 0
               type: DERIVED_DATA
               test: []
             rootID: 312
           checksum: [1x1 struct]
          modelinfo: [1x1 struct]
          startTime: 20-Apr-2024 10:48:42
           stopTime: 20-Apr-2024 10:48:43
  intervalStartTime: 
   intervalStopTime: 
             filter: 
            simMode: Normal


percentN =

    50

使用派生的覆盖率数据对象

您可以在所有报告和分析函数中使用派生的 cvdata 对象,并将其作为后续操作的输入。例如,从派生的 dataIntersection 对象生成覆盖率报告并创建一个新的 cvdata 联合。

cvhtml('intersect_cov', dataIntersection);

newUnion = dataUnion + dataIntersection
newUnion = ... cvdata
            version: (R2024a)
                 id: 0
               type: DERIVED_DATA
               test: []
             rootID: 312
           checksum: [1x1 struct]
          modelinfo: [1x1 struct]
          startTime: 20-Apr-2024 10:48:42
           stopTime: 20-Apr-2024 10:48:43
  intervalStartTime: 
   intervalStopTime: 
             filter: 
            simMode: Normal

另请参阅

| |

相关主题