Main Content

本页采用了机器翻译。点击此处可查看最新英文版本。

不支持的模块的模块替换

此示例展示了如何使用 Simulink® Design Verifier™ 函数来替换不受支持的模块以及如何根据特定需求定制测试向量生成。

带有无支撑模块的模型

示例模型包括一个 Switch模块,其输出由 Sqrt模块控制。对于每个开关位置,模型的输出由1-D Lookup Table模块计算。对于该模型,示例集中于生成满足以下条件的测试用例:

1.实现100%的查找表覆盖率。

2.当第一个和第三个输入端口的值不同时,测试向量会显示每个 Switch模块的位置。

open_system('sldvdemo_sqrt_blockrep');

检查模型兼容性

由于不支持 sqrt 功能,该模型与 Simulink Design Verifier 部分兼容。

sldvcompat('sldvdemo_sqrt_blockrep');
20-Apr-2024 09:55:28
Checking compatibility for test generation: model 'sldvdemo_sqrt_blockrep'
Compiling model...done
Building model representation...done

20-Apr-2024 09:55:33

'sldvdemo_sqrt_blockrep' is partially compatible for test generation with Simulink Design Verifier.

The model can be analyzed by Simulink Design Verifier. 
It contains unsupported elements that will be stubbed out during analysis. The results of the analysis might be incomplete. 
See the Diagnostic Viewer for more details on the unsupported elements.

创建自定义模块替换规则来解决不兼容问题

可以通过自动桩件不受支持的 Sqrt模块来分析该模型以生成测试。但是,无法为 Switch模块位置生成测试用例,因为 Simulink Design Verifier 不理解 Sqrt模块,并且该模块的输出正在影响 Switch模块。由于您需要 Switch模块的测试用例,因此您需要用功能等效的受支持模块替换 Sqrt模块。下面显示的库模块sldvdemo_custom_blockreplib将输入信号限制在范围[0 10000]内,并使用1-D Lookup Table模块近似sqrt函数。

表格数据经过计算,与 sqrt 的值相匹配,在 [0 10000] 范围内最大误差为 0.2 。请参阅库 sldvdemo_custom_blockreplib 中模块Sqrt_Approx 的掩码初始化窗格,了解查找表数据的值。

替换规则在MATLAB文件sldvdemo_custom_blkrep_rule_sqrt.m中定义。由于 Sqrt模块的替换模块sldvdemo_custom_blockreplib 仅对双精度或单精度类型有效,因此此规则确保在允许模块替换之前满足这些条件。

   function rule = sldvdemo_custom_blkrep_rule_sqrt
       rule = SldvBlockReplacement.blockreprule;
       rule.fileName = mfilename;
       rule.blockType = 'Sqrt';
       rule.replacementPath = sprintf('sldvdemo_custom_blockreplib/Sqrt_Approx');
       rule.replacementMode = 'Normal';
       parameter.OutMin = '$original.OutMin$';
       parameter.OutMax = '$original.OutMax$';
       parameter.OutDataTypeStr = '$original.OutDataTypeStr$';
       rule.parameterMap = parameter;
       rule.isReplaceableCallBack = @replacementTestFunction;
   end
   function out = replacementTestFunction(blockH)
       out = false;
       acceptedOutDataTypeStr = {'double','single',...
                         'Inherit: Inherit via back propagation',...
                         'Inherit: Same as input'};
       I = strmatch(get_param(blockH,'OutDataTypeStr'),acceptedOutDataTypeStr,'exact');
       if ~isempty(I)
           portDataTypes = get_param(blockH,'CompiledPortDataTypes');
           out = any(strcmp(portDataTypes.Inport,{'double','single'})) &&  ...
                 strcmp(portDataTypes.Inport,portDataTypes.Outport);
       end
   end
open_system('sldvdemo_custom_blockreplib');
open_system('sldvdemo_custom_blockreplib/Sqrt_Approx/1-D Lookup Table');

配置 Simulink® Design Verifier™ 选项以进行模块替换

您将在启用模块替换的情况下在测试生成模式下运行Simulink Design Verifier。为了生成 Switch模块位置的测试用例,必须使用自定义替换规则 sldvdemo_custom_blkrep_rule_sqrt.m

由于您也对查找表覆盖率感兴趣,因此您需要内置模块替换blkrep_rule_lookup_normal.m,它为每个区间插入测试目标,为1-D Lookup Table模块插入断点值。此外,您需要内置规则blkrep_rule_switch_normal.m,该规则要求当第一个和第三个输入端口的值不同时,执行每个开关位置。

分析将最多运行 30 秒并生成框架模型。报告生成功能也已启用。其他 Simulink Design Verifier 选项设置为其默认值。

opts = sldvoptions;
opts.Mode = 'TestGeneration';
opts.MaxProcessTime = 80;
opts.BlockReplacement = 'on';
opts.BlockReplacementRulesList = ['sldvdemo_custom_blkrep_rule_sqrt.m,' ...
                                  'blkrep_rule_lookup_normal.m,'...
                                  'blkrep_rule_switch_normal.m'];
opts.SaveHarnessModel = 'on';
opts.ModelReferenceHarness = 'on';
opts.SaveReport = 'on';

使用模块替换执行测试生成

sldvrun 函数使用 sldvoptions 对象 opts 中定义的设置来分析模型。生成的报告包括一章总结对模型执行的模块替换。从 Coverage Toolbox 关闭警告:

warning('off','Simulink:blocks:WarnTuningWhenCoverage')
[status,fileNames] = sldvrun('sldvdemo_sqrt_blockrep', opts, true);

在使用模型中执行测试

启用查找表覆盖率度量,然后使用框架模型运行测试用例。您还可以从配置参数对话框中启用查找表覆盖率后,通过单击信号编辑器对话框中的“全部运行”按钮来执行测试套件。在覆盖率标签中,选择启用覆盖率分析,然后选择覆盖率度量 > 其他度量 > 查找表

下面显示的覆盖率报告表明,您可以使用Simulink Design Verifier生成的测试向量达到 100% 的查找表覆盖率。

[harnessModelPath,harnessModel] = fileparts(fileNames.HarnessModel);
set_param(harnessModel,'covMetricSettings','dcmte');
sldvdemo_playall(harnessModel);

清理

为了完成示例,请关闭所有模型并删除Simulink Design Verifier生成的文件。

close_system('sldvdemo_custom_blockreplib');
close_system(fileNames.HarnessModel,0);
close_system(fileNames.BlockReplacementModel,0);
close_system('sldvdemo_sqrt_blockrep',0);
delete(fileNames.HarnessModel);
delete(fileNames.BlockReplacementModel);
delete(fileNames.DataFile);