主要内容

级联逻辑块的MCDC分析

这个例子说明了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.这些组合FFFTFT,TTT.

open_system (“slvnvdemo_cv_logic_cascade /信号生成器”);

关闭Signal Builder。

close_system (“slvnvdemo_cv_logic_cascade /信号生成器”, 0);

比较覆盖报告中的MCDC结果

模拟模型并生成覆盖率报告。

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分析的细节首先显示一个链接,说明级联中包含多少块。点击链接“包括2个街区”将打开模型并突出显示级联中包含的两个块(or_block.And_block.).

在本例中,报告的这一部分显示了由级联表示的布尔表达式C1 && (c2 | | c3),在那里C1C2,C3是与级联的三个输入相对应的条件。对于每个条件,该表说明了相关的块及其输入(括号中显示)以及MCDC结果。这些结果表明,输入组合TTX.FXX.,TFT都被锻炼过,但是TFF还没有。这与给定由Signal Builder (TTT.FFF,TFT).

此外,如预期的那样,该级联显示的布尔表达式和MCDC结果都与如果语句实现MATLAB函数块中的等价逻辑。

覆盖信息和模型着色

使用以下命令在模型上显示覆盖结果:

cvmodelview(covdata);

如覆盖率报告所示,MCDC目标没有为级联中的单个逻辑运算符块记录;相反,MCDC目标被记录为由级联中的块的组合所表示的布尔表达式,并在级联中的最终块上报告结果。模型的突出显示也反映了这一点。给定输入组合FFFTFT,TTT.对于这三个输入一个b,cor_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 / logic cascade / or_block'
Coverage_or = []

MCDC布尔表达式的短路

在模型示例slvnvdemo_cv_logic_cascade,覆盖设置,使逻辑运算符块被视为短路。

由于此设置,在分析逻辑运算符块的级联时,相应的布尔表达式中的操作员被视为MCDC目的的短路。如上面所示结果所示,这意味着MCDC识别出在逻辑操作员块内部和跨越逻辑操作员块内发生的短路。因此,逻辑操作员块级联的MCDC结果与那些相匹配如果语句,因为后者总是被视为短路。

块内短路

注意,在上面的例子中,True Out MCDC的目标结果为C2TTX.,表示当C1C2都是真的,C3是无关紧要的,因为短路内or_block.

多个区块的短路

此外,考虑False Out MCDC的客观结果C1FXX..这个结果说明了MCDC分析如何识别跨区块的短路。因为第一个输入And_block.为false时,第二个输入短路。随后,为了MCDC的目的,这个短路or_block.(和它的两个输入)完全。逻辑块级联的MCDC的短路行为是基于相应布尔表达式中操作的优先级而发生的(与仿真期间逻辑运算符块的执行顺序无关)。

Non-short-circuiting布尔表达式

在MCDC分析期间,如果使用MCDC的屏蔽定义,还可以将由逻辑运算符块级联表示的布尔表达式视为非短路。为此,设置参数CovLogicBlockShortCircuit“关闭”并确保CovMcdcMode被设置为“屏蔽”.实际上,这些是创建新模型时这些参数的默认设置。

注意,如果CovLogicBlockShortCircuit“关闭”CovMcdcMode被设置为“unInceause”那么级联中的逻辑运算符块将被单独分析以实现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);%生成覆盖率报告