防芯片永久损坏:面向电熔丝控制器的安全关键型 RTL 设计
电熔丝控制器一旦出现 RTL 逻辑毛刺,就可能导致昂贵的芯片永久失效。本文将介绍纵深防御式有限状态机(FSM)设计、冗余看门狗电路以及基于形式化 SVA 断言的验证方案。
在片上系统(SoC)设计领域,软件可以迭代补丁、寄存器能够复位重置,这类特性早已为人熟知。但电熔丝(eFuse)有着完全不同的工作特性:数据一旦写入便永久不可更改。
电熔丝属于一次性可编程(OTP)器件,用于存储设备唯一标识、加密根密钥、流片后工艺校准值等核心固定数据。对电熔丝进行烧写是一种物理性的不可逆操作。
图 1 电熔丝烧写前后对比(左侧为原始状态,右侧为烧写后状态)。图片来源:Rahman 等人,基于知识共享 4.0 协议授权。
倘若控制器的 RTL 逻辑产生毛刺,误触发烧写动作,或是加载编程电压的时长超出标准,一块价值 500 美元的处理器甚至在出厂前就会彻底报废。
本文深入讲解如何设计高可靠性、可防止芯片永久损坏的电熔丝控制器 RTL 代码,详细介绍各类安全防护机制、有限状态机架构,以及基于 SystemVerilog 断言(SVA)的流片前验证方案。
设计难点:衔接数字逻辑与物理永久性特性
电熔丝本质是高风险的数模混合接口电路。数字控制器需要精准控制高压(VDDQ)电平与编程时序窗口Tprog,每一步动作都必须严格按照时序执行。
电熔丝的烧写原理为:施加大电流脉冲,利用电迁移效应使导体材料发生位移。经过该物理过程后,电熔丝会从低阻的未熔断状态,永久转变为高阻的熔断状态。
下图所示的电熔丝编程 RTL 控制器,必须杜绝一切误操作,保证烧写流程准确无误。本文重点讲解架构中的第二部分(有限状态机)与第三部分(保护逻辑)。
图 2 电熔丝编程 RTL 控制器整体架构。图片来源:Shashikiran Sampathkumar。
高可靠 RTL 设计:纵深防御体系
为避免误烧写,我们在 RTL 代码中搭建多层防护逻辑,确保仅在收到人为指令、流程顺序合法、逻辑校验通过的前提下,才会执行熔断操作。
第一层防护:二次验证解锁序列
最核心的防护机制是密钥解锁校验。单纯的单比特信号极易受噪声、宇宙射线影响发生电平翻转,进而误触发编程状态。因此系统必须先向安全寄存器写入一组唯一的固定密钥,解锁功能后,烧写操作才会被允许。
第二层防护:有限状态机采用汉明码 / 格雷码编码
如果有限状态机采用普通顺序编码(00、01、10、11),单个比特翻转就可能造成状态跳转异常,例如直接从空闲态跳转到熔断态。设计中我们选用汉明距离更大的编码方式或格雷码,同时设置专属错误安全态,捕获所有非法状态跳转。
第三层防护:冗余硬件定时器(看门狗)
编程脉冲时长Tprog至关重要,超时会造成电熔丝单元过热,甚至损坏周边电路。除主计时计数器外,额外增加独立的冗余硬件看门狗:无论有限状态机处于何种状态,一旦编程时长超出最大阈值,看门狗会强制拉低编程使能信号。
基于 SystemVerilog 实现有限状态机
下文实现了一款六状态有限状态机,完整管控电熔丝烧写的全流程。 (附代码模块:电熔丝控制状态机,包含时钟、复位、密钥输入、编程指令、计时完成等输入端口,以及熔断使能、定时器启动、状态输出等端口)
安全型状态编码
采用汉明距离为 2 的类独热编码,定义六个工作状态:空闲态、解锁态、准备态、熔断态(核心编程状态)、校验态、错误安全态。同时定义固定解锁密钥0xACE0FACE。
状态寄存器逻辑
系统复位时进入空闲态;一旦看门狗触发,强制跳转至错误安全态;其余时刻根据逻辑流转至下一状态。
次态与输出组合逻辑
·空闲态:仅当输入密钥与预设密钥完全匹配时,才进入解锁态;
·解锁态:收到明确编程指令后,进入准备态;
·准备态:启动定时器,时序达标后进入熔断态;
·熔断态:拉高熔断使能信号执行烧写,计时结束后进入校验态;
·校验态:等待时序稳定,完成后回到空闲态;
·错误安全态:锁定当前状态,必须整机硬复位才能退出;
·默认分支:所有非法状态编码均跳转至错误安全态。
冗余看门狗逻辑
量产设计中该模块为独立计数器,当熔断使能信号持续时长超出允许范围时,触发看门狗告警信号。
以下代码我们将在SystemVerilog实现一个6状态的有限状态机,负责管理编程操作的安全生命周期:
module efuse_ctrl_fsm (
input logic clk,
input logic rst_n,
input logic [31:0] magic_key_in, // APB/SPI input
input logic prog_cmd,
input logic timer_done,
output logic burn_en, // To fuse macro
output 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 state
VERIFY = 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) begin
if (!rst_n)
state <= IDLE;
else if (watchdog_kill)
state <= ERROR_SAFE; // Watchdog override
else
state <= next_state;
end
// ----------------------------
// Next-State & Output Logic
// ----------------------------
always_comb begin
next_state = state;
burn_en = 1'b0;
timer_start = 1'b0;
fsm_status = state;
case (state)
IDLE: begin
// Advance only on valid unlock key
if (magic_key_in == EFUSE_UNLOCK_KEY)
next_state = UNLOCK;
end
UNLOCK: begin
// Explicit program command required after unlock
if (prog_cmd)
next_state = SETUP;
end
SETUP: begin
timer_start = 1'b1; // Allow VDDQ to settle
if (timer_done)
next_state = BURN;
end
BURN: begin
burn_en = 1'b1; // Trigger analog burn
timer_start = 1'b1;
if (timer_done)
next_state = VERIFY;
end
VERIFY: begin
// Post-burn settling; return to IDLE when done
if (timer_done)
next_state = IDLE;
end
ERROR_SAFE: begin
// Trap state — requires full hardware reset to exit
next_state = ERROR_SAFE;
end
// Catch-all: any illegal encoding goes to safe state
default: next_state = ERROR_SAFE;
endcase
end
// ----------------------------
// 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 测试序列)
基于 UVM 平台设计测试用例,注入各类异常故障:
信号毛刺测试:在编程指令、解锁密钥信号上注入单周期毛刺,状态机必须保持在空闲态,不触发任何动作;
熔断过程复位测试:熔断使能信号有效期间执行系统复位,模型需确认熔丝状态未被异常改写,同时控制器逻辑可安全复位。
基于 SystemVerilog 断言 (SVA) 的形式化验证
对于电熔丝控制器这类安全关键电路,形式化断言验证是最优选择。区别于传统动态仿真,断言可以从逻辑上严格证明:在设计约束范围内,危险工况绝对不会发生。以下是两款必备的核心断言。
断言 1:熔断动作必须经过合法解锁流程
用于证明:熔断使能信号burn_en拉高前,系统必须完成完整的解锁校验。 代码定义解锁完成标识,并通过属性约束:只要熔断使能有效,此前若干周期内必然存在合法解锁动作。一旦违规,仿真直接抛出严重安全错误。
// Interface signal to detect when the unlock sequence was valid
logic 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 setup
endproperty
assert_no_unlocked_burn: assert property (p_no_burn_without_unlock)
else $error("CRITICAL SAFETY VIOLATION: burn_en asserted without prior valid unlock sequence!");
断言 2:编程时长上限校验
用于证明:熔断使能信号的持续时长不会超过硬件规格最大值。 设定最大编程周期参数,通过属性约束:熔断使能信号拉高后,必须在指定周期内拉低。若超时,判定为时序违规,提示熔丝存在永久损坏风险。
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);
endproperty
assert_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.");
总结
电熔丝设计集中体现了在数字 SoC 中集成模拟功能的高难度与高风险。针对这类电路,必须在 RTL 阶段全面落地纵深防御设计思路,包括严格的解锁校验机制、安全的状态机编码、冗余看门狗电路。
遵循以上设计规范,可将高风险的物理烧写流程转变为逻辑确定、安全可控的操作。搭配电熔丝行为模型与形式化断言验证,能够充分保障最终流片芯片稳定、安全,彻底规避电熔丝误熔断导致的芯片永久损坏问题。









评论