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 电源毛刺攻击防御

电源毛刺攻击,这是我最头疼的一种攻击方式。攻击者用很短的脉冲(纳秒级)叠加在电源上,让芯片内部逻辑产生瞬态错误。比如跳过一条指令、改变一个寄存器的值。

防御手段主要有三种:

  1. 片上电容阵列:在电源和地之间加一堆小电容,吸收毛刺能量
  2. 电源毛刺检测器:专门检测电压的快速变化(dv/dt)
  3. 时序冗余:关键操作重复执行,比较结果是否一致

我重点说说第二种——电源毛刺检测器。它的原理很简单:

// 电源毛刺检测器伪代码
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 小结

电压和温度监测,说白了就是给芯片装个“体温计”和“血压计”。但光有传感器不够,还得有合理的阈值、滤波、响应机制。我见过太多设计,传感器选得很好,但软件处理太粗糙,结果误报不断,最后干脆把报警功能关了——这等于把大门敞开让攻击者进来。

记住一句话:安全设计不是做给别人看的,是要真正能挡住攻击的。下次咱们聊时钟和复位相关的安全设计,那个坑更多,到时候再细说。