4. 电压与温度传感器监测:片上电压降检测、温度异常报警、电源毛刺攻击防御
各位同学,咱们今天聊一个很实在的话题——电压和温度监测。说实话,我在做芯片安全设计的头几年,总觉得这玩意儿就是个“保险丝”,没啥技术含量。直到有一次,我亲眼看着一块好好的芯片,被一根电源毛刺直接干报废了……嗯,从那以后,我再也不敢小看这几个传感器了。
4.1 为什么要监测电压和温度?
你想想看,芯片正常工作的时候,电压和温度都是在一个小范围内波动的。攻击者想搞破坏,最直接的办法就是破坏这个“稳定”。
常见的攻击手段有几种:
- 电压降攻击:突然拉低供电电压,让芯片逻辑出错
- 电源毛刺攻击:在正常电压上叠加一个尖峰脉冲,触发非预期行为
- 温度攻击:加热或冷冻芯片,改变半导体特性
说白了,这些攻击就是想让你芯片“不正常工作”。那我们的防御思路也很简单——一旦发现异常,立刻报警并采取保护措施。
4.2 片上电压降检测
电压降检测,说白了就是监控芯片内部的供电电压。我习惯用带滞回的比较器来做这件事。为什么?因为纯模拟的比较器太容易受噪声干扰了。
核心设计思路:设定两个阈值——上阈值和下阈值。电压正常时,输出高电平;电压跌到下阈值以下,输出低电平;电压恢复时,要超过上阈值才恢复高电平。这就是滞回,能有效防止抖动。
给大家看一个简单的Verilog代码示例,这是我当年在FPGA上验证过的:
module voltage_monitor (
input wire clk,
input wire rst_n,
input wire [11:0] adc_value, // 12位ADC采样值
output reg alarm // 报警信号
);
// 电压阈值设定(假设参考电压3.3V,ADC满量程4095)
// 下阈值:2.7V -> 2.7/3.3*4095 ≈ 3350
// 上阈值:3.0V -> 3.0/3.3*4095 ≈ 3720
parameter LOW_THRESHOLD = 12'd3350;
parameter HIGH_THRESHOLD = 12'd3720;
reg [11:0] adc_reg;
reg state; // 0:正常 1:欠压
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
alarm <= 1'b0;
state <= 1'b0;
end else begin
adc_reg <= adc_value;
case (state)
1'b0: begin // 正常状态
if (adc_reg < LOW_THRESHOLD) begin
state <= 1'b1;
alarm <= 1'b1;
end
end
1'b1: begin // 欠压状态
if (adc_reg > HIGH_THRESHOLD) begin
state <= 1'b0;
alarm <= 1'b0;
end
end
endcase
end
end
endmodule
个人经验:ADC采样频率不要太高,我一般用1kHz左右。太高了反而容易误报,因为电源本身就有纹波。另外,阈值要留余量,别卡得太死。
4.3 温度异常报警
温度监测这块,我踩过不少坑。最典型的一次,是芯片在高温环境下工作,温度传感器输出值漂移了,导致误报警。后来我加了个数字滤波,问题就解决了。
温度报警的设计要点:
- 多级报警:比如70℃警告,85℃紧急,100℃强制关机
- 滤波去抖:连续N次采样超阈值才触发,N一般取3~5
- 迟滞设计:和电压检测一样,恢复阈值要比触发阈值低几度
我常用的温度传感器接口是I2C或SPI,但要注意——攻击者可能会干扰通信总线。所以我习惯在传感器和主控之间加一个独立的看门狗,一旦通信超时,直接触发安全响应。
注意:温度传感器本身也可能被攻击。比如用激光照射传感器封装,让局部温度急剧升高。这种情况下,片上温度传感器可能来不及反应。我的建议是:在芯片不同位置布置多个传感器,做交叉校验。
4.4 电源毛刺攻击防御
电源毛刺攻击,这是我最头疼的一种攻击方式。攻击者用很短的脉冲(纳秒级)叠加在电源上,让芯片内部逻辑产生瞬态错误。比如跳过一条指令、改变一个寄存器的值。
防御手段主要有三种:
- 片上电容阵列:在电源和地之间加一堆小电容,吸收毛刺能量
- 电源毛刺检测器:专门检测电压的快速变化(dv/dt)
- 时序冗余:关键操作重复执行,比较结果是否一致
我重点说说第二种——电源毛刺检测器。它的原理很简单:
// 电源毛刺检测器伪代码
module glitch_detector (
input wire vdd, // 电源电压
input wire clk,
output reg glitch_flag
);
// 使用高速比较器检测电压变化率
// 如果dv/dt超过设定阈值,触发报警
always @(posedge clk) begin
if (dv_dt > GLITCH_THRESHOLD) begin
glitch_flag <= 1'b1;
end else begin
glitch_flag <= 1'b0;
end
end
endmodule
关键点:这个检测器必须用模拟电路实现,数字电路反应太慢。我一般用RC微分电路加比较器,响应时间可以做到几个纳秒。
4.5 综合防护策略
光有单个检测还不够,得把它们组合起来。我习惯用状态机来管理整个安全响应流程:
| 事件 | 响应动作 | 恢复条件 |
|---|---|---|
| 电压轻微下降 | 记录日志,触发警告 | 电压恢复后自动清除 |
| 电压严重下降 | 立即复位,清除敏感数据 | 需外部干预 |
| 温度超阈值 | 降低时钟频率,启动散热 | 温度回落后恢复 |
| 检测到电源毛刺 | 锁定芯片,停止所有操作 | 需重新上电 |
避坑指南:我曾经设计过一个芯片,电压检测和温度检测共用一个ADC通道。结果攻击者同时施加电压毛刺和温度变化,导致ADC采样混乱,两个检测都失效了。后来我改成独立检测通道,再也没出过问题。
4.6 小结
电压和温度监测,说白了就是给芯片装个“体温计”和“血压计”。但光有传感器不够,还得有合理的阈值、滤波、响应机制。我见过太多设计,传感器选得很好,但软件处理太粗糙,结果误报不断,最后干脆把报警功能关了——这等于把大门敞开让攻击者进来。
记住一句话:安全设计不是做给别人看的,是要真正能挡住攻击的。下次咱们聊时钟和复位相关的安全设计,那个坑更多,到时候再细说。