创建和使用覆盖率过滤器
本示例展示了如何使用覆盖率过滤器从覆盖率分析中排除模型元素,并为报告中缺失的覆盖率申述。
覆盖率过滤器
在验证过程中,模型中可能包含一些会阻碍实现全模型覆盖率的构造,例如包含未测试且与验证过程无关的控制器驱动的子系统。您可以将此子系统从覆盖率结果中排除。
或者,您可能有这样的测试标准:要求对某个模块的特定方面进行测试,例如触发特定的决策点。如果无法满足此模块的所有覆盖率结果,并且您原本也没打算对这些未满足的结果进行测试,那么您可以对缺失覆盖率进行申述。
通过排除这些构造或对这些构造进行申述来将它们从覆盖率结果中滤除,您可以专注于其他可以且应该测试的缺失覆盖率方面。
覆盖率过滤器存储在 CVF 文件中。每个过滤器包含排除或申述某些模型对象或单个覆盖率目标结果的规则。您可以将多个过滤器文件应用于一个模型的覆盖率结果。多个模型也可以使用同一个过滤器文件。
您可以在对模型进行仿真之前或之后创建和应用覆盖率过滤器。
打开模型
本示例使用 slvnvdemo_covfilt 模型,该模型包含多个结构,因此无法实现完全的模型覆盖率。从覆盖率结果中过滤掉这些结构,可以让您专注于正在运行的测试中缺失覆盖率的更相关方面。
open_system('slvnvdemo_covfilt');
在仿真前指定要从覆盖率结果中排除的项
库模块 slvnvdemo_covfilt_lib/protected division 可防止除以零错误。如果您确定您的测试不需要或不打算在此上下文中完全覆盖此模块的每个实例,则可以从覆盖率结果中排除此模块。
要从上下文菜单更改覆盖率设置,必须先打开覆盖率分析器 App。在应用选项卡上,点击覆盖率分析器。在模型中,右键点击 protected division 库模块,然后点击排除引用的库:slvnvdemo_covfilt_lib/protected 部分,以过滤对该库的所有引用。上下文菜单中的每个按钮都有一个工具提示,描述其功能。

打开覆盖率结果浏览器的过滤器编辑器窗格。覆盖率结果浏览器默认创建一个名为 Untitled 的新过滤器文件,并添加了一条过滤器规则,排除对库模块的所有引用。

使用名称和描述字段为新的过滤器文件指定名称和描述。在表中,双击新规则的理由字段,并输入描述为何排除此模块的文本,例如 division by zero protection。点击应用以保存该过滤器文件。此时会弹出一个文件对话框,提示您指定保存该文件的位置。

重用现有过滤器文件
如果您的模型包含类似的构造,则可以在多个模型中使用同一个过滤器文件。
例如,过滤器文件 Filter_Tick.cvf 会从覆盖率结果中排除 Stateflow® 时序事件 tick。此事件不能为假,并且会阻止在 Stateflow 中基于事件的时序逻辑中使用 tick 的任何模型实现完全条件和 MCDC 覆盖率。
由于 slvnvdemo_covfilt/Mode Logic 包含此构造,因此您可以将过滤器文件 Filter_Tick.cvf 应用于该模型。
要应用此现有过滤器文件,请在覆盖率结果浏览器中右键点击应用的过滤器节点,然后选择加载过滤器。在文件对话框中,选择 Filter_Tick.cvf 并点击打开。

请注意,应用的过滤器下现在列出了 Filter_DivBy0 和 Filter_Tick。

仿真并查看过滤后的覆盖率结果
点击运行(覆盖率) 按钮以对模型进行仿真并记录覆盖率。仿真完成后,Simulink® Coverage™ 会突出显示具有覆盖率结果的模型,覆盖率详细信息窗格会打开。

对 protected division 库模块的两处引用均为灰色,带有虚线边框,表示由于排除规则,Simulink Coverage 没有分析它们。
在覆盖率详细信息窗格中,从覆盖率分析中滤除的对象部分列出了每个被排除的元素以及每个元素对应的理由。Filter_DivBy0 和 Filter_Tick 都显示在这里。
创建新的过滤器文件
创建另一个过滤器文件,以捕获仅与此模型相关的过滤器规则。
在覆盖率结果浏览器中,右键点击应用的过滤器节点,然后选择新建过滤器。

为此过滤器文件输入名称和描述。在这个示例中,将名称设置为 slvnvdemo_covfilt_Filter,将描述设置为 Filter rules specific to slvnvdemo_covfilt model。点击应用,并指定保存此文件的位置。

