使用 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.SimulationInputSimulationInput 对象对应一个仿真,并存储在数组 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 并行运行仿真
使用 函数并行执行仿真。将 parsimSimulationInput 对象数组 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 objectscovdata 的字段中,该字段先前是由 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);