Scan Chain 设计与 DFT
面向 180nm 9TV50 工艺 / 2.5MHz 时钟的数模混合芯片 DFT 实践
工具链: Genus 20.12 (DFT + ATPG) + VCS | 项目: 多 IC 充电平台
目录
- DFT 概述与 Scan 基础
- Scan Cell 架构与选型
- 完整 DFT 流程概览
- DFT DRC 检查
- Synthesis + Scan Chain 插入
- Genus DFT 命令详解
- ATPG 生成 (Genus write_dft_atpg)
- VCS Gate-Level 仿真
- 180nm DFT 特殊考量
- DFT 策略
- 总结
1. DFT 概述与 Scan 基础
1.1 为什么需要 DFT
数字芯片制造过程中,工艺缺陷会导致芯片失效。DFT 的目的是在芯片中植入测试结构,使得制造后能够高效检测缺陷。
制造缺陷类型:
| 类型 | 成因 | 表现 |
|---|---|---|
| Bridge | 金属线短路 / 相邻信号连通 | 逻辑错误 / 驱动冲突 |
| Open | 金属线断裂 / via 失效 | 浮空 / 固定值 |
| Pinhole | 栅氧击穿 | 栅极漏电 / 功能失效 |
故障模型:
| 模型 | 描述 | 覆盖率目标 |
|---|---|---|
| Stuck-At (SAF) | 节点固定为 0 或 1 | > 98% |
| Transition (TDF) | 节点无法完成 0→1 / 1→0 跳变 | > 90% |
| Path Delay | 组合路径时延超标 | 关键路径 |
| Bridging | 相邻信号短路 | IDDQ 补充 |
180nm 工艺中 SAF + TDF 是量产测试核心,桥接故障通过 IDDQ 补充覆盖。
1.2 Scan 测试基本原理
每个 flip-flop 替换为 scan flip-flop (SFF),测试模式下 SFF 连接成移位寄存器链,实现内部状态的直接控制和观察。

三个阶段:
| 阶段 | SE | 功能 |
|---|---|---|
| Shift | 1 | SI → Scan_Out,逐拍移入测试向量 |
| Capture | 0 | 组合逻辑路径捕获响应 |
| Shift-out | 1 | 移出捕获结果,同时移入下一向量 |
1.3 测试覆盖率
Fault Coverage = 检测故障数 / 可测故障数 x 100%
Test Coverage = 检测故障数 / 总故障数 x 100%
量产标准: SAF > 98%, TDF > 90%
不达标: 追加向量 / 插入 test point / 改善可观性
2. Scan Cell 架构与选型
2.1 Muxed-D SFF
本设计使用 9TV50 库中的标准 SFF 单元。在功能 D 端前插入 2-to-1 MUX,SE 控制选择功能数据或扫描输入。
9TV50 SFF 选型:
| Cell | Area | 功耗 | 适用 |
|---|---|---|---|
| SDFFQX1 | 基准 | 基准 | 通用路径 |
| SDFFQX2 | 1.4x | 1.3x | 高扇出节点 |
| SDFFQX4 | 2.2x | 2.0x | 时钟网络 |
| SDFFQX1L | 0.7x | 0.6x | 低功耗非关键路径 |
180nm SFF 面积比普通 DFF 大约 10-15%,每 1K FF 约增加 150-200 门等效面积。
2.2 混合时钟沿
实际设计中经常同时有 posedge 和 negedge 触发的 FF。Genus 默认要求一条 scan chain 内的 FF 使用同一时钟沿,若要混用需显式设置:
set_db [current_design] .dft_mix_clock_edges_in_scan_chains true
原理:混合时钟沿的 FF 在 shift 阶段—posedge FF 在时钟上升沿采样,negedge FF 在下降沿采样—功能上等价于 double-edge shift。Genus 会自动在链中插入 lockup latch 保证 shift 时序正确。
若设计中同时有 posedge 和 negedge 触发的 FF,必须启用此选项。
2.3 SE 时序要求
SE 在 shift↔capture 切换时必须满足 setup/hold。SE 扇出大(连接所有 SFF),在 SDC 中需要设置:
# 约束 scan_enable 为 ideal network,Genus 会自动做 SE 树
set_ideal_network [get_ports T_scan_en]
set_drive 0 [get_ports T_scan_en]
set_clock_gating_check -setup 5 -hold 5 [get_ports T_scan_en]
3. 完整 DFT 流程概览
3.1 Genus DFT 全流程
Genus 一次性完成 DFT 插入和 ATPG 脚本输出,关键步骤顺序为:
1. 环境配置 source setVar.tcl
2. MMMC 设置 read_mmmc mmmc_scan.tcl (func_mode + scan_mode)
3. 读入 RTL read_hdl -sv -f $FILELIST_SCAN
4. DFT 配置 scan style, mix clock edges, dont_scan
5. 定义测试信号 define_test_clock/signal/shift_enable/scan_chain
6. DFT DRC 检查 check_dft_rules -advanced
7. 逻辑综合 syn_generic → syn_map
8. 连接 scan chain connect_scan_chains -auto_create ← 在 syn_map 之后
9. 生成 DFT SDC write_sdc -constraint_mode scan_mode
10. 增量优化 syn_opt → syn_opt -incremental
11. ATPG 脚本输出 write_dft_atpg -tcl -library ... -directory ...
12. 输出网表 / SDF write_hdl / write_sdf

