SIL(Software-in-the-Loop,软件在环)是把真实或接近量产的软件实现接入仿真闭环,在普通主机或仿真运行时中验证软件行为的测试方法。
核心问题
MIL(模型在环) 验证的是模型层算法,但量产软件会引入代码结构、整数定点、边界处理、状态机、消息解析、错误码和调度逻辑。SIL 解决的是“真实软件代码在仿真输入下是否表现符合预期”的问题,同时还不要求目标硬件已经可用。
核心机制
SIL 把环上的控制器从“算法模型”替换成“软件实现”:
控制软件二进制/库 -> 控制输出 -> 被控对象仿真
^ |
| v
-------- 模拟输入/消息 -----典型流程是:
- 将控制软件编译成可在主机运行的库、进程或测试目标。
- 用适配层模拟传感器、总线消息、时钟、文件系统或中间件接口。
- 将测试场景喂给软件。
- 检查输出命令、状态转换、错误处理、日志和断言。
- 将通过的用例推进到 PIL(处理器在环) 或 HIL(硬件在环)。
SIL 的价值在于保留真实软件逻辑,同时让测试比真实硬件更快、更容易自动化。
工程用途
- 嵌入式控制软件的主机端自动化测试。
- 验证消息解析、状态机、边界条件和故障分支。
- 在 CI 中运行控制场景 回归测试。
- 在目标板稀缺或上电风险较高时提前验证软件行为。
边界与常见坑
- SIL 不覆盖真实硬件时序:主机调度、CPU、缓存、外设和中断行为不同于目标板。
- 接口适配层可能掩盖问题:模拟接口太宽松会错过协议、字节序和单位错误。
- 主机浮点和目标平台数值可能不同:特别是定点、溢出、舍入和编译器优化。
- 不要把 mock 写成答案:mock 如果按期望输出反推实现,会让测试失去发现问题的能力。