DFT Compiler 核心概念与实操指南
在芯片设计中,可测性设计(DFT)是确保芯片质量的关键环节。Scan Chain作为DFT的核心技术,能够将芯片内部的状态通过串行方式扫描出来,极大地提高了测试覆盖率和故障诊断能力。本文将详细介绍基于Synopsys Design Compiler(DC)的Scan插入流程,从DFT Compiler的基本概念到完整的Scan Flow,帮助读者系统掌握这一重要技能。
Scan插入是连接设计综合与制造测试的桥梁------只有正确地插入了Scan Chain,后续的ATPG(自动测试向量生成)才能高效地生成高质量的测试向量,从而在晶圆测试和封装测试中捕获制造缺陷。
一、DFT Compiler 简介
DFT Compiler是Synopsys提供的Scan Test工具,集成在Design Compiler环境中。它最大的优势在于将DFT的实现与综合流程深度融合,使得扫描链的插入对设计者来说更加透明和可控。
1.1 DFT Compiler的核心特点
• 使用Synthesis Flow进行DFT实现,使DFT工作更加透明化
• 可以在RTL阶段较早地开展DFT工作,提前发现并解决问题
• 在Scan过程中可以综合考虑时序、功耗、信号完整性等因素
• 支持Top-Down和Bottom-Up两种设计流程
1.2 工具操作模式
DFT Compiler提供两种操作方式:DC Shell(命令交互模式)和Design Vision(图形界面化模式)。其中,Design Vision特别适合用于DRC Violation的调试,可以直观地定位和解决设计问题。在实际项目中,工程师通常以TCL脚本为主,配合Design Vision进行问题排查。
1.3 命令命名规范
DFT Compiler的命令遵循统一的命名传统,便于记忆和使用:
• set_* :指定相关设置
• report_* :打印/显示相关设置
• reset_* :复位之前的设置
• remove_* :删除之前的设置
1.4 支持的设计流程
DFT Compiler支持两种主要的扫描插入流程:
• Top-Down Flow:对整个设计执行Scan Insertion,适用于较简单的模块化设计
• Bottom-Up Flow:在Block Level完成Scan Insertion,然后集成到Top Level,适用于复杂的层次化设计
此外,根据设计的不同阶段,又可分为:
• Unmapped Flow:从RTL(未映射)阶段开始Scan Insertion,此时工具同时完成综合和扫描插入
• Mapped Flow:从Gate Level(已映射)阶段开始Scan Insertion,工具仅负责扫描单元替换和扫描链串联

图:DFT Compiler 支持的 Unmapped / Mapped Flow
二、创建 Test Protocol
Test Protocol是描述Scan测试行为的"剧本",它定义了在测试模式下的信号时序关系,是整个Scan Flow的基础。创建Test Protocol是Scan Insertion前的关键准备工作。
2.1 读取设计
首先需要指定工艺库并读入设计。可以使用read_ddc或read_verilog命令读入设计文件。需要注意的是,如果读入的是RTL级别的设计,后续还需要执行compile操作;如果读入的是已经综合好的netlist,则可以直接进行后续DFT操作。
2.2 定义DFT信号 --- set_dft_signal 命令详解
set_dft_signal命令是DFT Compiler中最核心的命令之一,用于定义Test Protocol中用到的各种信号。通过该命令,我们可以识别设计中已有的端口(复用function port),避免工具直接修改设计的IO列表。
set_dft_signal \
-view <existing_dft | spec> \
-timing <clock/reset timing> \
-type <signal_type> \
-port <port_list> \
-active_state <0|1> \
-hookup_pin <pin_path>
▸ 2.2.1 -view 选项
-view选项决定DFT信号的使用场景:
• -view spec:用于DFT逻辑插入(insert_dft命令使用),是默认选项
• -view existing_dft:用于DRC检查(dft_drc命令使用)
�� 这两个视图可以简写:-view spec → -v s;-view existing_dft → -v e。使用report_dft_signal命令可以查看当前所有已定义的DFT信号。
▸ 2.2.2 定义各类型DFT信号
【Scan Clock】扫描时钟
set test_default_period 100
set_dft_signal -view existing_dft \
-type ScanClock \
-port clock -timing list 45 55
ScanClock是关键字,-timing选项指定时钟的上升沿和下降沿时刻。这是MUX类型Scan Cell最常用的时钟指定方式。
【Reset Signal】复位信号
set_dft_signal -view existing_dft \
-type Reset \
-port resetn -active_state 0
对于异步复位的寄存器,必须为其提供可控的复位信号,否则DRC检查会失败。-active_state指定高电平还是低电平有效。
【Constant Signal】常量信号
set_dft_signal -view existing_dft \
-type Constant \
-port atpgmode -active_state 1
在测试模式下,某些信号需要保持固定值才能使DRC通过。例如,指定atpgmode为固定值1,使寄存器选择DFT指定的reset信号。
【Scan Data In / Out】扫描数据输入输出
Scan In
set_dft_signal -view spec -type ScanDataIn \
-port test_si -hookup_pin U1/Z
Scan Out
set_dft_signal -view spec -type ScanDataOut \
-port test_so -hookup_pin U2/A
-hookup_pin选项可以指定额外的连接逻辑。例如指定hookup_pin后,Scan In的连接关系为:test_si → U1/Z → scan chain,而非直接相连。
【Scan Enable】扫描使能信号
同时定义 existing_dft 和 spec 两个视图
set_dft_signal -view exist -active 1 \
-type ScanEnable -port test_se
set_dft_signal -view spec -active 1 \
-type ScanEnable -port test_se \
-hookup_pin U3/Z
ScanEnable信号是最特殊的------它既需要定义为existing_dft视图(DRC检查需要),又需要定义为spec视图(Scan Insertion需要)。两个视图中必须指定一致的active状态。

