这个例子说明了Simulink®Coverage™如何记录金宝app逻辑运算符块级联的MCDC度量。
在Si金宝appmulink中,有多种实现布尔逻辑的方法,例如使用如果
MATLAB函数块中的语句,状态流图中的条件转换,或级联中连接在一起的多个逻辑运算符块的组合。
模型的例子slvnvdemo_cv_logic_cascade
通过使用MATLAB函数块中的MATLAB代码以及逻辑运算块的级联来实现相同的布尔表达式。
使用以下命令打开模型slvnvdemo_cv_logic_cascade
:
open_system (“slvnvdemo_cv_logic_cascade”);
打开MATLAB函数块查看相关函数。
open_system (“slvnvdemo_cv_logic_cascade / MATLAB函数”)
在MATLAB函数块中,如果(a && (b | | c))是真的,那么信号呢Data1将输出;否则,信号Data2是输出。
使用下面的命令打开子系统'Logic Cascade',注意这个子系统使用逻辑操作符块和Switch实现完全相同的逻辑。
open_system (“slvnvdemo_cv_logic_cascade /逻辑级联”);
最后,打开Signal Builder,注意为布尔输入提供了三种组合一个,b,c.这些组合FFF,TFT,到达目标时间.
open_system (“slvnvdemo_cv_logic_cascade /信号生成器”);
关闭Signal Builder。
close_system (“slvnvdemo_cv_logic_cascade /信号生成器”, 0);
模拟模型并生成覆盖率报告。
testObj = cvt (“slvnvdemo_cv_logic_cascade”);testObj.settings.decision = 1;testObj.settings.condition = 1;testObj.settings.mcdc = 1;covdata = cvsim (testObj);%模拟覆盖率cvhtml (“exampleReport.html”, covdata);%生成覆盖率报告
MCDC结果为MATLAB函数块
在生成的报告中,导航到MATLAB函数块的详细信息。
MCDC的结果如果
语句在MATLAB函数块中,给定指定的输入。
逻辑级联的MCDC结果
接下来检查逻辑级联的结果。回想一下,这些块的组合实现了与MATLAB函数块中的MATLAB代码相同的逻辑;因此,我们期望MCDC的结果也会是相同的。
让我们先看看上游Or_Block
.
注意,这个块的MCDC摘要有一个带有文本的链接“看到And_Block”
,指的是级联的根级逻辑运算符。单击此链接将转到显示此块结果的报告部分。
位于级联根的逻辑运算符块(在本例中And_Block
)报告整个级联的MCDC结果。
级联的MCDC分析的细节首先显示一个链接,说明级联中包含多少块。点击链接”包括两个街区”
将打开模型并突出显示级联中包含的两个块(Or_Block
和And_Block
).
在本例中,报告的这一部分显示了由级联表示的布尔表达式C1 && (c2 | | c3),在那里C1
,C2
,C3
是与级联的三个输入相对应的条件。对于每个条件,该表说明了相关的块及其输入(括号中显示)以及MCDC结果。这些结果表明,输入组合TTx
,Fxx
,TFT
都被锻炼过,但是TFF
还没有。这与给定由Signal Builder (到达目标时间
,FFF
,TFT
).
此外,如预期的那样,该级联显示的布尔表达式和MCDC结果都与如果
语句实现MATLAB函数块中的等价逻辑。
使用以下命令在模型上显示覆盖结果:
cvmodelview (covdata);
如覆盖率报告所示,MCDC目标没有为级联中的单个逻辑运算符块记录;相反,MCDC目标被记录为由级联中的块的组合所表示的布尔表达式,并在级联中的最终块上报告结果。模型的突出显示也反映了这一点。给定输入组合FFF
,TFT
,到达目标时间
对于这三个输入一个,b,c,Or_Block
接收到完整的覆盖,因为所有的区块的条件覆盖目标已经被满足。然而,由于与此级联相关的MCDC目标还没有得到满足,And_block
(级联的最后一个块)用红色突出显示。
上空盘旋And_block
为更多的信息。
工具提示正确地报告该块没有得到完全覆盖,因为级联的一些MCDC目标没有得到满足。
您还可以使用以下命令从MATLAB命令行检索逻辑块级联的MCDC结果mcdcinfo
.同样,级联的MCDC目标将在级联的最后一块上找到。
[coverage_casc, description_casc] = McDcinfo (covdata,“级联slvnvdemo_cv_logic_cascade /逻辑/ And_Block”) description_casc.condition(1) description_casc.condition(2) description_casc.condition(3)
coverage_casc = 1 3 description_casc =结构体字段:文字:“C1 & & (C2 | | C3)的条件:[1 x3 struct] isFiltered: 0 filterRationale:“justifiedCoverage: 0 ans =结构体字段:文字:“C1 (And_Block In1)”实现:1 trueRslt:“TFT”falseRslt:的Fxx isFiltered: 0 isJustified: 0 filterRationale:“trueExecutedIn: [] falseExecutedIn:[] ans =结构体字段:文字:“C2 (Or_Block In1)”实现:0 trueRslt:“TTx”falseRslt:“(TFF)”isFiltered: 0 isJustified: 0 filterRationale:“trueExecutedIn: [] falseExecutedIn: [] ans =结构体字段:文字:“C3 (Or_Block In2)”实现:0 trueRslt:“TFT”falseRslt:“(TFF)”isFiltered: 0 isJustified: 0 filterRationale:" trueExecutedIn: [] falseExecutedIn: []
级联的其他模块不会显示MCDC目标。
[coverage_or, description_or] = McDcinfo (covdata,“级联slvnvdemo_cv_logic_cascade /逻辑/ Or_Block”)
Coverage_or = []
在模型示例slvnvdemo_cv_logic_cascade
,覆盖设置,使逻辑运算符块被视为短路。
由于这个设置,在分析逻辑运算符块的级联时,相应布尔表达式中的运算符被视为MCDC中的短路。如上所示的结果所示,这意味着MCDC可以识别发生在逻辑运算符块内部和跨逻辑运算符块的短路。因此,逻辑运算符块级联的MCDC结果与如果
语句,因为后者总是被视为短路。
块内短路
注意,在上面的例子中,True Out MCDC的目标结果为C2
是TTx
,表示当C1
和C2
都是真的,C3
是无关紧要的,因为短路内Or_Block
.
多个区块的短路
此外,考虑False Out MCDC的客观结果C1
,Fxx
.这个结果说明了MCDC分析如何识别跨区块的短路。因为第一个输入And_Block
为false时,第二个输入短路。随后,为了MCDC的目的,这个短路Or_Block
(和它的两个输入)完全。逻辑块级联的MCDC的短路行为是基于相应布尔表达式中操作的优先级而发生的(与仿真期间逻辑运算符块的执行顺序无关)。
Non-short-circuiting布尔表达式
在MCDC分析期间,如果使用MCDC的屏蔽定义,还可以将由逻辑运算符块级联表示的布尔表达式视为非短路。为此,设置参数CovLogicBlockShortCircuit来“关闭”
并确保CovMcdcMode被设置为“屏蔽”
.实际上,这些是创建新模型时这些参数的默认设置。
注意,如果CovLogicBlockShortCircuit是“关闭”
和CovMcdcMode被设置为“UniqueCause”
那么级联中的逻辑运算符块将被单独分析以实现MCDC,而级联所代表的布尔表达式的MCDC将不会被计算。
注意,当本例中的级联不被视为短路时,给定的输入不再满足某些MCDC目标。
set_param (“slvnvdemo_cv_logic_cascade”,“CovLogicBlockShortCircuit”,“关闭”);set_param (“slvnvdemo_cv_logic_cascade”,“CovMcdcMode”,“屏蔽”);covdata_non_sc = cvsim (“slvnvdemo_cv_logic_cascade”);%模拟覆盖与逻辑块短路关闭cvhtml (“exampleReport_non_sc.html”, covdata_non_sc);%生成覆盖率报告