3. 故障注入方法:软件故障注入(SFI)、硬件故障注入(HFI)、仿真故障注入
聊到故障注入,很多刚入行的朋友会问我:「到底该选哪种方法?」
我的回答通常是——看你的测试目标是什么。三种方法各有各的脾气,没有银弹。今天我就把这三种方法掰开揉碎了讲清楚。
3.1 软件故障注入(SFI)
软件故障注入,说白了就是通过修改软件状态来模拟硬件故障。不需要动硬件,成本低,跑得快。
常见的SFI手段:
- 寄存器位翻转:直接修改CPU寄存器或内存中的值
- 指令跳转:跳过某条指令,模拟程序跑飞
- 数据污染:往关键变量里塞错误数据
- 中断干扰:在错误时机触发中断
我个人习惯:在项目早期先用SFI做快速验证。比如我在做某款车规级MCU时,用SFI在一天内跑了上千个故障场景,效率非常高。
SFI的优缺点:
| 优点 | 缺点 |
|---|---|
| 无需额外硬件,成本低 | 无法模拟物理层面的故障(如短路) |
| 可重复性好,自动化程度高 | 可能被操作系统或编译器优化掉 |
| 适合大规模回归测试 | 对时序敏感故障覆盖不足 |
我曾经踩过一个坑:用SFI翻转了一个关键标志位,结果编译器优化后那个变量根本没存在内存里,翻转操作完全无效。所以做SFI前,一定要确认变量没有被优化掉。
3.2 硬件故障注入(HFI)
硬件故障注入,就是真刀真枪地往芯片上搞破坏。你想想看,芯片在真实环境中可能遇到电磁干扰、电源波动、温度冲击,这些SFI模拟不了。
常见的HFI手段:
- 电磁注入(EMI):用电磁枪对准芯片特定区域打干扰
- 激光注入:用激光照射芯片内部,改变晶体管状态
- 电源毛刺:在供电线上叠加短时高电压或低电压
- 温度冲击:快速加热或冷却芯片
我记得有一次做ISO 26262认证,客户要求必须做HFI验证。我们用了电磁注入,在芯片的地址总线上打干扰,结果发现安全机制在特定频率下会失效。嗯,这个bug要是流片后才被发现,后果不堪设想。
HFI的优缺点:
| 优点 | 缺点 |
|---|---|
| 最接近真实物理故障 | 设备昂贵,一套电磁注入系统几十万起步 |
| 能覆盖时序和物理效应 | 操作复杂,需要专业工程师 |
| 认证机构认可度高 | 可重复性差,受环境因素影响大 |
我建议:HFI不要一开始就上。先用SFI把逻辑层面的问题扫一遍,再用HFI做关键路径的验证。这样既省钱又高效。
3.3 仿真故障注入
仿真故障注入,是在芯片的仿真模型上做文章。说白了,就是在RTL代码或门级网表里「动手脚」。
常见的仿真注入方式:
- force命令:在仿真器中强制改变信号值
- 故障模型植入:在RTL代码中插入故障逻辑
- 时序反标:在门级仿真中注入延迟故障
- 随机注入:用脚本随机翻转内部节点
举个例子,在Verilog仿真中,你可以这样注入一个寄存器故障:
// 正常逻辑
always @(posedge clk) begin
if (rst)
safety_counter <= 8'h00;
else
safety_counter <= safety_counter + 1;
end
// 故障注入:在第100个时钟周期强制翻转
initial begin
#1000; // 等待100个时钟周期
force tb.u_dut.safety_counter[3] = ~tb.u_dut.safety_counter[3];
#100;
release tb.u_dut.safety_counter[3];
end
仿真注入的好处是可控性极强。你可以精确到纳秒级去触发故障,还能观察内部所有信号的变化。我在做某款ADAS芯片时,用仿真注入发现了安全机制在流水线冲突时的漏洞——这个场景在真实芯片上几乎不可能复现。
仿真注入的优缺点:
| 优点 | 缺点 |
|---|---|
| 可控性极强,精度高 | 仿真速度慢,大规模芯片跑不动 |
| 可观测所有内部信号 | 需要完整的仿真模型 |
| 适合早期验证 | 无法覆盖物理效应 |
3.4 三种方法的对比与选择
这三种方法不是互斥的,而是互补的。我一般建议按这个顺序来:
- 仿真注入:RTL阶段做,快速验证安全机制的逻辑正确性
- 软件注入:FPGA或芯片回来后做,跑大规模回归测试
- 硬件注入:流片后做,用于认证和最终验证
下面这张图能帮你理清思路:
核心建议:三种方法组合使用,才能达到最高的故障覆盖率。我个人习惯是「仿真打基础,软件跑批量,硬件做验证」。
避坑指南:我曾经见过一个团队,只做SFI就宣称覆盖了90%的故障。结果认证时被审计师问住了——「你怎么证明你的软件注入能模拟真实的物理故障?」所以,该上HFI的时候千万别省。
公众号:蓝海资料掘金营,微信deep3321