3.2 两种运行模式
根据 run.md,Genus 通过参数选择是否插入 scan:
% genus -f scripts/syn_scan.tcl # 带 scan 的综合
% genus -f scripts/syn.tcl # 不带 scan 的功能综合
区别在于文件清单($FILELIST_SCAN vs rtl.f.eda)和 DFT 配置项:
# syn.tcl 中 DFT 全关
set_db dft_identify_test_signals false
set_db dft_identify_top_level_test_clocks false
set_db dft_auto_identify_shift_register false
3.3 MMMC 设置
使用 read_mmmc mmmc_scan.tcl 定义两种约束模式:
| 模式 | SDC | Analysis View | 用途 |
|---|---|---|---|
| func_mode | func_constraints.sdc | view_func_max / view_func_min | 功能路径 setup+hold |
| scan_mode | scan_constraints.sdc | view_scan | scan shift 路径 setup |
# mmmc_scan.tcl 关键配置
create_constraint_mode -name func_mode \
-sdc_files { scripts/func_constraints.sdc }
create_constraint_mode -name scan_mode \
-sdc_files { scripts/scan_constraints.sdc }
set_analysis_view -setup { view_func_max view_scan } \
-hold { view_func_min }
scan_mode SDC 定义独立的 scan 时钟并与功能时钟隔离:
create_clock -name "SCAN_CLK" -period 10000 [get_ports T_scan_clk]
set_case_analysis 1 [get_ports T_scanTestmode]
set_clock_groups -asynchronous \
-group [get_clocks SCAN_CLK]
功能时钟(CKSYS / I2CSCL)与 SCAN_CLK 无时序关系,Genus 通过 clock groups 自动正确处理 STA。
4. DFT DRC 检查
4.1 常见违规
Chain 插入前必须先过 DRC:
check_dft_rules -advanced > $REPORTS/${PRE_}check_dft_rules.rpt
report_dft_violations > $REPORTS/${PRE_}dft_violation.rpt
| 违规 | 场景 | 修复 |
|---|---|---|
| Uncontrollable clock | 时钟门控导致 shift 停振 | 加 bypass mux |
| Async set/reset | 异步复位在 shift 时误触发 | 加 reset disable 逻辑 |
| Tri-state conflict | 总线在 shift 时多驱动 | 加 isolation mux |
| Non-scan FF | 黑盒或 latch 未被替换 | 设 dont_scan 或手工 wrapper |
4.2 部分 DRC 失败处理策略
非关键模块的 dont_scan
I2C 模块的部分 latch 和同步器寄存器不适合 scan,在 dft_config.tcl 中排除:
# dft_config.tcl: scan chain 中排除 I2C 模块
set i2c_cells [get_cells {
u_digital_core/u_i2c_top/u_i2c_slave*
u_digital_core/u_i2c_top/u_i2c_slave_tm*
u_digital_core/u_i2c_top/u_i2c_scl2clk_sync*
u_digital_core/u_i2c_top/u_i2c_scl2clk_sync_tm*
}]
if {[llength $i2c_cells] > 0} {
foreach_in_collection cell $i2c_cells {
set_db [get_cells $cell] .dft_dont_scan true
}
}
latch stdcell 的 dont_scan
设计中例化的 latch stdcell(u_latchr_x1)不能接入 scan chain,在 dft_dont_use.tcl 中排除:
set_db [get_cells u_sccVdet/*/u_latchr_x1] .dft_dont_scan true
5. Synthesis + Scan Chain 插入
5.1 Chain 连接时机
syn_scan.tcl 最关键的流程顺序:
Phase 1 — 先做综合
syn_generic # 架构级综合
syn_map # 逻辑映射 + 同时执行 scan FF 替换
syn_map 命令会自动完成 run_dft_scan_ff_replace 的功能:识别设计中的所有 FF,将其替换为库中对应的 SFF。替换完成后设计已有 scan 能力,但 FF 之间尚未连线。
Phase 2 — 再连接 chain
connect_scan_chains -auto_create
Genus 根据 define_scan_chain 中指定的 SDI/SDO 端口,自动将各个 SFF 的 Scan_In/Scan_Out 首尾相连形成 chain。
Phase 3 — 优化
syn_opt
syn_opt -incremental
包含 scan chain 的时序优化,修复因插入 scan MUX 引入的额外延迟。
5.2 Chain 划分策略
设计的 IO 引脚有限(封装约束),scan IO 复用功能 GPIO。
单链 vs 多链:

配置参数:
| 参数 | 值 | 说明 |
|---|---|---|
| T_scan_in | 1-bit input | Scan data input |
| T_scan_out | 1-bit output | Scan data output |
| shift_enable | T_scan_en | Active high scan enable |
| max_length | 10000 | 单链最大 FF 数,足够覆盖 |
若后续测试时间预算收紧,可改为多链方案:每增加一条链需要 1 个 SDI + 1 个 SDO 引脚,测试时间与链数成反比。
5.3 DFT SDC 输出
if {$GENERATE_DFT_SDC} {
write_sdc -constraint_mode scan_mode > $OUTPUTS/${PRE_}${TOP}_scan.sdc
write_sdc -constraint_mode func_mode > $OUTPUTS/${PRE_}${TOP}_func.sdc
}
Genus 根据 MMMC 中定义的两种 constraint mode,输出对应的 SDC 供 PNR 和 STA 使用。
6. Genus DFT 命令详解
这里逐一解释 syn_scan.tcl 中 DFT 相关命令的作用。
6.1 DFT 全局配置
set_db dft_identify_test_signals true
自动识别设计中的 test mode、reset 等信号。设为 true 时 Genus 会分析设计中的信号连接,自动推断哪些是测试控制信号。
set_db dft_identify_top_level_test_clocks false
是否自动识别顶层测试时钟。OPCG 模式下需设为 true,当前设计未用 OPCG 所以为 false。
set_db dft_auto_identify_shift_register false
是否自动识别 RTL 中手动例化的 shift register 并用于 scan chain。设为 false 表示所有 scan chain 由 Genus 自动创建。
set_db dft_prefix DFT_
所有 DFT 相关新增 cell 的名称前缀,便于在网表中区分 DFT 逻辑。
set_db dft_scan_style muxed_scan
scan 结构类型。Muxed-D 是最通用的类型,每个 FF 的 D 端前插入 2-to-1 MUX,SE 控制功能数据/扫描数据选择。
set_db [current_design] .dft_mix_clock_edges_in_scan_chains true
允许一条 chain 内同时包含 posedge 和 negedge 触发的 FF。若设计中有混合时钟沿(如 core 用 posedge、接口用 negedge)必须设置此项,否则 DRC 会报错。Genus 自动插入 lockup latch 处理沿切换。
6.2 定义测试信号
define_test_clock -function dft_clock -name scan_clk -period $test_clk_period {T_scan_clk}
定义 scan 时钟。T_scan_clk 是顶层输入端口,在测试模式下作为所有 SFF 的 shift 时钟。-function dft_clock 标记它为 DFT 专用的时钟信号(非功能时钟)。
为什么需要独立的 scan_clk? 功能时钟可能经过门控(clock gating)、分频或来自模拟 IP,测试时需要可控性高的独立时钟路径。
T_scan_clk在测试模式下直接来自外部 pin,保障 shift 阶段每个 FF 都能收到时钟沿。
define_test_signal -function test_mode {T_scanTestmode} -active high
定义测试模式信号。T_scanTestmode=1 时芯片进入测试模式。Genus 据此配置 DFT 逻辑(bypass clock gating、disable async reset 等)。
define_test_signal -function async_set_reset {T_scan_rstb} -active high -scan_shift
定义异步置位/复位信号。-scan_shift 表示 shift 阶段该信号保持无效状态(不触发复位),避免 shift 过程被复位打断。
define_shift_enable -name scan_en -active high {T_scan_en}
定义 scan enable 信号。T_scan_en=1=shift 模式,T_scan_en=0=capture 模式。Genus 将此信号连接到每个 SFF 的 SE 端口。
6.3 定义 scan chain
define_scan_chain -name scan_chain \
-sdi {T_scan_in} \
-sdo {T_scan_out} \
-shift_enable scan_en \
-shared_input \
-non_shared_output \
-max_length 10000
| 参数 | 说明 |
|---|---|
-sdi / -sdo |
Scan data input / output 顶层端口 |
-shift_enable |
关联到之前定义的 scan_en |
-shared_input |
SDI 与功能输入共享引脚(GPIO 复用场景) |
-non_shared_output |
SDO 为独立输出 |
-max_length 10000 |
单链最大 FF 数 |
6.4 连接 scan chain
connect_scan_chains -auto_create
这是真正将 SFF 串联起来的命令。在前面的合成阶段(syn_generic → syn_map),Genus 完成了 FF→SFF 替换;此时执行 connect_scan_chains 将每个 SFF 的 Scan_Out 连接到下一个 SFF 的 Scan_In。
-auto_create 让 Genus 自动决定 chain 内 FF 的连接顺序,优化目标是绕线最短化。
6.5 输出 DEF
write_scandef > $OUTPUTS/${PRE_}${TOP}.def
输出 scan chain 的 DEF 描述,包含每个 SFF 在 chain 中的位置信息,供 PNR 工具(Innovus)使用。
为什么 PNR 需要 scandef? PNR 工具需要知道扫描链的连接顺序,在布局时尽量将链内相邻的 FF 放近,减少 scan chain 绕线。
7. ATPG 生成 (Genus write_dft_atpg)
7.1 ATPG = 自动测试向量生成
ATPG 的目标:生成一组测试向量(pattern),使得:
- Shift-in:将激励数据加载到所有 SFF
- Capture:通过组合逻辑传播故障效应
- Shift-out:将捕获结果移出比较
Transition 故障需要两拍:Launch (v1) → Capture (v2),两拍之间的路径延迟必须 < 时钟周期。
7.2 Genus 直接输出 ATPG 脚本
区别于传统的 DFT 流程(Genus 插入 scan chain,TetraMAX 或 FastScan 做 ATPG),这里 Genus 直接输出 ATPG 脚本:
write_dft_atpg -tcl -library $STDCELL_VERILOG -directory ${ATPG_DIR} ${TOP}
| 参数 | 说明 |
|---|---|
-tcl |
输出 Tcl 格式的 ATPG 脚本 |
-library $STDCELL_VERILOG |
stdcell verilog 库路径,用于 ATPG 仿真模型 |
-directory ${ATPG_DIR} |
ATPG 脚本输出目录 |
${TOP} |
顶层模块名 |
执行后 Genus 在 ${ATPG_DIR} 目录下生成:
${ATPG_DIR}/
├── run_atpg.tcl # 主 ATPG 运行脚本
├── ${TOP}_atpg/
│ ├── patterns/ # 生成的测试向量 (STIL/WGL/V格式)
│ ├── reports/ # 覆盖率报告
│ └── log/ # 运行日志
7.3 向量类型
| 类型 | 目标 | Capture 拍数 | 典型数量 |
|---|---|---|---|
| Stuck-At | SAF | 1 | 30-80 |
| Transition | TDF | 2 | 80-200 |
| IDDQ | Bridge | 0 (steady) | 10-30 |
7.4 ATPG 覆盖率报告
# ATPG timing estimate
SFF total : ~1,000
Chain count : 1 (single chain)
Chain length : 1,000
Shift clock : scan_clk @ 10MHz (period 100ns)
SAF patterns : ~47
TDF patterns : ~142
SAF coverage : > 99%
TDF coverage : > 91%
Test time : ~12ms @ 10MHz shift
8. VCS Gate-Level 仿真
DFT 网表必须在后仿中验证,确认:
- Shift 路径工作正常(数据能正确移入/移出)
- Capture 路径时序正确(组合路径延迟满足)
8.1 编译 DFT 网表
# 使用 write_dft_atpg 生成的 testbench
vcs -full64 -f dft_outputs/chip_dft.f \
+define+SCAN_TEST \
atpg_dir/chip_atpg/testbench.v \
-o simv_dft \
-l vcs_dft.log \
-debug_pp
./simv_dft -l simv_dft_run.log
8.2 SDF 反标检查
# VCS log 中确认 SDF 反标成功
grep "SDF Backannotation" vcs_dft.log
grep "Warning" vcs_dft.log | grep "SDF" | head -5
后仿一般做 max delay(setup 检查)和 min delay(hold 检查)两个 corner。
9. 180nm DFT 特殊考量
9.1 Shift 频率选择
2.5MHz 功能时钟下,scan shift 频率的选择权衡:
| 选项 | Shift 频率 | 测试时间 | 风险 |
|---|---|---|---|
| 1x | 2.5 MHz | ~50ms | 低,但是慢 |
| 2x | 5.0 MHz | ~25ms | 低 |
| 4x | 10 MHz | ~12ms | 需检查 shift path 延迟 |
syn_scan.tcl 中 test_clk_period 设为 10000 (ns = 10us → 100kHz),这是保守值。实际量产时可提高 shift 频率。180nm 组合延迟通常 < 50ns,10MHz shift 有充足余量。
9.2 模拟 IP 边界
设计中的 ADC / NTC / QRB 等模拟 IP 的数字接口需特殊 DFT 处理:
| 模拟 IP | 数字信号类型 | DFT 策略 |
|---|---|---|
| ADC | Digital result bus | Shift 时保持,capture 时采样 |
| NTC | 温度阈值数字输出 | Shift 时保持 |
| QRB | 快速充电路径控制 | Test MUX bypass |
// DFT isolation: ADC output held during shift
assign adc_data_test = scan_mode ? '0 : adc_data_func;
9.3 IDDQ 测试
180nm 的漏电功耗占比 < 10%,IDDQ 对桥接故障和栅氧缺陷敏感:
IDDQ 要求: 1) 稳态帧(无翻转) 2) 量测电源电流
向量数: 10-30,与 SAF 共享
9.4 Shift 功耗
功能模式 FF 切换率: ~30%
Shift 模式 FF 切换率: 100%
动态功耗: ~2-3x 功能模式
180nm 漏电占比 < 10%
降低 shift 频率是最简单的降功耗手段。syn_scan.tcl 中 period 10000 已足够保守。
10. DFT 策略
10.1 模块风险评估
| 模块 | Function | DFT 关注点 | 等级 |
|---|---|---|---|
| I2C | 数字配置接口 | 双向 IO,含 latch,设为 dont_scan | 低 |
| ADC | 模拟→数字 | 数字输出需 isolation | 高 |
| SCC | 充电控制 | FSM 可观性 | 中 |
| ENB | 使能矩阵 | 多扇出 set/reset | 低 |
| ExtFET | 外驱 FET | IO 测试需 loopback | 中 |
| INT | 中断输出 | 开漏 pull-up 测试 | 低 |
| NTC | 温度阈值 | 模拟输入边界 | 高 |
| QRB | 快充路径 | 时序关键,bypass mux | 中 |
10.2 推荐 DFT 配置

10.3 测试引脚
| 功能 | 顶层端口 | 方向 |
|---|---|---|
| Scan clock | T_scan_clk | Input |
| Scan mode | T_scanTestmode | Input (active high) |
| Scan reset | T_scan_rstb | Input (active high) |
| Scan enable | T_scan_en | Input (active high) |
| Scan data in | T_scan_in | Input |
| Scan data out | T_scan_out | Output |
10.4 测试时间估算
DFT timing estimate
─────────────────────────────────
SFF total : ~1,000
Chain count : 1
Chain length : 1,000
Shift clock : test_clk_period (10000ns / 100kHz)
SAF (~50 patterns):
shift = 1001 x 10000ns x 50 = 500.5 ms
capture = 1 x 400ns x 50 = 0.02 ms
TDF (~150 patterns):
shift = 1001 x 10000ns x 150 = 1.5 s
capture = 2 x 400ns x 150 = 0.12 ms
Grand total ≈ 2s (保守估计 @100kHz shift)
降低 shift 频率到保守值(100kHz)是以测试时间为代价。若将 shift 频率提高到 10MHz,测试时间可压缩到 ~12ms。量产时建议根据 ATE 机台能力调整 shift 频率。
11. 总结
DFT Checklist
- DFT DRC pass(clock gating bypass, async reset disable)
- Scan chain inserted,chain 连接正确
- dft_config.tcl 中排除非扫描模块(I2C latch)
- dft_dont_use.tcl 中排除 latch cell
- ATPG SAF > 98%, TDF > 90%(Genus write_dft_atpg)
- VCS gate-level sim with SDF passed
- MMMC: func_mode + scan_mode 两种约束模式正确
- DEF 输出向 PNR 正确传递 chain 信息
各命令要点回顾
| 命令 | 作用 | 执行时机 |
|---|---|---|
define_test_clock |
定义 scan 时钟 | Chain 连接前 |
define_test_signal |
定义 test_mode / async_set_reset | Chain 连接前 |
define_shift_enable |
定义 scan enable | Chain 连接前 |
define_scan_chain |
定义 SDI/SDO 端口和 chain 参数 | Chain 连接前 |
check_dft_rules |
DRC 检查 | 插入前 + 插入后 |
connect_scan_chains |
真正将 SFF 串联 | syn_map 之后 |
write_scandef |
输出 DEF 给 PNR | Chain 连接后 |
write_dft_atpg |
输出 ATPG Tcl 脚本和向量 | 综合完成 |
write_sdc -constraint_mode scan_mode |
输出 scan 模式 SDC | 综合完成 |
与之前文章的关系
静态时序分析 (STA)
│
├──> 低功耗设计方法学
│
└──> CDC 同步器 ──> Scan Chain (DFT) ← 本文
│
┌─────────┴──────────┐
│ │
ATPG 运行 复位设计 (RDC)
(Genus 输出脚本) (下期备选)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)