主要内容

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

背对背等效性测试

此示例显示如何创建并运行整个模型的背靠背测试,以比较正常模式仿真和软件在环 (SIL)仿真的结果。背靠背测试或等效性测试测试生成的代码是否产生与模型仿真相同的结果。这种类型的测试还可以揭示覆盖率的差距,并增加生成的代码按预期运行的信心。实施和测试功能需求、验证从模型生成的代码以及实现 100% 的模型和代码覆盖率是符合软件和安全标准和认证(例如 ISO 26262 和 IEC 61508)的关键部分。

此示例仅显示模型和 SIL 测试。SIL 仿真在您的开发计算机上编译并运行生成的代码。处理器在环 (PIL) 仿真在您的开发计算机上交叉编译源代码,然后在目标处理器或等效指令集仿真器上下载并运行目标代码。为了完全合规,您还需要进行 PIL 测试。有关更多信息,请参阅 配置并运行 PIL 仿真 (Embedded Coder)SIL and PIL Limitations (Embedded Coder)

正常模式仿真的测试结果和生成的代码可能会由于数值差异而有所不同,例如比较浮点值时的容差差异。时间延迟或编译器问题也可能导致代码和仿真之间的差异。连续不匹配的测试结果可能会暴露一个或多个现有问题,您可以修复这些问题,以使模型和生成的代码符合适用的行业标准和认证。

本例中的 sf_boilerController 模型包含一个 Stateflow 图,该图为锅炉的温度控制器建模。该模型源自Bang-Bang 温度控制系统建模 (Stateflow)示例。

打开模型和测试管理器

打开模型。然后打开测试管理器并清除之前加载的测试文件和结果。

Model = "sf_boilerController";
open_system(Model)

sltest.testmanager.view

sltest.testmanager.clear
sltest.testmanager.clearResults

打开“创建模型组件测试”向导

在测试管理器中,选择新建 > 模型组件测试以打开创建模型组件测试向导。

指定要测试的模型和组件

1.在系统选项卡中,点击使用当前模型按钮 button_use_current_model.png,将模型添加到顶层模型字段。

2.在左侧窗格中,选择顶层模型,sf_boilerController 选择整个模型。

3.点击添加按钮 2024-07-09_10-51-28.png,将模型添加到选定组件窗格。

4.点击下一步

System tab with whole model selected

指定测试输入

在“测试输入”选项卡中,使用默认设置使用来自顶层模型的组件输入作为测试输入。然后点击下一步

Test Inputs tab with Use component input from top model as test input selected.

指定如何测试组件

在验证策略选项卡中,指定创建背靠背测试。

1.选择执行背靠背测试

2.确保 Simulation1 设置为 Normal,并且 Simulation2 设置为 Software-in-the-Loop (SIL)。然后点击下一步

Verification Strategy tab with perform back-to-back testing selected.

指定输入、文件格式和文件位置

在“生成的测试”选项卡中,指定输入源、文件格式以及保存测试数据和生成的测试的位置。

1.确保选择测试框架输入源Inports

2.将指定文件格式更改为 Excel。将输入保存到 Excel 可让您查看并手动编辑 Simulink 之外的文件内容。

3.使用位置的默认值来保存测试数据和生成的测试。

4.点击完成

“创建模型组件测试”向导为图的输出设置信号记录,仿真模型,捕获信号,并创建测试框架和测试用例。它还创建 Excel 输入文件 sltest_sf_boilerController.xlsx 和测试文件 sltest_sf_boilerController_tests.mldatx

2024-07-11_08-31-41.png

检查仿真模式

1.在测试管理器的测试浏览器窗格中,选择向导创建的测试用例 sf_boilerController_Harness1。向导自动将测试用例名称设置为 model name_associated test harness name

2.在右侧窗格中,展开仿真 1 部分,然后展开仿真设置和发布覆盖。检查仿真模式参数是否为 Normal

Simulation one with Simulation mode set to normal

3.展开仿真 2 部分及其仿真设置和发布覆盖。检查其仿真模式参数是否为 Software-in-the-Loop (SIL)

Simulation two with Simulation mode set to software in the loop.

设置要收集的覆盖范围

1.在测试浏览器窗格中,选择测试文件 sltest_sf_boilerController_tests

2.在右侧窗格中,展开覆盖范围设置。您只能在测试文件级别设置覆盖率。覆盖率设置传播到文件中的测试用例。

3.选择记录在测系统的覆盖率记录引用模型的覆盖率以启用覆盖率收集。

4.在覆盖率度量下,选择决策条件MCDC。大多数认证标准(包括 ISO 26262)都要求这些度量。

  • 决策覆盖率分析模型中的决策点。决策是模型中一个或多个输入信号决定某个模块的输出信号的地方。决策覆盖率决定是否所有决策都经过测试。

  • 条件覆盖率分析输出其输入和 Stateflow 转移的逻辑组合的模块。对于此示例,当测试用例在仿真过程中导致 Stateflow 转移上的每个条件至少为真一次、至少为假一次时,它实现了全覆盖。

  • MCDC(修改条件/决策覆盖)扩展了决策和条件覆盖率。它分析决策中的每个条件是否独立影响决策结果,并对所有可能的结果进行至少一次评估。对于这个示例,MCDC 分析了 Stateflow 转移。

有关覆盖率和覆盖率度量的更多信息,请分别参阅模型覆盖率 (Simulink Coverage)模型覆盖率类型 (Simulink Coverage)

Coverage section with Decision, condition, and mcdc selected

运行测试用例并查看结果

