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.
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);
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
objects to define the set of simulations to run. Each SimulationInput object corresponds to one simulation and is stored in array Simulink.SimulationInput
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
Use the
function to execute the simulations in parallel. Pass the array of SimulationInput objects, parsim
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');
[30-Jul-2020 03:37:00] Checking for availability of parallel pool... Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 12). [30-Jul-2020 03:38:02] Starting Simulink on parallel workers... [30-Jul-2020 03:38:36] Configuring simulation cache folder on parallel workers... [30-Jul-2020 03:38:37] Loading model on parallel workers... [30-Jul-2020 03:39:20] Running simulations... [30-Jul-2020 03:39:59] Completed 1 of 2 simulation runs [30-Jul-2020 03:39:59] Completed 2 of 2 simulation runs [30-Jul-2020 03:39:59] Cleaning up parallel workers...
Each
object contains logged coverage results stored as Simulink.SimulationInput
. These coverage results are stored in a field named cv.cvdatagroup
objectscovdata
, 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/BR2020bd_1444674_32127/publish_examples2/tpa5d638e0/ex16619798/slcov_output/slvnvdemo_powerwindow_parsim/slvnvdemo_powerwindow_parsim_cvdata_1.cvt date: 30-Jul-2020 03:39:58
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.
cvmodelview(coverageData);
open_system('slvnvdemo_powerwindow_parsim/power_window_control_system');
Generate a cumulative coverage report.
cvhtml('cummulative_cov_report.html', coverageData);