图:DFT信号定义综合示例
2.3 创建与保存 Test Protocol
定义好所有DFT信号后,使用create_test_protocol命令创建Test Protocol:
create_test_protocol
-infer_asynch
-infer_clock
-capture_procedure single_clock \| multi_clock
Test Protocol一旦创建完成,建议保存下来供后续复用:write_test_protocol -output <filename>。下次使用时可以通过read_test_protocol命令直接读取,无需重新定义信号。
三、DFT DRC 检查
DRC(Design Rule Check)检查是Scan Flow中不可或缺的环节。通过DRC检查,可以及时发现设计中存在的可测性问题,避免在后期ATPG阶段才发现难以修复的缺陷。
3.1 DRC 检查的三个阶段
① RTL DRC(可选)
• 在RTL阶段进行检查,提前发现DFT设计问题
• 可加快项目进度,但会增加设计流程复杂度
• 主要检查规则:D1(时钟可控性)、D3(复位可控性)、D11
② Pre-DFT DRC(必须)
• 在创建Test Protocol之后、Scan Insertion之前执行
• 检查寄存器是否违反设计规则,确定哪些寄存器可以上Scan Chain
• 常见问题:Clock不可控、异步复位/置位信号未被控制
③ Post-DFT DRC(必须)
• Scan Insertion完成后执行
• 验证Scan Chain是否可以trace通
• 评估Scan质量及对ATPG潜在的覆盖率影响
3.2 常用DRC命令
dft_drc -verbose -coverage -sample -pre_dft
• -verbose:打印每个violation的详细信息
• -coverage:在Post-DFT DRC时进行覆盖率评估
• -sample:对fault数量进行百分比采样
• -pre_dft:强制执行Pre-DFT的DRC检查
3.3 常见设计规则
【D类规则】仅在Scan Insertion之前检查:
• D1:寄存器Clock端不可控 → 寄存器无法上chain。需检查clock定义及传递路径
• D2/D3:寄存器Set/Reset端不可控 → 寄存器不会上chain。需指定可控的set/reset信号
【C类规则】在Scan Insertion之后检查:
• C2:当所有clock关掉后,non-scan的clock/set/reset仍处于激活状态 → 易导致低test coverage
3.4 内部信号控制技巧
有时需要对设计内部信号进行控制才能使DRC通过。常用方法包括启用内部pin控制和设置信号初始值:
启用内部pins
set_dft_drc_configuration -internal_pins enable
对内部信号赋初始值
set_test_assume 0 init_reg0/Q
set_test_assume 1 init_reg1/Q
四、Scan Chain 配置
完成DRC检查并修复所有violation后,就可以进行Scan Chain的配置了。set_scan_configuration是最重要的配置命令,它是一个全局设置命令,支持20+选项,且设置是累加的。
4.1 Scan Style --- 扫描单元类型
-style选项指定扫描单元的类型,常用的两种:
• multiplexed_flip_flop(MUX-D FF):通过MUX选择功能数据或扫描数据,最常用的类型
• lssd(Level Sensitive Scan Design):电平敏感扫描设计,对时钟偏斜不敏感

