Design Verifier检查:整型数溢出检查与修复

汇聚博主多年工程经验的新书《Simulink嵌入式开发实战》现已上市,针对Simulink与MBD开发技术,形成了一套完整的知识体系和方法论。详细介绍和优惠链接可以参考博客《Simulink嵌入式开发实战》新书上市,感谢粉丝长期以来的支持!

文章目录

  • [1 整型数溢出](#1 整型数溢出)
  • [2 建模与检查示例](#2 建模与检查示例)
    • [2.1 搭建整型数溢出模型](#2.1 搭建整型数溢出模型)
    • [2.2 配置Design Verifier检查](#2.2 配置Design Verifier检查)
    • [2.3 查看分析结果](#2.3 查看分析结果)
  • [3 修复方案](#3 修复方案)
    • [3.1 修改输出数据类型](#3.1 修改输出数据类型)
    • [3.2 限制输入范围](#3.2 限制输入范围)
  • [4 总结](#4 总结)

本文介绍Simulink Design Verifier中的整型数溢出检查方法,包括整型数溢出的概念和风险、示例模型的搭建与检查,以及常见的修复方案。Matlab版本为2026a。

1 整型数溢出

整型数据类型能够表示某个整数范围的取值。例如,int8类型的取值范围为-128~127。

假设一个int8类型的输入信号取值为64,经过Gain为2的增益运算后,理论结果为128。如果输出的数据类型也是int8,那就超出了127的上限,造成了整型数溢出。

实际工况中,整型数溢出可能一直不会出现,而是在某些特定的工况下。人工设计测试用例很可能测不出这类问题,使用Design Verifier检查可以有效地识别出该类风险。

2 建模与检查示例

2.1 搭建整型数溢出模型

新建模型一个slx模型,在模型中依次放置Inport、Gain和Outport模块,如下图。

将根层Inport的输出数据类型设置为int8,如下图。

Gain模块的参数设置如下:

  1. Gain取值设置为2;
  2. Output data type设置为int8;
  3. 取消勾选Saturate on integer overflow;

    此时Gain模块的输入和输出都是int8。当输入大于63或者小于-64时,乘以2后的结果就会超出int8范围。

另外,Design Verifier要求模型使用固定步长求解器。可以在Model Settings → Solver中将Type设置为Fixed-step。

2.2 配置Design Verifier检查

在Simulink上方的Apps中打开Design Verifier,将分析模式选择为【Design Error Detection】。

在Settings → Design Verifier → Design Error Detection中关闭【Defect Checker】,再启用【Integer overflow】,通过这种方式只检查溢出这一种问题。

配置完成后,点击【Detect Design Errors】执行分析过程。

2.3 查看分析结果

执行完成后,在弹出地报告窗口中会显示有一条未通过,如下图。

点击下方的【Highlight analysis results on model】,就会将Gain模块高亮显示,表示该处产生了溢出。

鼠标左键点击Gain模块,会在另一个窗口显示问题描述,此处显示为溢出错误,如下图。

3 修复方案

3.1 修改输出数据类型

如果Gain模块地上游信号真实取值能到到【-128,127】的边界,那没Gain输出信号的取值范围必须覆盖【-256,254】,将Gain模块的Output data type从int8修改为int16,即可完整表示该范围。

这种方案使用了合理的类型表示大范围数据,一定不会出错。

3.2 限制输入范围

假如上游信号的真实取值不可能达到【-64,63】范围之外,只是使用了int8这个类型,那么即使输出类型使用int8也不会溢出。

在这种情况下,可以在inport的参数配置界面将MinMax取值配置成真实物理取值范围,如【-10,10】。

这样在Design Verifier检查时就能检索到输入信号的范围,从而推算出输出范围是【-20,20】,在int8类型下不会出现溢出,从而不会再报错。

4 总结

整型数溢出的本质是运算结果超出了数据类型能够表示的范围。溢出后产生非预期的数值大小对嵌入式控制算法具有较大风险。Design Verifier可以在软件设计早期提前识别该风险并修复。

>>返回个人博客总目录

相关推荐
星夜离尘5610 小时前
MATLAB ADC 码流触顶诊断:命中数、缺口分段与削顶不可辨识性
开发语言·matlab
Evand J16 小时前
【MATLAB例程】平面下,5基站对待定位点的定位。基于距离辅助下的AOA。完整代码下载链接
开发语言·matlab·平面·定位·导航·测距·aoa
iCxhust17 小时前
MATLAB SPWM仿真
开发语言·matlab
Moonnnn.2 天前
【MATLAB】零基础入门
matlab
且撷相思红豆枝3 天前
Simulink学习笔记(一)
笔记·学习·matlab
星夜离尘563 天前
MATLAB 角度解缠遇到丢样:先分段,再说明圈数为什么不可恢复
开发语言·matlab
chhttty4 天前
Simulink电机控制框架
matlab·simulink
星夜离尘564 天前
MATLAB 工程实验:不等间隔流量积分,先把缺口与覆盖率说清楚
开发语言·matlab·时间戳·数据质量·数值积分
大江东去浪淘尽千古风流人物5 天前
【HIMO】跨模态图像匹配算法:IMO方向场提取与PolarP描述符源码精讲
matlab·跨模态·遥感·图像匹配·1024程序员节·特征描述符
星夜离尘565 天前
MATLAB 因果采样保持:用历史匹配和数据年龄防止未来信息泄漏
数据结构·算法·matlab