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元件,它通过在芯片制造后提供内部节点的访问能力,大大提高了芯片的可测试性和良率。
浙公网安备 33010602011771号