1.选择测试用例 sf_boilerController_Harness1,然后点击工具栏中的运行按钮。测试运行时,左侧窗格显示结果和工件窗格。

2.测试完成后,点击结果和工件窗格中的 Results 来更新右侧窗格。

聚合覆盖率结果部分显示了 SIL 模式仿真的代码覆盖率以及正常模式仿真模型中功能元素的覆盖率。正常和 SIL 仿真模式的覆盖率均低于 100%,这表明在测试期间并未执行所有代码和模型路径。函数覆盖率度量不适用于普通仿真模式。

Coverage results less than 100% for both software in the loop and normal simulation modes

增加覆盖范围

您可以使用 Simulink Design Verifier 来增加覆盖率。运行测试并收集覆盖率后,Simulink Design Verifier 可以使用不同的输入生成新的测试用例来测试模型中未测试的部分。

1.在聚合覆盖率结果表的仿真模式列中,点击普通

2.在表格下方,点击添加缺失覆盖率测试

3.在添加缺失覆盖率测试对话框中,将测试用例设置为 <Create a new test case>

4.将测试类型设置为 Equivalence Test

Add Tests for Missing Coverage dialog box

5.将其他字段保留为默认值。点击确定。Simulink Design Verifier 创建一个新的测试套件、测试用例和测试迭代。测试浏览器显示了新的测试套件和测试用例 New Test Case 1

6.选择 New Test Case 1 并展开 New Test Case 1迭代部分以查看迭代。

设置仿真模式、运行新测试用例并查看更新的覆盖率

1.展开仿真 1仿真设置和发布覆盖。将仿真模式更改为 Normal

2.展开仿真 2仿真设置和发布覆盖。将仿真模式更改为 Software-in-the-Loop (SIL)

3.点击工具栏中的运行按钮。

4.当测试完成运行时,点击结果和工件面板中的最新 Results 来更新右侧窗格。

5.查看聚合覆盖率结果,正常模式下为 100%,但 SIL 模式的决策度量结果仅为 94%。此模型缺少决策覆盖率,这是由于当值超出指定范围时评估错误条件的代码造成的。代码生成器添加了整数溢出保护,以减少测试用例评估所有错误值所需的时间。

Updated coverage results showing 100% coverage for normal simulation mode. For software in the loop, the decision metric is 94% and all others are 100%

申述并过滤缺失的覆盖范围

您可以为想要标记为不满意覆盖率的代码行或模型元素提供理由申述。导致覆盖率结果低于 100%的申述原因包括代码生成优化、代码替换库、错误条件以及防御性代码。

1.点击 SIL 仿真的报告列中的“创建聚合覆盖率报告”箭头,以创建 SIL 覆盖率摘要报告。

Location of arrow to create coverage report

2.在 sf_boilerController 的 SIL 覆盖率摘要报告中,转到节 5.1 Decision localDW->temporalCounter_i1 < 31U (line 90)。这是导致决策覆盖率结果较低的两行代码之一。指定范围的整数值数量有限,因此 true 结果的覆盖率为 100%,但 false 结果的可能值数量不受限制,这需要很长时间进行测试,因此 false 结果不能被认为具有 100% 的覆盖率。

3.点击突出显示的申述或排除链接或 false 结果旁边的添加申述规则图标,打开过滤器资源管理器。

Location of justify or exclude link and add justification rule icon in coverage report

4.在过滤器资源管理器的过滤规则部分中,将显示的代码行的模式更改为 Justified。添加“生成的代码中的整数溢出保护只能通过不切实际的长测试用例来执行”作为该申述的理由。有关覆盖率过滤的信息,请参阅覆盖率过滤 (Simulink Coverage)覆盖率过滤器规则和文件 (Simulink Coverage)

Filter explorer dialog box with filter rule for section 5.1

5.点击应用,在保存过滤器文件对话框中,输入 boilerController_covfilter 作为覆盖率过滤器 (.cvf) 文件的名称,然后点击保存

6.在 sf_boilerController 的 SIL 覆盖率摘要报告中,请注意第 5.1 节现在已合理,其覆盖率为 100%,并且表格中的 false 行以浅蓝色突出显示。

Updated coverage report section 5.1 showing decision coverage justified to 100%

7.转到报告中的第 5.2 决策 localDW->temporalCounter_i2 < 63U(第 94 行)部分,并重复步骤 3 和 4 以申述该 false 决策的缺失覆盖。使用与第 5.1 节相同的理由。

8.点击应用以更新 boilerController_covfilter.cvf 覆盖率过滤器文件和 SIL 覆盖率报告。报告的摘要部分显示覆盖率为 100%,其中覆盖率百分比条的浅蓝色部分表示合理的覆盖率。在测试管理器中,聚合覆盖率结果显示更新的覆盖率,并且覆盖率过滤器文件列在覆盖率过滤器部分。

Updated Test Manager aggregated coverage section showing justified decision coverage

9.在覆盖率过滤器窗格的底部,点击更新测试文件以将覆盖率过滤器附加到测试文件。

查看等效性的仿真输出结果

展开结果 > 新测试用例 1 > 迭代 1 ,然后选择等效性准则结果。然后,在嵌入式仿真数据检查器的比较选项卡中,选择输出端口:1 信号。

xx1.png

上图显示了重叠的正常模式和 SIL 模式输出。下图显示输出信号之间的差异为零,因此正常模式和 SIL 模式仿真匹配。

results_plots.png

清理

使用这些命令关闭模型以及关闭和清除测试管理器:

close_system(Model,0)

sltest.testmanager.clear

sltest.testmanager.clearResults

sltest.testmanager.close

另请参阅

| |

主题