RTL 中的一个毛刺就可能导致 eFuse 控制器意外编程,从而永久砖掉昂贵的硅芯片。本文深入探讨防御纵深(Defense-in-Depth)的 FSM 设计、冗余看门狗以及形式化 SVA 验证策略。
在 SoC 设计领域,我们习惯了软件的可修改性和寄存器的可复位性——发现 Bug 就能打补丁。然而,电子熔丝(eFuse)却遵循完全不同的原则:永久性。
eFuse 是一次性可编程(OTP)元件,用于存储关键且不可更改的数据,例如唯一设备 ID、密码学根密钥,或后硅制造微调值。编程 eFuse 是一个物理破坏性事件,如图 1 所示。

图 1:eFuse 熔断前(左)与熔断后实物示意,图片基于知识共享协议 CC4.0 授权,取自 Rahman 等人文献
如果你的 RTL 控制器出现毛刺,意外触发烧录或使编程电压施加时间过长,你可能会在芯片还没出厂前,就永久砖掉一块价值 500 美元的处理器。
本文将深入讲解如何为 eFuse 控制器设计防砖机(bricking-proof) 的稳健 RTL,包括必要的安全机制、有限状态机(FSM)构建,以及使用 SystemVerilog Assertions(SVA)进行的关键前硅验证策略。
挑战:连接数字逻辑与物理永久性
eFuse 本质上是一个高风险的模数接口。数字控制器必须精确管理涉及高压(VDDQ)和特定时序窗口(
eFuse 通过施加高电流脉冲实现编程,该过程称为电迁移(electromigration)——电流导致导电材料发生迁移,从而将熔丝从低阻态(未烧断)永久变为高阻态(已烧断)。

图 2.用于 eFuse 编程的 RTL 控制器系统视图
稳健 RTL 设计:防御纵深
为防止意外编程,我们在 RTL 中采用多层保护逻辑。只有当有意下达命令、经过正确时序且经过数学验证后,才允许“烧录”操作。
第 1 层:双敲门(Double-Knock)解锁序列最关键的保护机制是要求写入特定的多比特“魔术密钥”(Magic Key)。由于噪声或宇宙射线导致的单个比特翻转,绝不能让控制器进入编程状态。系统必须向安全寄存器写入唯一且确定的模式后,才能使能编程。
第 2 层:FSM 状态采用 Hamming / Gray 编码如果 FSM 使用顺序编码(00、01、10、11),单个比特翻转就可能导致状态错误跳转(如从 IDLE 直接跳到 BURN)。我们采用具有更高汉明距离(Hamming distance)的编码或 Gray 码,并设置默认的“Error”安全状态来捕获所有非法跳转。
第 3 层:冗余硬件定时器(Watchdog)编程脉冲宽度(
用 SystemVerilog 实现 FSM
以下是一个 6 状态 FSM 的实现示例,涵盖了“双敲门”解锁(需同时满足 EFUSE_UNLOCK_KEY 和 prog_cmd)、Gray 相邻编码,以及 watchdog_kill 强制跳转到 ERROR_SAFE 状态。
module efuse_ctrl_fsm (input logic clk,input logic rst_n,input logic [31:0] magic_key_in, // APB/SPI inputinput logic prog_cmd,input logic timer_done,output logic burn_en, // To fuse macrooutput logic timer_start,output logic [2:0] fsm_status);// ----------------------------// Safety-Critical FSM Encoding// (Hamming-distance-2 one-hot-like encoding)// ----------------------------typedef enum logic [2:0] {IDLE = 3'b000,UNLOCK = 3'b011,SETUP = 3'b110,BURN = 3'b101, // Critical programming stateVERIFY = 3'b111,ERROR_SAFE = 3'b001} efuse_state_e;efuse_state_e state, next_state;logic watchdog_kill;// Unlock key (0xACE0FACE)localparam logic [31:0] EFUSE_UNLOCK_KEY = 32'hACE0FACE;// ----------------------------// State Register// ----------------------------always_ff @(posedge clk or negedge rst_n) beginif (!rst_n)state <= IDLE;elseif (watchdog_kill)state <= ERROR_SAFE; // Watchdog overrideelsestate <= next_state;end// ----------------------------// Next-State & Output Logic// ----------------------------always_comb beginnext_state = state;burn_en = 1'b0;timer_start = 1'b0;fsm_status = state;case (state)IDLE: begin// Advance only on valid unlock keyif (magic_key_in == EFUSE_UNLOCK_KEY)next_state = UNLOCK;endUNLOCK: begin// Explicit program command required after unlockif (prog_cmd)next_state = SETUP;endSETUP: begintimer_start = 1'b1; // Allow VDDQ to settleif (timer_done)next_state = BURN;endBURN: beginburn_en = 1'b1; // Trigger analog burntimer_start = 1'b1;if (timer_done)next_state = VERIFY;endVERIFY: begin// Post-burn settling; return to IDLE when doneif (timer_done)next_state = IDLE;endERROR_SAFE: begin// Trap state — requires full hardware reset to exitnext_state = ERROR_SAFE;end// Catch-all: any illegal encoding goes to safe statedefault: next_state = ERROR_SAFE;endcaseend// ----------------------------// Simplified Redundant Watchdog// In production this is a separate counter module; watchdog_kill asserts// if burn_en stays high longer than the permitted burn window.// ----------------------------endmodule
验证策略:验证“不可测试”的部分
由于熔丝一旦烧断就无法复位,前硅验证必须极其严谨。
熔丝宏的行为模型验证环境中的关键部分是一个 Verilog 行为级熔丝阵列模型。该模型需在多次仿真之间保持状态(已烧/未烧),并记录每个比特的累积编程时间。若检测到同一比特被重复编程,或累积
动态验证(UVM Sequences)在 UVM 环境中,测试序列需超越常规寄存器访问,必须注入错误情况:
- 毛刺注入
在 prog_cmd 或 magic_key_in 信号上引入单周期毛刺,FSM 必须保持在 IDLE 状态不动。 - 烧录中复位
在 burn_en 为高期间强制系统复位。行为模型需验证熔丝状态变为“不确定”,但控制器逻辑能安全复位。
使用 SVA 形式化验证安全性
形式验证(Formal Verification)特别适合 eFuse 控制器这类安全关键逻辑。SVA 可以数学证明在设计约束下,危险情况不可能发生。
关键 SVA 示例:
burn_en 必须经过解锁
// Interface signal to detect when the unlock sequence was validlogic unlock_sequence_complete;assign unlock_sequence_complete = (state == UNLOCK) && (magic_key_in == EFUSE_UNLOCK_KEY);// ASSERTION 1: No burn without prior unlock// If burn_en is high, then unlock_sequence_complete MUST have been true// at some point in the previous 'N' cycles.property p_no_burn_without_unlock;@(posedge clk) disable iff (!rst_n)burn_en |-> $past(unlock_sequence_complete, 2); // Example delay for setupendpropertyassert_no_unlocked_burn: assert property (p_no_burn_without_unlock)else $error("CRITICAL SAFETY VIOLATION: burn_en asserted without prior valid unlock sequence!");
localparam T_PROG_MAX_CYCLES = 1000; // Example spec limit// ASSERTION 2: Maximum programming duration limit// Once burn_en is high, it MUST return low within T_PROG_MAX_CYCLES.property p_burn_duration_limit;@(posedge clk) disable iff (!rst_n)$rose(burn_en) |-> strong(##[1:T_PROG_MAX_CYCLES] !burn_en);endpropertyassert_burn_duration_limit: assert property (p_burn_duration_limit)else $error("MAX TIMING VIOLATION: burn_en exceeded T_PROG_MAX_CYCLES! The fuse is bricked.");
总结
eFuse 设计是数字 SoC 中集成模拟功能时复杂度与风险并存的典型代表。我们必须在 RTL 中应用防御纵深原则,包括严格的解锁序列、安全的 FSM 编码以及冗余看门狗。
遵循这些指南,我们能将一个本质上高风险的过程转化为确定性、安全的操作。结合行为级宏模型和形式化验证,我们可以自信地交付强大、安全、且真正防砖机 的最终硅芯片。
原文:
https://www.allaboutcircuits.com/technical-articles/bricking-proof-designing-safety-critical-rtl-for-efuse-controllers/