图:MUX-D Flip-Flop Scan Cell 结构

图:LSSD Scan Cell 结构
4.2 Clock Mixing --- 时钟域混合策略
-clock_mixing选项控制同一条Scan Chain上是否允许多个时钟域共存:
• no_mix:不允许混合,每个clock domain独立成链
• mix_edges:允许不同触发沿在同一chain上
• mix_clocks:允许不同clock domain在同一chain上
• mix_clocks_not_edges:允许混合clock domain但不混合触发沿
对于跨clock domain的情况,通常需要增加Lock-up Latch来缓解潜在的时序问题。对于不同触发沿的情况,常用策略是:负沿触发器放在chain首,正沿触发器放在chain尾。
4.3 Chain 长度控制
• -chain_count <N>:指定Scan Chain的数量
• -max_length <N>:限制每条chain的最大长度(优先级最高)
• -exact_length <N>:尽量让chain达到指定长度(优先级最低)
优先级排序:max_length > chain_count > exact_length。默认情况下,工具会综合考虑clock-domain、clock-mixing等约束,自动计算最小chain数量。
4.4 Lock-up Latch 配置
当Scan Chain跨越不同时钟域时,需要插入Lock-up Latch来避免时钟偏斜导致的Hold Violation。相关选项包括:
• -add_lockup true|false:启用/禁用跨clock domain的lockup添加(默认true)
• -insert_terminal_lockup true|false:是否在chain尾插入lock-up(默认false)
• -lockup_type latch|flip_flop:指定lockup类型(默认latch)

图:Lock-up Latch 在跨时钟域Scan Chain中的应用
4.5 其他重要选项
• -create_dedicated_scan_ports true|false:是否创建专用scan端口(建议true)
• -internal_clocks none|single|multi:内部时钟处理方式
• -test_mode <name>:指定test mode名称,支持多种scan configuration
• -exclude_elements <list>:指定的寄存器不串入scan chain
五、Scan Preview 与 Scan Insertion
5.1 Scan Preview --- 插入前的预检查
在正式插入Scan Chain之前,强烈建议执行preview_dft命令进行预检查。Preview可以帮我们:
• 检查Scan-Path一致性,发现overlapping path问题
• 确定Scan Chain的数量和长度分布
• 查看Scan Cell的分配顺序和clock信息
• 确认scan link(连线、latch、MUX等)和scan access port
preview_dft -show all # 显示所有scan chain详细信息

图:Preview DFT 输出的 Scan Chain 信息
5.2 Scan Insertion --- 正式插入
完成所有配置和预检查后,执行insert_dft命令正式插入DFT逻辑。在插入过程中,工具会完成以下工作:
• 读取preview信息(如需要则重新运行preview_dft)
• Scan Replacement:将普通寄存器替换为带scan功能的寄存器
• 消除Contention:强制三态端口为单驱动,维护双向端口
• 插入Test Point:如启用了AutoFix,增加test-point逻辑
• Scan Stitch:将可访问的port、scan link、scan cell串联成完整chain
• Violation最小化:通过重新map或unscan减少violation
5.3 DFT Insertion 参数配置
set_dft_insertion_configuration命令可进一步控制插入行为:
• -synthesis_optimization none|all:控制是否进行cell size优化(all=全设计优化,none=仅串chain不优化)
• -preserve_design_name true|false:阻止子模块重命名(避免验证flow受影响)
• -unscan true|false:控制存在violation的flip-flop是否上chain
六、Multi-Mode DFT 多测试模式
在实际芯片测试中,不同的测试阶段(Wafer Probe、Package Test、Burn-in)对Scan Chain的访问方式、可用引脚数和ATE资源有不同的要求。因此,同一个设计中可能需要准备多种Scan架构,这就是Multi-Mode DFT。
6.1 定义 Test Mode
首先声明Test Mode引脚,然后使用define_test_mode命令定义各个模式:
声明Test Mode引脚
set_dft_signal -type TestMode -port list DBC IBN SBN -view spec
定义各模式(使用one-hot编码)
define_test_mode T0 -usage scan -encoding {DBC 0 IBN 0 SBN 0}
define_test_mode T1 -usage scan -encoding {DBC 0 IBN 0 SBN 1}
define_test_mode T2 -usage scan -encoding {DBC 0 IBN 1 SBN 0}
define_test_mode T3 -usage scan -encoding {DBC 0 IBN 1 SBN 1}
...
DFT Compiler会自动插入Test Mode译码电路,支持one-hot或二进制编码方式。不同mode可以采用不同的scan chain配置,通过set_scan_configuration的-test_mode选项来指定。

