Main Content

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

MATLAB 函数的模型覆盖率

当您仿真启用覆盖率的模型时,Simulink® Coverage™ 会分析您的模型并报告模型覆盖率数据。如果您的模型包含 MATLAB® 代码,例如在 MATLAB Function 模块内或对外部 MATLAB 函数的调用,则 Simulink Coverage 会根据您选择的度量分析该代码。

收集 MATLAB 函数的模型覆盖率

要分析您的 MATLAB Function 模块或外部 MATLAB 函数的覆盖率,您必须首先确保模块或函数内的 MATLAB 代码与代码生成兼容。有关配置 MATLAB 代码以进行代码生成的更多信息,请参阅准备 MATLAB 代码以用于代码生成的工作流 (MATLAB Coder)

例如,考虑以下 if 语句:

if (x > 0 || y > 0)
	reset = 1;

if 语句包含具有两个条件(x > 0y > 0)的决策。Simulink Coverage 分析模型仿真中的每个决策和条件,并报告每个结果发生的次数。例如,如果 x 的输入信号在每个仿真时间步中都为 true,则会报告该条件的 50% 条件覆盖率,因为没有发生 false case。

收集 MATLAB 函数的覆盖率时,请考虑:

  • 如果您的模型包含 MATLAB Function 模块,并且该函数包含您选择的覆盖率度量适用的代码,那么 MATLAB Function 模块将接收覆盖率分析。

  • 要收集外部 MATLAB 文件中函数的覆盖率,请在配置参数对话框的覆盖率窗格中的包括在分析中下选择 MATLAB 文件

  • 要收集 Simulink Design Verifier™ 函数的覆盖率:

    在配置参数对话框的覆盖率窗格中,在其他度量下,选择目标和约束

MATLAB 函数的模型覆盖类型

Simulink Coverage 针对 MATLAB 函数分析的模型覆盖率类型包括:

决策覆盖率

在仿真中,Simulink Coverage 分析这些 MATLAB 语句并将其报告为决策覆盖率:

  • 函数头 - 如果函数或本地函数至少执行一次,则决策覆盖率为 100%。

  • if - 如果 if 表达式至少计算为 true 一次并且至少计算为 false 一次,则决策覆盖率为 100%。

  • switch - 如果每个 switch case 都至少被执行一次(包括失败 case),则决策覆盖率为 100%。

  • for - 如果等效循环条件至少计算为 true 一次且至少计算为 false 一次,则决策覆盖率为 100%。

  • while - 如果循环条件至少计算为 true 一次并且至少计算为 false 一次,则决策覆盖率为 100%。

状况和 MCDC 覆盖率

当收集条件和 MCDC 覆盖率时,Simulink Coverage 会分析 if 语句条件和赋值语句中的逻辑表达式。

逻辑表达式是包含逻辑运算符的表达式,例如逻辑 AND (&&) 或逻辑 OR (||)。模型覆盖率不分析简单的逻辑赋值,例如:

b = true;
或者单条件赋值语句,比如:
b = a < 1;

Simulink Design Verifier 覆盖率

这些 MATLAB 函数在代码生成和 Simulink Design Verifier 中处于活动:

当您在配置参数对话框的覆盖率窗格中选择目标和约束覆盖率度量时,Simulink Coverage 会分析这些函数。

每个函数都会计算一个表达式,例如 sldv.test(expr),其中 expr 是一个有效的布尔 MATLAB 表达式。Simulink Design Verifier 覆盖率测量表达式 expr 计算结果为 true 的时间步数。

如果 expr 至少在一个时间步内为 true,则该函数的 Simulink Design Verifier 覆盖率为 100%。否则,该函数的报告覆盖率为 0%。

覆盖率报告中 Simulink Design Verifier 函数的覆盖率数据示例,请参阅Simulink Design Verifier 覆盖率

整数溢出覆盖饱和

当您选择对整数溢出进行饱和处理参数时,Simulink Coverage 会分析 MATLAB 函数中包含整数数据类型的语句。

整数溢出饱和覆盖率记录语句因整数溢出而饱和的次数。当逻辑语句在整数溢出时至少饱和一次并且至少不饱和一次时,测试用例实现全覆盖。

关系边界覆盖率

您可以收集包含至少一个关系操作的 MATLAB 函数模块的关系边界覆盖率。

如果 MATLAB 函数模块多次调用包含关系运算的函数,则关系边界覆盖率会报告调用该函数的每个实例的累积结果。如果函数中的关系运算在不同的调用中使用了不同类型的操作数,则关系边界覆盖率将使用更严格的操作数类型的容差规则。例如,如果关系运算在一次调用中使用 int32 操作数,而在另一个调用中使用 double 操作数,关系边界覆盖率对 double 操作数使用容差规则。

有关容差规则和类型严格性顺序的信息,请参阅关系边界覆盖率

由于运行时优化,使用硬编码常量输入的死逻辑不会针对关系边界覆盖率进行分析。例如,考虑以下函数:

function out = myFun(x,y)
if nargin < 2
    y = 3;
end
此函数可以接受一个或两个输入参量,如果调用者未提供第二个参量,则设置默认值。如果您的模型在调用此函数时始终提供两个输入参量,则 if 语句的内容就是死逻辑,因为 if 语句在每个时间步都为 false。在这种情况下,Simulink Coverage 不会分析该语句的关系边界覆盖率。

另请参阅

相关主题