汇聚博主多年工程经验的新书《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模块的参数设置如下:
- Gain取值设置为2;
- Output data type设置为int8;
- 取消勾选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可以在软件设计早期提前识别该风险并修复。