• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

SFF是什么样的触发器?

芯片设计中的SFF通常指的是“Scan Flip-Flop”(扫描触发器),这是一种用于可测试性设计(DFT,Design for Testability)的特殊触发器。

Scan Flip-Flop是标准触发器(Flip-Flop)的扩展,它增加了扫描测试功能。在芯片制造后,为了测试芯片中是否存在制造缺陷,我们需要对芯片内部的逻辑进行测试。但是直接观测和控制内部触发器非常困难,因此引入了扫描设计。

Scan Flip-Flop在标准触发器的基础上增加了两个多路选择器(MUX)和一个额外的扫描输入(SI,Scan In)和扫描输出(SO,Scan Out)端口。它有两种工作模式:

正常工作模式:触发器像普通触发器一样工作,接收数据输入(D),并在时钟边沿输出到Q。

扫描测试模式:触发器接收扫描输入(SI)的数据,并将数据通过扫描链串行移位。

通过将芯片中所有Scan Flip-Flop串接成一条或多条扫描链(Scan Chain),测试时可以将测试向量串行移入所有触发器,然后捕捉触发器的响应,再串行移出进行分析。这样可以大大提高芯片内部节点的可控性和可观测性。

在RTL设计中,SFF通常由综合工具在插入DFT时自动将普通触发器替换为扫描触发器,但设计者需要确保设计满足扫描链插入的要求,例如时钟控制、复位处理等。

因此,SFF是实现芯片可测试性的一种重要设计技术。

芯片设计中的 SFF 通常指的是 Scan Flip-Flop(扫描触发器),这是可测试性设计(DFT)中的核心元件。

基本概念

SFF 是标准 D 触发器(Flip-Flop)的增强版本,增加了扫描测试功能,用于制造测试和硅后调试。

主要特征

1. 额外接口

相比普通 D 触发器:

普通 D-FF: D → | FF | → Q
           CLK ──┘

扫描 D-FF:
          ┌─── MUX ── D ──┐
          │       │       ↓
          SI   SE       | SFF | → Q
          │       │       ↑
          └─── 0 ────────┘
                 CLK ──────┘
  • SI (Scan In): 扫描数据输入
  • SE (Scan Enable): 扫描使能信号
  • Q (正常输出): 功能模式输出
  • SO (Scan Out): 扫描数据输出(通常连接到下一个 SFF 的 SI)

2. 两种工作模式

功能模式 (SE = 0)

  • 作为普通触发器工作
  • D 输入被采样到 Q 输出
  • 用于芯片正常功能

扫描模式 (SE = 1)

  • 进入测试模式
  • SI 输入被采样到 Q 输出
  • 所有 SFF 连接成扫描链

扫描链结构

      ┌─────┐    ┌─────┐    ┌─────┐
SI ─→│ SFF1 │──→│ SFF2 │──→│ SFF3 │──→ SO
     └─────┘    └─────┘    └─────┘
      CLK        CLK        CLK
       ↑          ↑          ↑
       └──────────┴──────────┘
             全局时钟

扫描测试流程

1. 移位阶段 (Shift Mode)

// 伪代码示例
SE = 1;  // 进入扫描模式
for (i = 0; i < scan_chain_length; i++) begin
    SI = test_vector[i];  // 串行移入测试向量
    apply_clock();        // 时钟触发
end

2. 捕获阶段 (Capture Mode)

SE = 0;                   // 切换回功能模式
apply_functional_inputs(); // 施加功能激励
apply_clock();            // 捕获响应

3. 移出阶段 (Shift Out)

SE = 1;  // 回到扫描模式
for (i = 0; i < scan_chain_length; i++) begin
    capture_output_from_SO();  // 移出捕获的响应
    apply_clock();            // 时钟触发
end

实际电路示例

Verilog 实现

module scan_flop (
    input  wire clk,      // 时钟
    input  wire rst_n,    // 异步复位(低有效)
    input  wire D,        // 功能数据输入
    input  wire SI,       // 扫描输入
    input  wire SE,       // 扫描使能
    output reg  Q,        // 功能输出
    output wire SO        // 扫描输出
);

    reg internal_ff;
    
    // 扫描逻辑
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            internal_ff <= 1'b0;
        end else begin
            internal_ff <= SE ? SI : D;
        end
    end
    
    assign Q = internal_ff;
    assign SO = internal_ff;  // 直接连接到下一个SFF的SI
    
endmodule

SystemVerilog 封装

