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可以在软件设计早期提前识别该风险并修复。

>>返回个人博客总目录

相关推荐
菜鸟~noob2333 小时前
【Bonjour】华为Peerium架构深度解析:从冯·诺依曼到百万处理器“一台计算机”,附MATLAB性能仿真【含matlab代码,可直接运行】
开发语言·matlab·华为·peerium
民乐团扒谱机4 小时前
【手把手通信仿真】FSK与GFSK调制原理对比及MATLAB全实现,附频谱波形分析
matlab·蓝牙·微电子·通信技术·通信原理·gfsk·fsk
ι:1 天前
单相桥式全控整流仿真从零复现教学
windows·学习·matlab·simulink
菜鸟~noob2331 天前
【电子战】第14篇:TOA 定位——圆交汇与到达时间【含matlab代码】
开发语言·matlab
简简单单做算法1 天前
基于灰狼算法和贝叶斯联合优化的BiLSTM(GWO-BO-BiLSTM)一维时间序列预测算法matlab仿真
matlab·一维时间序列预测·gwo-bo-bilstm
Evand J2 天前
【MATLAB例程|图像滤波降噪13】局部噪声方差自适应滤波(LNR)图像降噪与效果展示。附完整例程的下载链接
图像处理·计算机视觉·matlab·滤波·代码·降噪
weixin_307779132 天前
C++代码实现MATLAB中的ode23t函数功能
开发语言·c++·算法·matlab
Evand J2 天前
【MATLAB例程】二维Astar路径规划与AOA-TDOA定位仿真。完整代码,附下载链接。包运行成功,带中文注释
开发语言·matlab·路径规划·代码·定位·融合定位
路径规划6663 天前
(MATLAB代码)退火PSO融合DWA算法的船舶路径规划MATLAB实现(260915)
matlab·路径规划·船舶·dwa·pso粒子群算法
weixin_307779133 天前
C++代码实现MATLAB中的ode45函数功能
开发语言·c++·算法·matlab