图:Multi-Mode 译码电路示例

图:不同Test Mode下的Scan Chain结构
6.2 Multi-Mode DRC 注意事项
⚠️ Post-DFT DRC不是同时对所有mode检查的,必须逐个mode运行:
current_test_mode mode_1
dft_drc
current_test_mode mode_2
dft_drc
七、Scan DEF 与物理优化
Scan Chain的物理优化是现代芯片设计中不可或缺的一环。DC完成Scan Synthesis后,通过SCANDEF文件将Scan Chain信息交付给后端工具(ICC),由ICC完成Scan Chain的物理级优化。
7.1 Physical DFT 设计流程
• Scan Synthesis在DC中完成
• 生成SCANDEF文件交付给ICC
• 在交付前使用check_scan_def验证SCANDEF文件
• ICC进行Scan Chain的re-partitioning和re-ordering
• 降低Scan连线长度、减少阻塞,提高可布线性

图:DC/ICC DFT 协作流程
7.2 什么是 SCANDEF
SCANDEF是LEF/DEF文件的一种特殊类型,它定义了Scan Chain的相关信息。SCANDEF中指定了可被后端工具re-order的"stub" scan chain------即chain segments,其边界是I/O port、Lock-up Latch或MUX。
7.3 Partition 与 Re-order
SCANDEF中定义了Partition(分区),同一Partition内的Scan Chain可以交换flop进行re-order。通过re-order和re-partition操作,后端工具可以:
• 重新排列Scan Chain中flop的顺序,使物理位置相邻的flop串在一起
• 在不同Chain之间交换flop,进一步优化连线
• 显著降低CTS crossing(从优化前的1591次降低到709次)

图:基于SCANDEF的Scan Chain Re-order 示例
八、完整命令流程汇总
下面将整个基于DC的Scan插入流程中涉及的命令按步骤汇总,方便读者在实际项目中参考使用。
|--------|-----------------------------|--------------------------------|
| 步骤 | 命令/操作 | 说明 |
| 1 | read_verilog / read_ddc | 读取设计 |
| 2 | set_dft_signal | 定义DFT信号(clock/reset/SE/SI/SO等) |
| 3 | create_test_protocol | 创建Test Protocol |
| 4 | dft_drc | Pre-DFT DRC检查 |
| 5 | set_scan_configuration | 配置Scan Chain参数 |
| 6 | preview_dft | 预检查Scan Chain信息 |
| 7 | insert_dft | 插入DFT逻辑 |
| 8 | dft_drc + report_scan_chain | Post-DFT验证 |

图:Scan Flow 命令汇总
总结
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| �� 本文要点回顾 1. DFT Compiler集成在DC中,支持Top-Down/Bottom-Up和Unmapped/Mapped多种流程。 2. set_dft_signal是定义DFT信号的核心命令,需同时关注spec和existing_dft两个视图。 3. DRC检查分三个阶段(RTL/Pre-DFT/Post-DFT),是保证Scan质量的关键。 4. set_scan_configuration提供20+选项用于精确控制Scan Chain配置。 5. Multi-Mode DFT满足不同测试阶段的需求,Post-DRC需逐mode检查。 6. SCANDEF连接DC与ICC,使后端可以优化Scan Chain的物理布线。 |
掌握基于DC的Scan插入流程,是每一位DFT工程师的基本功。建议读者在实际项目中反复练习这些命令,深入理解每个选项的含义和适用场景,才能灵活应对各种复杂的设计挑战。