新闻中心

EEPW首页 > 电源与新能源 > 设计应用 > 防芯片永久损坏:面向电熔丝控制器的安全关键型 RTL 设计

防芯片永久损坏:面向电熔丝控制器的安全关键型 RTL 设计

作者: 时间:2026-06-01 来源:all about circuits 收藏

控制器一旦出现 逻辑毛刺,就可能导致昂贵的芯片永久失效。本文将介绍纵深防御式(FSM)设计、冗余电路以及基于形式化 SVA 断言的验证方案。

在片上系统(SoC)设计领域,软件可以迭代补丁、寄存器能够复位重置,这类特性早已为人熟知。但)有着完全不同的工作特性:数据一旦写入便永久不可更改。

属于一次性可编程()器件,用于存储设备唯一标识、加密根密钥、流片后工艺校准值等核心固定数据。对电熔丝进行烧写是一种物理性的不可逆操作。

image.png 

图 1 电熔丝烧写前后对比(左侧为原始状态,右侧为烧写后状态)。图片来源:Rahman 等人,基于知识共享 4.0 协议授权。

倘若控制器的 逻辑产生毛刺,误触发烧写动作,或是加载编程电压的时长超出标准,一块价值 500 美元的处理器甚至在出厂前就会彻底报废。

本文深入讲解如何设计高可靠性、可防止芯片永久损坏的电熔丝控制器 代码,详细介绍各类安全防护机制、架构,以及基于 SystemVerilog 断言(SVA)的流片前验证方案。

设计难点:衔接数字逻辑与物理永久性特性

电熔丝本质是高风险的数模混合接口电路。数字控制器需要精准控制高压(VDDQ)电平与编程时序窗口Tprog,每一步动作都必须严格按照时序执行。

电熔丝的烧写原理为:施加大电流脉冲,利用电迁移效应使导体材料发生位移。经过该物理过程后,电熔丝会从低阻的未熔断状态,永久转变为高阻的熔断状态。

下图所示的电熔丝编程 RTL 控制器,必须杜绝一切误操作,保证烧写流程准确无误。本文重点讲解架构中的第二部分()与第三部分(保护逻辑)。

image.png 

图 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 阶段全面落地纵深防御设计思路,包括严格的解锁校验机制、安全的状态机编码、冗余看门狗电路。

遵循以上设计规范,可将高风险的物理烧写流程转变为逻辑确定、安全可控的操作。搭配电熔丝行为模型与形式化断言验证,能够充分保障最终流片芯片稳定、安全,彻底规避电熔丝误熔断导致的芯片永久损坏问题。


评论


相关推荐

技术专区

关闭