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.
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);
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), 'CovSaveSingleToWorkspaceVar', 'on'); simIn(idx) = setModelParameter(simIn(idx), 'CovSaveName', 'covdata'); end
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');
[26-Aug-2019 13:05:54] Checking for availability of parallel pool... Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 4). [26-Aug-2019 13:08:18] Starting Simulink on parallel workers... [26-Aug-2019 13:11:17] Configuring simulation cache folder on parallel workers... [26-Aug-2019 13:11:33] Loading model on parallel workers... [26-Aug-2019 13:13:46] Running simulations... [26-Aug-2019 13:18:22] Completed 1 of 2 simulation runs [26-Aug-2019 13:18:23] Completed 2 of 2 simulation runs [26-Aug-2019 13:18:24] Cleaning up parallel workers...
Simulink.SimulationOutput object contains logged coverage results stored as
cvdata 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.
ans = ... cvdata file: /tmp/Bdoc19b_1192687_99511/tp2385fa42/slcov_output/slvnvdemo_powerwindow_parsim/slvnvdemo_powerwindow_parsim_cvdata_1.cvt date: 26-Aug-2019 13:18:08
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.
Generate a cumulative coverage report.
Close the model if the model was opened by the example script.
if(~isModelOpen) close_system(mdl, 0); end