面向 180nm 9TV50 工艺 / 2.5MHz 时钟的数模混合芯片 DFT 实践
工具链: Genus 20.12 (DFT + ATPG) + VCS | 项目: 多 IC 充电平台


目录

  1. DFT 概述与 Scan 基础
  2. Scan Cell 架构与选型
  3. 完整 DFT 流程概览
  4. DFT DRC 检查
  5. Synthesis + Scan Chain 插入
  6. Genus DFT 命令详解
  7. ATPG 生成 (Genus write_dft_atpg)
  8. VCS Gate-Level 仿真
  9. 180nm DFT 特殊考量
  10. DFT 策略
  11. 总结

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),使得:

  1. Shift-in:将激励数据加载到所有 SFF
  2. Capture:通过组合逻辑传播故障效应
  3. 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 网表必须在后仿中验证,确认:

  1. Shift 路径工作正常(数据能正确移入/移出)
  2. 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 输出脚本)        (下期备选)
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