// 带复位和扫描的触发器库单元
module sff_rb #(
    parameter WIDTH = 1
)(
    input  wire             clk,
    input  wire             rst_n,
    input  wire [WIDTH-1:0] d,     // 功能数据
    input  wire [WIDTH-1:0] si,    // 扫描输入
    input  wire             se,    // 扫描使能
    output wire [WIDTH-1:0] q,     // 功能输出
    output wire [WIDTH-1:0] so     // 扫描输出
);
    
    genvar i;
    generate
        for (i = 0; i < WIDTH; i = i + 1) begin : sff_array
            scan_flop u_sff (
                .clk   (clk),
                .rst_n (rst_n),
                .D     (d[i]),
                .SI    (si[i]),
                .SE    (se),
                .Q     (q[i]),
                .SO    (so[i])
            );
        end
    endgenerate
    
endmodule

DFT 流程中的角色

1. 设计阶段

# DFT 工具命令示例 (Synopsys DFT Compiler)
set_scan_configuration -style multiplexed_flip_flop
create_test_protocol
dft_drc  # 检查DFT规则
insert_dft  # 插入扫描链

2. 生成的扫描链

┌─────────────────────────────────┐
│        Scan Chain 0             │
│  SI → SFF1 → SFF2 → ... → SFFn → SO │
└─────────────────────────────────┘
┌─────────────────────────────────┐
│        Scan Chain 1             │
│  SI → SFFa → SFFb → ... → SFFz → SO │
└─────────────────────────────────┘

物理设计考虑

布局约束

# 扫描链顺序优化
set_scan_path chain_0 \
    -view existing_dft \
    -scan_data_in scan_in_0 \
    -scan_data_out scan_out_0 \
    -scan_enable scan_enable \
    -clock clk \
    -master_clock clk \
    -complete true

时序约束

# 扫描模式下的时序约束
create_clock -name scan_clk -period 100 [get_ports clk]
set_scan_path chain_0 -setup_multiplier 2.0
set_scan_path chain_0 -hold_multiplier 0.5

ATPG(自动测试向量生成)

故障模型

  • Stuck-at Fault: 固定为0或1的故障
  • Transition Fault: 跳变故障
  • Path Delay Fault: 路径延时故障

测试向量生成

# TetraMAX 命令示例
read_netlist chip.v
read_netlist -library lib.v
run_build_model chip
run_drc
add_faults -all
run_atpg -auto_compression
write_patterns scan_patterns.stil -format stil -replace

高级类型

1. 带复位的 SFF

module sff_async_reset (
    input  clk, rst_n, D, SI, SE,
    output Q, SO
);
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) Q <= 1'b0;
        else        Q <= SE ? SI : D;
    end
    assign SO = Q;
endmodule

2. 电平敏感扫描设计 (LSSD)

  • 使用两个非重叠时钟
  • 更高的测试质量,但面积开销更大

优势和挑战

优势

  • 高故障覆盖率:可达95%+的stuck-at故障覆盖率
  • 自动测试生成:ATPG工具自动生成测试向量
  • 硅后调试:支持内部状态观测和控制
  • 标准流程:成熟的EDA工具链支持

挑战

  • 面积开销:增加约10-20%的面积
  • 时序影响:MUX在关键路径上增加延时
  • 功耗:扫描移位时的高翻转率
  • 设计规则:需要满足严格的DFT设计规则

行业应用

ASIC/SoC设计

// 现代SoC的DFT集成
module soc_top (
    // 功能接口
    input  logic         clk,
    input  logic         rst_n,
    // 扫描接口
    input  logic         scan_en,
    input  logic         scan_in,
    output logic         scan_out,
    input  logic         test_mode
);

    // 内部扫描链
    logic [999:0] internal_scan_chains;
    
    // 各模块的SFF在测试模式下连接
    if (test_mode) begin
        // 重组为扫描链
        assign scan_chain_0 = {cpu_sff, mem_sff, io_sff};
    end
    
endmodule

存储器BIST集成

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│  逻辑SFF    │───▶│  存储器BIST │───▶│  逻辑SFF    │
│  扫描链     │    │  控制器     │    │  扫描链     │
└─────────────┘    └─────────────┘    └─────────────┘

调试和验证

扫描链验证

// 扫描链完整性测试
task verify_scan_chain;
    input int chain_length;
    begin
        scan_en = 1'b1;
        // 移入全1
        for (int i = 0; i < chain_length; i++) begin
            scan_in = 1'b1;
            @(posedge clk);
        end
        // 检查移出的数据
        assert(scan_out === 1'b1) else
            $error("Scan chain broken");
    end
endtask

SFF是现代芯片设计中不可或缺的DFT元件,它通过在芯片制造后提供内部节点的访问能力,大大提高了芯片的可测试性和良率。

posted on 2026-01-31 15:33  SOC验证工程师  阅读(0)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3