Main Content

Record Coverage in Parallel Simulations by Using Parsim

This example shows how to record coverage in multiple parallel Simulink® simulations corresponding to different test cases by using SimulationInput objects and the parsim command. If Parallel Computing Toolbox is installed on your system, the parsim command runs simulations in parallel. Otherwise, the simulations are run in serial.

Model Overview

The slvnvdemo_powerwindow_parsim model contains a power window controller and a low-order plant model. The component slvnvdemo_powerwindow_parsim/power_window_control_system/control is a Model block that references the model slvnvdemo_powerwindow_controller, which implements the controller with a Stateflow® chart.

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

Set Up Data for Multiple Simulations

Determine the number of test cases in the Signal Editor block by using the NumberOfScenarios parameter. The number of test cases determines the number of iterations to run.

sigEditBlk = [mdl '/Input'];
numCases   = str2double(get_param(sigEditBlk,'NumberOfScenarios'));

Create an array of Simulink.SimulationInput objects to define the set of simulations to run. Each SimulationInput object corresponds to one simulation and is stored in array simIn. For each simulation, set these parameters:

  • ActiveScenario to indicate which scenario of the Signal Editor block to execute

  • CovEnable to turn on coverage analysis

  • CovSaveSingleToWokspaceVar to save the coverage results to a workspace variable

  • CovSaveName to specify the name of the variable.

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

Run Simulations in Parallel by Using Parsim

Use the parsim function to execute the simulations in parallel. Pass the array of SimulationInput objects, simIn, into the parsim function as the first argument. Set the ShowProgress option to on to display the progress of the simulations in the MATLAB Command Window. The output from the parsim command is simOut, an array of Simulink.SimulationOutput objects.

simOut = parsim(simIn, 'ShowProgress', 'on');
[12-Feb-2024 23:45:58] Checking for availability of parallel pool...
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to parallel pool with 4 workers.
[12-Feb-2024 23:46:40] Starting Simulink on parallel workers...
[12-Feb-2024 23:47:24] Configuring simulation cache folder on parallel workers...
[12-Feb-2024 23:47:25] Loading model on parallel workers...
[12-Feb-2024 23:47:57] Running simulations...
[12-Feb-2024 23:48:13] Completed 1 of 2 simulation runs
[12-Feb-2024 23:48:13] Completed 2 of 2 simulation runs
[12-Feb-2024 23:48:13] Cleaning up parallel workers...

Each Simulink.SimulationInput object contains logged coverage results stored as cv.cvdatagroup objects. These coverage results are stored in a field named covdata, as previously specified by the CovSaveName parameter. Using parsim to run multiple simulations means that errors are captured so that subsequent simulations can continue to run. Any errors are recorded in the ErrorMessage property of the SimulationOutput object.

covdata references a file containing the coverage results. The coverage data from the referenced file is automatically loaded into memory when covdata is used by a coverage function.

simOut(1).covdata
ans = ... cvdata
               file: /tmp/Bdoc24a_2528353_1255971/tpef4b2572/slcoverage-ex16619798/slcov_output/slvnvdemo_powerwindow_parsim/slvnvdemo_powerwindow_parsim_cvdata_1.cvt
               date: 12-Feb-2024 23:48:12

Compute Cumulative Coverage

Obtain the coverage data from each element of simOut and cumulate the results.

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

View the cumulative coverage results on the model by using coverage highlighting.

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

Generate a cumulative coverage report.

cvhtml('cummulative_cov_report.html', coverageData);