This example shows how coverage information for a model is bundled in the cvdata object and how utility commands can extract information from it for an individual subsystem, block, or Stateflow® object.
This example illustrates command line access of coverage data for a small model that contains aspects of all the supported coverage metrics. The model contains some blocks with coverage points at the root level and others at the subsystem level.
Use the following commands to open the model 'slvnvdemo_cv_small_controller' and its subsystem 'Gain.'
Simulate the model with the
cvsim command. This command captures coverage data as a side-effect and returns this information in a cvdata object. The cvdata object is a MATLAB® object that references the internal data stored in the coverage tool and the model data structures that produce that data.
testObj = cvtest('slvnvdemo_cv_small_controller'); testObj.settings.decision = 1; testObj.settings.condition = 1; testObj.settings.mcdc = 1; testObj.settings.tableExec = 1; testObj.settings.sigrange = 1; data = cvsim(testObj)
data = ... cvdata id: 989 type: TEST_DATA test: cvtest object rootID: 991 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 26-May-2016 10:33:20 stopTime: 26-May-2016 10:33:20 intervalStartTime: 0 intervalStopTime: 0 simulationStartTime: 0 simulationStopTime: 10 metrics: [1x1 struct] filter: simMode: Normal
Process the coverage data returned from a
cvsim command with the report generation command
cvhtml. The resulting report is a convenient representation of model coverage for the entire model.
Frequently, you want to extract information for a specific subsystem or block in the model. A coverage data object contains a series of arrays, one for each metric analyzed. Access this data using structure style references. For example, access raw decision coverage data with the following command:
ans = 4 0 1 0 1 0 1 0 373 0 3 0 3 0 0 6 6 53
Access raw condition coverage with the following command:
ans = 4 0 4 0 2 0 2 0 0 59 59 0 1 0 1 0 0 59 1 0 1 0 59 0
Individual elements within the raw coverage data correspond to specific coverage points within the model. The order of these points is based on the location of blocks within the Simulink® and Stateflow® hierarchy. Several access commands allow data to be extracted for a specific block or subsystem.
decisioninfo command to extract decision coverage information for individual Simulink blocks or Stateflow objects.
The following command extracts a coverage array for the entire model. The first element is the number of coverage points satisfied for the model; the second element is the total number of coverage points for the model.
cov = decisioninfo(data,'slvnvdemo_cv_small_controller') percent = 100*cov(1)/cov(2)
cov = 4 6 percent = 66.6667
Retrieve coverage information for the 'Saturation' block using the full path to that block. Provide a second return argument for textual descriptions of the coverage points within that block.
[blkCov, description] = decisioninfo(data,'slvnvdemo_cv_small_controller/Saturation') decision1 = description.decision(1).text out_1a = description.decision(1).outcome(1).text count_1a = description.decision(1).outcome(1).executionCount out_1b = description.decision(1).outcome(2).text count_1b = description.decision(1).outcome(2).executionCount
blkCov = 3 4 description = struct with fields: isFiltered: 0 justifiedCoverage: 0 decision: [1×2 struct] decision1 = 1×6 char array U > LL out_1a = 1×5 char array false count_1a = 0 out_1b = 1×4 char array true count_1b = 6
Quantitative coverage information is available for every point in the hierarchy that contains or has coverage points. Textual descriptions are generated only for objects that have coverage points themselves. For example, invoke
decisioninfo for the virtual subsystem Gain, and the description return value is empty.
[blkCov, description] = decisioninfo(data,'slvnvdemo_cv_small_controller/Gain')
blkCov = 1 2 description = struct with fields: isFiltered: 0 justifiedCoverage: 0
In some cases an object has internal coverage points but also contains descendents with additional coverage points. Coverage information normally includes all the descendents unless a third argument for ignoring descendents is set to 1.
subsysOnlycov = decisioninfo(data,'slvnvdemo_cv_small_controller/Gain',1)
subsysOnlycov = 
decisioninfo command also works with block handles, Stateflow IDs, and Stateflow API objects. If an object has no decision coverage, the command returns empty outputs.
blkHandle = get_param('slvnvdemo_cv_small_controller/Saturation','Handle') blkCov = decisioninfo(data,blkHandle) missingBlkCov = decisioninfo(data,'slvnvdemo_cv_small_controller/Sine1')
blkHandle = 472.0011 blkCov = 3 4 missingBlkCov = 
Condition coverage indicates if the logical inputs to Boolean expressions have been evaluated to both true and false. In Simulink, conditions are the inputs to logical operations.
conditioninfo command for extracting coverage information is very similar to the
decisioninfo command. It normally returns information about an object and all its descendents, but can take a third argument that indicates if descendents should be ignored. It can also return a second output containing descriptions of each condition.
cov = conditioninfo(data,'slvnvdemo_cv_small_controller/Gain/Logic') [cov, desc] = conditioninfo(data,'slvnvdemo_cv_small_controller/Gain/Logic'); desc(1) desc(2)
cov = 2 4 ans = struct with fields: text: 'port1' trueCnts: 59 falseCnts: 0 isFiltered: 0 filterRationale: '' ans = struct with fields: text: 'port2' trueCnts: 0 falseCnts: 59 isFiltered: 0 filterRationale: ''
MCDC coverage analyzes the objects in a model that define Boolean expressions. MCDC coverage is satisfied for a condition within a Boolean expression if there are two evaluations of the expression such that only that condition changes value and results in changing the value of the entire expression.
In some cases Boolean expressions are short circuited so that the remaining conditions are not evaluated. The coverage analysis permits conditions to change from known values to unknown values and vice versa and still treats the condition as unchanged for purposes of MCDC analysis.
In this example, the logical AND block is analyzed for MCDC coverage with an
mcdcinfo command. This command uses the same syntax as
[cov, desc] = mcdcinfo(data,'slvnvdemo_cv_small_controller/Gain/Logic') desc.condition
cov = 0 2 desc = struct with fields: text: 'Output' condition: [1×2 struct] isFiltered: 0 filterRationale: '' justifiedCoverage: 0 ans = 1×2 struct array with fields: text achieved trueRslt falseRslt isFiltered filterRationale
Lookup table coverage records the frequency that lookup occurs for each interpolation interval. Valid intervals for coverage purposes also include values less than the smallest breakpoint and values greater than the largest breakpoint. For consistency with the other commands this information is returned as a pair of counts with the number of intervals that executed and the total number of intervals.
A second output argument causes
tableinfo to return the execution counts for all interpolation intervals. If the table has M-by-N output values, execution counts are returned in an M+1-by-N+1 matrix.
A third output argument causes
tableinfo to return the counts where the input was exactly equal to the breakpoint. This is returned in a cell array of vectors, one for each dimension in the table.
[cov,execCnts,brkEq] = tableinfo(data, 'slvnvdemo_cv_small_controller/Gain/Gain Table')
cov = 23 121 execCnts = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 12 14 10 2 0 0 0 0 0 4 12 0 0 0 12 0 0 0 0 0 22 0 0 0 0 0 12 0 0 0 0 21 0 0 0 0 0 59 0 0 0 0 21 0 0 0 0 0 29 0 0 0 0 7 28 0 0 0 28 6 0 0 0 0 0 4 22 18 23 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 brkEq = 1×2 cell array [10×1 double] [10×1 double]
Signal range coverage records the smallest and largest value of Simulink block outputs and Stateflow data objects. The
sigrangeinfo command returns two return arguments for the minimum and maximum values, respectively.
sigrangeinfo command works only for leaf blocks that perform a computation; otherwise the command returns empty arguments.
[sigMin, sigMax] = sigrangeinfo(data,'slvnvdemo_cv_small_controller/Gain/Gain Table') % Leaf [sigMin, sigMax] = sigrangeinfo(data,'slvnvdemo_cv_small_controller/Gain') % Nonleaf
sigMin = 3.3656 sigMax = 7.6120 sigMin =  sigMax = 
Finish by closing the model.