分析级联逻辑模块的 MCDC
此示例说明了 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)) 为真,则输出信号 Data1;否则,输出信号 Data2。
使用以下命令打开子系统“逻辑级联”,并注意该子系统使用 Logical Operator 模块和 Switch 实现完全相同的逻辑。
open_system('slvnvdemo_cv_logic_cascade/Logic Cascade');

最后,打开信号编辑器,注意布尔输入有三种组合:a、b 和 c。这些组合是 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
MATLAB Function 模块的 MCDC 结果
在生成的报告中,导航到 MATLAB Function 模块的详细信息。


在给定指定输入的情况下,MATLAB Function 模块中 if 语句的 MCDC 结果与预期一致。
MCDC 的逻辑级联结果
接下来检查逻辑级联的结果。回想一下,这个模块组合实现与 MATLAB Function 模块中的 MATLAB 代码相同的逻辑;因此,我们预计 MCDC 的结果也会相同。
我们首先看一下上游的 Or_Block。

请注意,此模块的 MCDC 摘要有一个带有文本 "see And_Block" 的链接,指的是级联根处的逻辑运算符。点击此链接可以转到显示此模块结果的报告部分。

级联根部的 Logical Operator 模块(在本例中为 And_Block)报告整个级联的 MCDC 结果。
级联的 MCDC 分析细节首先显示一个链接,说明级联中包含多少个模块。点击链接 "Includes 2 blocks" 将调出模型并突出显示级联中包含的两个模块(Or_Block 和 And_Block)。
报告的此部分随后显示了级联所表示的布尔表达式,在本例中为 C1 && (C2 | | C3),其中 C1、C2 和 C3 是与级联的三个输入相对应的条件。对于每一种情况,表格都说明了相关的模块及其输入(显示在括号中)以及 MCDC 结果。这些结果表明输入组合 TTx、Fxx 和 TFT 都已被执行,但 TFF 尚未被执行。这与信号编辑器(TTT、FFF 和 TFT)生成的输入的预期相符。
此外,正如预期的那样,此级联显示的布尔表达式和 MCDC 结果与在 MATLAB Function 模块中实现等效逻辑的 if 语句显示的结果相匹配。
覆盖率信息器和模型着色
使用以下命令显示模型上的覆盖率结果:
cvmodelview(covdata);

如覆盖率报告所示,MCDC 目标不是针对级联中的各个 Logical Operator 模块进行记录的,而是针对级联中模块组合所表示的布尔表达式进行记录的,并在级联的最后一个模块上报告结果。模型的突出显示也反映了这一点。给定三个输入 a、b 和 c 的输入组合 FFF、TFT 和 TTT,Or_Block 将获得全覆盖,因为该模块的所有条件覆盖率目标都已满足。但是,由于与此级联相关的 MCDC 目标尚未满足,因此 And_block(级联中的最后一个模块)以红色突出显示。
将鼠标悬停在 And_block 上以了解更多信息。

工具提示正确报告该模块未获得全覆盖,因为级联的一些 MCDC 目标未得到满足。
命令行
您还可以使用 mcdcinfo 从 MATLAB 命令行检索逻辑模块级联的 MCDC 结果。再次,级联的 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 的短路。如上结果所示,这意味着 MCDC 可以识别 Logical Operator 模块内和模块间发生的短路。因此,Logical Operator 模块级联的 MCDC 结果与 MATLAB Function 模块中的 if 语句的结果相匹配,因为后者始终被视为短路。
模块内短路
请注意,在上面的示例中,C2 的 True Out MCDC 目标结果是 TTx,这表明当 C1 和 C2 都为 true 时,由于 C3 内部短路,Or_Block 无关紧要。
跨多个模块短路
此外,考虑 C1、Fxx 的 False Out MCDC 目标结果。这个结果说明了 MCDC 分析如何识别跨模块短路。因为 And_Block 的第一个输入为 false,所以第二个输入是短路的。随后,为了 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);
