主要内容

使用 Parsim 在并行仿真中记录覆盖率

此示例说明如何使用 SimulationInput 对象和 parsim 命令在对应于不同测试用例的多个并行 Simulink® 仿真中记录覆盖率。如果您的系统中安装了 Parallel Computing Toolbox,则 parsim 命令会以并行方式运行仿真。否则,仿真将以串行方式运行。

模型概述

slvnvdemo_powerwindow_parsim 包含一个电动车窗控制器和一个低阶被控对象模型。组件 slvnvdemo_powerwindow_parsim/power_window_control_system/control 是一个 Model 模块,它引用模型 slvnvdemo_powerwindow_controller,该模型使用 Stateflow® 图实现控制器。

mdl               = "slvnvdemo_powerwindow_parsim";
isModelOpen       = bdIsLoaded(mdl);
open_system(mdl);

为多个仿真设置数据

通过使用 NumberOfScenarios 参数来确定 Signal Editor 模块中的测试用例数量。测试用例的数量决定了需要运行的迭代次数。

sigEditBlk = mdl + "/Input";
numCases   = str2double(get_param(sigEditBlk,"NumberOfScenarios"));

创建一个 Simulink.SimulationInput 对象数组,以定义要运行的仿真集。每个 SimulationInput 对象对应一个仿真,并存储在数组 simIn 中。对于每个仿真,请设置以下参数:

  • ActiveScenario,用于指示要执行 Signal Editor 模块的哪个场景

  • CovEnable,用于启用覆盖率分析

  • CovSaveSingleToWokspaceVar,用于将覆盖率结果保存到工作区变量

  • CovSaveName,用于指定变量的名称。

for idx = numCases:-1:1
    simIn(idx) = Simulink.SimulationInput(mdl);
    simIn(idx) = setBlockParameter(simIn(idx),...
        sigEditBlk,"ActiveScenario",idx);
    simIn(idx) = setModelParameter(simIn(idx),...
        "CovEnable","on");
    simIn(idx) = setModelParameter(simIn(idx),...
        "CovIncludeTopModel","off");
    simIn(idx) = setModelParameter(simIn(idx),...
        "CovSaveSingleToWorkspaceVar","on");
    simIn(idx) = setModelParameter(simIn(idx),...
        "CovSaveName","covdata");
end

使用 Parsim 并行运行仿真

使用 parsim 函数并行执行仿真。将 SimulationInput 对象数组 simIn 作为第一个参量传递给 parsim 函数。将 ShowProgress 选项设置为 on,以在 MATLAB 命令行窗口中显示仿真进度。parsim 命令的输出是 simOut(一个 Simulink.SimulationOutput 对象数组)。

simOut = parsim(simIn,ShowProgress="on");
[12-Aug-2025 18:01:33] Checking for availability of parallel pool...
[12-Aug-2025 18:01:34] Running simulations...
[12-Aug-2025 18:01:53] Completed 1 of 2 simulation runs
[12-Aug-2025 18:01:56] Completed 2 of 2 simulation runs

每个 Simulink.SimulationInput 对象都包含以 cv.cvdatagroup objects 形式存储的已记录覆盖率结果。这些覆盖率结果存储在名为 covdata 的字段中,该字段先前是由 CovSaveName 参数指定的。使用 parsim 运行多个仿真意味着可以捕获错误,从而使后续仿真能够继续运行。任何错误都会被记录在 SimulationOutput 对象的 ErrorMessage 属性中。

covdata 引用包含覆盖率结果的文件。当覆盖率函数使用 covdata 时,引用的文件中的覆盖率数据会自动加载到内存中。

simOut(1).covdata
ans = ... cvdata
               file: /tmp/Bdoc25b_2988451_566893/tp77645017/slcoverage-ex16619798/slcov_output/slvnvdemo_powerwindow_parsim/slvnvdemo_powerwindow_parsim_cvdata_1.cvt
               date: 12-Aug-2025 18:01:52

计算累积覆盖率

simOut 的每个元素中获取覆盖率数据,并累积这些结果。

coverageData = simOut(1).covdata;
for i = 2 : numCases
    coverageData = coverageData + simOut(i).covdata;
end

使用覆盖率突出显示功能查看模型上的累积覆盖率结果。

open(Simulink.BlockPath(...
    "slvnvdemo_powerwindow_parsim/power_window_control_system/control"));
cvmodelview(coverageData);

生成累积覆盖率报告。

cvhtml("cumulativeCovReport",coverageData);