在仿真后从覆盖率结果中排除项
您也可以在仿真后创建过滤器规则并将其应用于覆盖率结果。这样,您可以查看覆盖率结果,创建或调整过滤器,生成新的覆盖率报告,而无需重新运行仿真。
例如,以 Switchable config 子系统为例,它对一种常见的设计模式进行建模,该模式使用常量值来驱动子系统使能端口以更改模型配置。然而,使能逻辑和子系统内容可能会导致覆盖率缺失。由于此模型不使用此配置,因此您可以将其从覆盖率分析中排除。
当您从覆盖率详细信息窗格添加新的过滤器规则时,Simulink Coverage 会将这个新过滤器规则添加到您当前选定的任何过滤器文件中。要创建新的过滤器规则,请先点击应用的过滤器。

在 Simulink 编辑器中,点击 Switchable config 子系统。覆盖率详细信息窗格会显示此子系统的覆盖率详细信息。点击申述或排除链接。此时会打开“选择覆盖率过滤器”对话框,点击 <新建过滤器文件>。


为新的过滤器文件输入名称和描述。在过滤器规则部分中,输入此规则的理由,例如 unused config。

点击应用以保存对该过滤器文件的更改并更新覆盖率结果。

Switchable config 子系统现在显示为灰色虚线边框,而不是红色实线边框,这表明过滤器已将其从覆盖率结果中排除。
基于覆盖率结果对单个目标结果进行申述
在 Simulink 编辑器中,点击名为 Saturation 的 Saturation 模块,并在覆盖率详细信息窗格中查看覆盖率结果。由于 Saturation 模块的下限为 0,上限为 200,因此有两个决策结果不满意。然而,此模块的输入是 rate 信号,该信号的值永远不会小于或等于 0。因此,Saturation 模块的下限并未完全被使用,所以可以申述。
在决策 input > lower limit 的错误结果旁边,点击添加理由规则图标
。

覆盖率结果浏览器会在过滤器编辑器窗格中为当前选定的过滤器文件添加一条新的过滤器规则。指定申述理由,例如 rate > 0。
点击应用以保存该过滤器文件并更新覆盖率结果。

请注意,在覆盖率详细信息窗格中,Saturation 模块的已申述结果显示为淡蓝色,并链接到相应的理由。因为您没有过滤出决策 input >= upper limit 的真实结果,并且分析不足以执行此结果,所以 Saturation 模块仍然缺少覆盖率,并且仍然是红色的。

使用 Simulink Design Verifier 为死逻辑生成过滤器规则
在某些情况下,缺失覆盖率是由于死逻辑导致的,并且无法满足相关联的覆盖率目标。如果此逻辑用于您不想从模型中删除的元素,那么您可以对这些缺失覆盖率结果进行申述。
如果您拥有 Simulink Design Verifier™ 许可证,则可以为死逻辑自动创建申述过滤器规则。
在覆盖率结果浏览器中,选择应用的过滤器节点。在过滤器编辑器窗格中,选择为死逻辑制定申述过滤器规则(使用 Simulink Design Verifier)。

此选项使用 Simulink Design Verifier™ 来分析模型中的死逻辑。Simulink Design Verifier 会创建一个新的过滤器,并为每个相应的覆盖率结果添加申述规则。

Simulink Design Verifier 针对两个条件结果、七个决策结果和一个 MCDC 结果检测死逻辑并进行申述。
为此过滤器文件指定名称和描述。在本示例中,将名称设置为 slvnvdemo_covfilt_DeadLogic,将描述设置为 Justify dead logic in slvnvdemo_covfilt model,然后点击应用。在文件对话框中,指定保存此过滤器文件的位置。
关闭 Simulink Design Verifier 结果窗口。
在 R2026a 中,您还可以从覆盖率报告中启动失效逻辑检测分析。有关详细信息,请参阅识别并解决由死逻辑导致的覆盖率缺失问题。。
查看过滤后的覆盖率结果
在 Simulink 编辑器中,在覆盖率选项卡的查看结果部分中,选择覆盖率突出显示。

在应用此示例中的四个过滤器后,该模型的仿真现在实现了 100% 的条件覆盖率、63% 的决策覆盖率和 75% 的执行覆盖率。由于覆盖率结果中不再包含接收 MCDC 的模型对象,因此覆盖率报告中未列出此度量。覆盖率报告不会显示死逻辑分析过滤掉的 MCDC 结果,因为覆盖率过滤器 Filter_Tick 包含一条排除规则,该规则将该结果从报告中剔除了。

Mode Logic 图、time capture 子系统和 Saturation 模块中剩余的缺失覆盖率表明测试不充分。您可以通过扩展测试以对这些模型元素进行更彻底的测试,来解决此类未解决的覆盖率问题。
另请参阅
slcoverage.Filter | slcoverage.FilterRule