主要内容

级联逻辑块的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,到达目标时间

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

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

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

覆盖信息和模型着色

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

cvmodelview (covdata);

如覆盖率报告所示,MCDC目标没有为级联中的单个逻辑运算符块记录;相反,MCDC目标被记录为由级联中的块的组合所表示的布尔表达式,并在级联中的最终块上报告结果。模型的突出显示也反映了这一点。给定输入组合FFFTFT,到达目标时间对于这三个输入一个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 /逻辑/ 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被设置为“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);%生成覆盖率报告