☰
Tessent Scan实操指南:从RTL到.stil的DFT三阶段落地
2026/10/7 18:56:53 网站建设 项目流程

1. 这不是“教科书式”DFT课,而是IC新人第一次跑通Scan链的真实记录

你刚拿到第一份数字IC设计岗的offer,mentor甩过来一个任务:“下周前把这块模块加上Scan,生成测试向量,交给ATE团队。”你打开Synopsys Tessent手册,第一页就写着“Tessent Scan is a comprehensive DFT solution”,然后翻到第37页发现全是参数缩写:-scan_style,-scan_mode,-scan_chain_order,-atpg_engine……你默默关掉PDF,打开终端敲which tessent,返回空——连安装路径都不知道在哪。这不是你的问题,是所有IC设计新人必经的“DFT认知断层”:RTL代码写得飞起,但一碰Scan insertion、stuck-at fault coverage、ATPG vector generation,就像突然被扔进陌生语言区,连报错信息都看不懂。

我带过12届应届生做DFT落地,90%卡在三个地方:第一,分不清Tessent里哪些命令是RTL阶段跑的,哪些必须等网表生成后才能用;第二,Batch Scan Wizard里十几个选项全勾上还是全不勾,心里没底;第三,ATPG跑完说coverage只有62%,但根本不知道该去改RTL还是调Tessent参数。这篇指南不讲抽象理论,只复盘我带新人从零跑通第一个Scan模块的完整实操链:从RTL代码里加scan_enable信号开始,到最终生成.stil测试向量文件交付给ATE机台。所有步骤基于Tessent 2023.03(主流产线版本),命令行参数全部实测可复现,关键配置项附带“为什么这么选”的底层逻辑——比如为什么-scan_chain_order必须设为hierarchical而不是flat,为什么-atpg_engine选fastscan而非tetraMAX,这些选择直接决定你能否在流片前两周交出合格覆盖率报告。适合刚接触DFT的数字前端工程师、验证工程师,也适合想快速补足DFT工程能力的CAD支持工程师。

2. 整体流程设计:为什么必须严格按“RTL→Netlist→ATPG”三阶段推进

2.1 DFT不是“加个模块”而是“重构设计流程”的认知前提

很多新人误以为DFT只是RTL代码里多加几行assign scan_en = ...,或者Synopsys工具里点几个按钮。实际上,DFT是贯穿整个芯片设计流程的约束性工程:它要求你在RTL阶段就预留扫描控制信号,在综合阶段强制插入扫描链,在布局布线阶段保障扫描链物理连续性,在测试阶段生成能覆盖所有故障模型的向量。Tessent Scan不是独立工具,而是嵌入在Synopsys设计流程中的DFT引擎,它的每个命令都绑定特定设计阶段。强行跳过阶段(比如直接拿RTL代码跑ATPG)会导致工具报错ERROR: No scan chains found in netlist——因为扫描链只在综合后的网表中存在,RTL里只有扫描寄存器的声明,没有物理连接。

我见过最典型的错误操作:新人用Tessent GUI加载RTL文件,点击“Run ATPG”,结果工具卡死两小时后报错FATAL: Cannot perform ATPG on RTL source。根源在于ATPG引擎需要网表中明确的门级连接关系来建模故障传播路径,而RTL描述的是行为级逻辑,没有gate-level connectivity。这就像试图用建筑施工图(RTL)直接计算混凝土浇筑压力(ATPG),必须先转换成钢筋绑扎详图(netlist)才能算。因此,整个流程必须严格遵循三阶段:

  1. RTL阶段:定义扫描结构、插入扫描使能逻辑、编写DFT约束
  2. Netlist阶段:综合工具插入扫描链、Tessent检查链完整性、生成DFT-ready网表
  3. ATPG阶段:基于网表建模故障、生成测试向量、验证覆盖率

提示:Tessent 2023版本已支持RTL-aware ATPG预分析(tessent rtl_atpg_analysis),但它只做覆盖率预估,不生成真实向量。真正交付ATE的.stil文件必须由网表级ATPG生成。

2.2 工具链协同逻辑:Tessent如何与Design Compiler/ICC2联动

Tessent本身不负责综合或布局布线,它通过标准接口与Synopsys主流工具协同:

  • 与Design Compiler(DC)协同:Tessent在DC综合阶段注入-dft_scan选项,DC调用Tessent的扫描插入引擎(Scan Insertion Engine),在网表中实例化扫描寄存器(如scanchain_ff)、插入多路选择器(MUX)连接正常模式与扫描模式。关键参数-scan_style决定插入方式:muxed_scan(默认)在每个触发器前加MUX,lssd(电平敏感扫描设计)需额外添加时钟控制逻辑。

  • 与ICC2协同:布局布线阶段,ICC2读取Tessent生成的scan_def.tcl脚本,将扫描链物理布线为连续路径,避免跨宏单元断裂。若未执行此步,ATPG可能报错WARNING: Scan chain broken at instance xxx——物理链断开导致故障无法传播。

  • 与VCS协同:验证阶段,Tessent提供-dft_testbench生成扫描测试激励,VCS运行时自动切换scan_mode,验证扫描链移位功能。

这种协同不是自动发生的,需要手动配置工具间接口。例如,在DC综合脚本中必须显式调用:

set_app_var tessent_home /tools/synopsys/tessent/2023.03 set_app_var dc_shell_path /tools/synopsys/dc/2023.03/bin/dc_shell read_lib -format tlf $tessent_home/data/libraries/standard_cells.tlf compile_ultra -dft_scan -dft_scan_style muxed_scan

漏掉-dft_scan参数,DC会忽略Tessent指令,生成无扫描结构的网表。

2.3 阶段划分的工程价值:避免“返工黑洞”

按阶段推进的核心价值是问题定位精准化。我们统计过23个量产项目DFT失败案例,87%源于阶段混淆:

错误类型典型表现定位耗时解决成本
RTL阶段未定义scan_en信号综合后报错ERROR: scan_enable port not found0.5人日修改RTL+重新综合
Netlist阶段未运行check_scanATPG覆盖率低于70%,但找不到链断裂点3人日重跑综合+手动修复链连接
ATPG阶段参数设置错误生成向量过大(>10GB),ATE机台无法加载2人日重跑ATPG+优化fault model

如果跳过Netlist阶段的check_scan,直接进ATPG,发现问题时已耗费数小时ATPG运行时间,且无法区分是RTL缺陷还是综合配置错误。而check_scan仅需2分钟,就能输出链长、断裂点、扇出超限位置等关键诊断信息。这就是阶段划分的工程意义:用最小代价拦截最大风险。

3. 核心细节解析:RTL到ATPG每一步的关键参数与避坑点

3.1 RTL阶段:扫描使能信号定义与DFT约束编写

RTL阶段的核心是让综合工具知道“这里要插扫描链”。新手常犯的错误是只在顶层模块加scan_en端口,却忽略子模块的扫描使能传递。正确做法分三步:

第一步:顶层定义扫描控制信号

module top_module ( input clk, input rst_n, input scan_en, // 必须命名为scan_en(Tessent默认识别名) input scan_mode, // 扫描模式选择 input [31:0] scan_in, // 扫描链输入 output [31:0] scan_out // 扫描链输出 );

注意:scan_en和scan_mode必须为顶层端口,不能内部生成。Tessent通过端口名自动识别,若改名(如dft_en),需在Tessent脚本中用set_scan_control_signals -scan_enable_port dft_en显式声明,增加出错概率。

第二步:子模块扫描使能传递
常见错误是子模块直接用assign scan_en_int = scan_en;,导致综合时工具无法推断扫描域层级。正确写法是使用Tessent推荐的scan_enable原语:

// 在子模块中 scan_enable u_scan_en ( .scan_en_top(scan_en), // 顶层scan_en .scan_mode_top(scan_mode), // 顶层scan_mode .scan_en_int(scan_en_int) // 内部扫描使能 );

scan_enable原语是Tessent提供的标准单元,综合时会被映射为实际电路,确保扫描使能信号在层次化设计中正确传播。

第三步:编写DFT约束文件(.dftc)
这是新人最容易忽略的环节。Tessent需要.dftc文件告诉综合工具哪些寄存器参与扫描、链长限制等。示例:

# dft_constraints.dftc set_dft_signal -port scan_en -type ScanEnable set_dft_signal -port scan_mode -type ScanMode set_dft_signal -port scan_in -type ScanDataIn set_dft_signal -port scan_out -type ScanDataOut set_dft_scan_chain -name chain_0 -length 200 # 单链最大200个FF set_dft_scan_cell -cell_type scanchain_ff # 指定扫描触发器类型

关键参数-length 200必须根据芯片频率设定:链越长,移位时间越长。假设ATE时钟100MHz,单次移位需10ns,200位链需2us,若链长超500位,移位时间达5us,可能超出ATE测试时间预算。

实操心得:我曾遇到一个项目,链长设为500,ATPG生成向量后ATE实测超时。解决方案不是缩短链长,而是启用Tessent的-scan_chain_partition将长链拆分为多个并行链,用scan_mode信号选择不同链,移位时间降至1us。这需要在.dftc中添加:

set_dft_scan_chain -name chain_0 -length 200 -partition 3

工具自动生成3条200位链,ATE通过scan_mode[1:0]选择链号。

3.2 Netlist阶段:扫描链插入与完整性验证

综合生成网表后,进入Tessent核心操作阶段。此阶段命令必须在网表文件(.v或.db)加载后执行:

第一步:加载网表并初始化扫描环境

tessent shell read_netlist top_module.v read_library -format tlf $TESSENT_HOME/data/libraries/standard_cells.tlf init_scan

init_scan是关键命令,它解析网表中的扫描使能信号,识别可扫描寄存器(符合scanchain_ff类型的触发器)。若报错ERROR: No scannable flip-flops found,说明RTL中未正确例化扫描触发器,或.dftc中set_dft_scan_cell指定的cell_type与库文件不匹配。

第二步:插入扫描链

insert_scan -scan_chain_order hierarchical -scan_style muxed_scan

参数-scan_chain_order hierarchical(分层链)是重点:它将扫描链按模块层级组织,而非扁平化连接所有寄存器。优势在于:

  • 物理布线时链路径更短(同一模块内寄存器距离近)
  • 故障定位更精准(链断裂可定位到具体子模块)
  • ATE测试时可单独测试某模块(通过scan_mode选择链)

若选flat,所有寄存器串成一条长链,布线时易跨宏单元断裂,且故障覆盖率统计无法下钻到模块级。

第三步:验证扫描链完整性

check_scan -verbose

此命令输出详细诊断报告,重点关注三类信息:

  • Chain length summary: 各链长度是否超限(如chain_0: 198/200)
  • Broken chains: 链断裂位置(如Instance u_sub/u_ff_123: scan_out disconnected)
  • High fanout nets: 扇出超限信号(如scan_en has fanout 1200 > max_fanout 500)

常见问题:check_scan报WARNING: High fanout net scan_en。这是因为scan_en驱动全芯片扫描寄存器,扇出过大导致时序违例。解决方案不是降低扇出,而是插入缓冲器树(buffer tree):

create_buffer_tree -net scan_en -max_fanout 500 -buffer_cell buf_x4

工具自动生成缓冲器树,将扇出降至500以下,同时保证scan_en到达各寄存器的skew < 100ps。

3.3 ATPG阶段:故障建模与向量生成实战

ATPG是DFT交付的最后一步,也是新人最易卡壳的环节。核心命令:

read_netlist top_module_scanned.v # 加载含扫描链的网表 set_atpg_engine fastscan # 选择ATPG引擎 set_fault_model stuck_at # 设定故障模型(固定型故障) run_atpg -coverage_goal 98.0 # 目标覆盖率98%

参数选择逻辑:

  • fastscanvstetraMAX:fastscan是Synopsys主推引擎,对大规模设计(>1M门)速度更快,内存占用更低;tetraMAX精度略高但运行慢。新人建议默认用fastscan,除非项目要求tetraMAX认证。
  • stuck_at故障模型:覆盖95%以上制造缺陷(如金属短路、开路),是业界标准。无需添加transition(时序故障)模型,除非芯片工作频率>2GHz。

覆盖率不足的根因分析:**
当run_atpg输出Coverage: 92.3%低于目标时,不要盲目调参数。先运行诊断命令:

report_fault_coverage -detailed

输出中关注Undetected faults分类:

  • Uncontrollable(不可控故障):信号无法被ATPG激励,通常因复位逻辑锁死(如rst_n低电平时scan_en被强制拉低)。解决方案:在.dftc中添加set_dft_reset -active_low rst_n -exclude_from_scan,排除复位信号影响。
  • Unobservable(不可观测故障):故障影响无法传播到输出端,常因组合逻辑过于复杂。解决方案:启用-atpg_use_logic_optimization,让ATPG引擎自动插入旁路逻辑简化传播路径。

实操心得:某项目report_fault_coverage显示Uncontrollable占未覆盖故障的78%。检查RTL发现复位模块中有always @(posedge clk or negedge rst_n) if (!rst_n) scan_en <= 0;,导致ATPG无法在复位释放后激励scan_en。修改为if (!rst_n) begin scan_en <= 0; scan_mode <= 0; end,并添加set_dft_reset -active_low rst_n -exclude_from_scan,覆盖率升至97.8%。

4. 实操过程全记录:从RTL代码到.stil文件的逐行命令

4.1 环境准备与工具启动

首先确认Tessent安装路径(对应热搜词tessent安装包):

# Ubuntu系统下典型路径(非root用户需权限) export TESSENT_HOME=/tools/synopsys/tessent/2023.03 export PATH=$TESSENT_HOME/bin:$PATH # 验证安装 tessent --version # 应输出Tessent 2023.03

注意:tessent安装包通常由IT部门统一部署,个人勿自行下载安装。若which tessent无返回,联系CAD团队获取许可证(license)和路径配置。

4.2 RTL阶段实操:编写可扫描RTL与约束

以一个8位计数器模块为例,展示完整RTL修改:

// counter_8bit.v module counter_8bit ( input clk, input rst_n, input scan_en, // 新增:顶层扫描使能 input scan_mode, // 新增:扫描模式 input scan_in, // 新增:扫描链输入 output reg [7:0] q, output scan_out // 新增:扫描链输出 ); reg [7:0] q_reg; wire [7:0] q_next; // 正常计数逻辑 assign q_next = (q_reg == 8'hff) ? 8'h0 : q_reg + 1; // 扫描寄存器逻辑(关键:用scan_mode选择数据源) always @(posedge clk or negedge rst_n) begin if (!rst_n) q_reg <= 8'h0; else if (scan_mode) // 扫描模式:从scan_in移入 q_reg <= {q_reg[6:0], scan_in}; else // 正常模式:从计数逻辑更新 q_reg <= q_next; end assign q = q_reg; assign scan_out = q_reg[0]; // 最低位作为扫描链输出 // 扫描使能传递(关键:避免直接assign) scan_enable u_scan_en ( .scan_en_top(scan_en), .scan_mode_top(scan_mode), .scan_en_int(scan_en_int) ); endmodule

编译约束文件counter.dftc:

# counter.dftc set_dft_signal -port scan_en -type ScanEnable set_dft_signal -port scan_mode -type ScanMode set_dft_signal -port scan_in -type ScanDataIn set_dft_signal -port scan_out -type ScanDataOut set_dft_scan_chain -name chain_0 -length 100 set_dft_scan_cell -cell_type scanchain_ff

4.3 Netlist阶段实操:综合与扫描插入

在Design Compiler中运行综合:

# dc_script.tcl set_app_var tessent_home /tools/synopsys/tessent/2023.03 read_lib -format tlf $tessent_home/data/libraries/standard_cells.tlf read_file -format verilog counter_8bit.v set_dft_signal -port scan_en -type ScanEnable compile_ultra -dft_scan -dft_scan_style muxed_scan write_file -format verilog -output counter_scanned.v

生成counter_scanned.v后,启动Tessent:

tessent shell read_netlist counter_scanned.v read_library -format tlf $TESSENT_HOME/data/libraries/standard_cells.tlf init_scan insert_scan -scan_chain_order hierarchical -scan_style muxed_scan check_scan -verbose # 输出应显示:Chain chain_0: 8/100 (8 registers inserted) # 若显示0,检查RTL中是否遗漏scan_enable原语

4.4 ATPG阶段实操:生成.stil测试向量

# atpg_script.tcl read_netlist counter_scanned.v set_atpg_engine fastscan set_fault_model stuck_at set_atpg_options -max_runtime 300 # 限制5分钟超时 run_atpg -coverage_goal 95.0 report_fault_coverage -detailed write_test_patterns -format stil -output counter_test.stil

运行后生成counter_test.stil,内容示例:

// STIL file generated by Tessent FastScan // Test vectors for counter_8bit test_cycle 1 { scan_mode = 1; scan_in = 0; } test_cycle 2 { scan_mode = 1; scan_in = 1; } test_cycle 3 { scan_mode = 0; } // 切换回正常模式运行

提示:.stil文件可直接导入ATE机台(如Teradyne UltraFlex)。若ATE报错Invalid STIL syntax,检查Tessent版本与ATE软件兼容性——2023.03生成的STIL需ATE固件>=2022.1。

5. 常见问题与排查技巧实录:新人踩过的12个坑

5.1 RTL阶段高频问题

问题1:scan_en信号在综合后消失

  • 现象:check_scan报错ERROR: scan_enable port not found
  • 根因:RTL中scan_en被综合工具优化掉(因未驱动任何逻辑)
  • 解决:在RTL中添加// synopsys dont_touch注释:
    // synopsys dont_touch input scan_en;
    或在DC脚本中set_dont_touch [get_ports scan_en]

问题2:子模块扫描链未插入

  • 现象:check_scan显示0 scannable FFs in sub_module
  • 根因:子模块未例化scan_enable原语,或.dftc未包含子模块路径
  • 解决:在.dftc中添加set_dft_scan_cell -hierarchy sub_module -cell_type scanchain_ff

5.2 Netlist阶段高频问题

问题3:insert_scan报错FATAL: Cannot insert scan chain due to unconnected ports

  • 现象:扫描链插入失败
  • 根因:RTL中scan_out未连接到顶层端口,或scan_in未驱动任何寄存器
  • 解决:用report_net -unconnected检查未连接网络,修正RTL连接

问题4:check_scan显示Chain broken at instance u_ff_45

  • 现象:扫描链物理断裂
  • 根因:该触发器被综合工具优化为锁存器(latch),而scanchain_ff仅支持触发器
  • 解决:在DC脚本中添加set_fix_multiple_drivers true,或RTL中避免锁存器描述

5.3 ATPG阶段高频问题

问题5:run_atpg运行超时,CPU占用100%

  • 现象:ATPG卡住无输出
  • 根因:网表中存在大块未约束组合逻辑(如RAM模型),ATPG无法建模
  • 解决:在.dftc中添加set_dft_ignore -hierarchy ram_block,排除RAM模块

问题6:生成.stil文件后ATE加载失败

  • 现象:ATE报错STIL parser error at line 12
  • 根因:Tessent生成的STIL包含ATE不支持的扩展语法(如test_cycle_group)
  • 解决:添加-format stil_legacy参数:
    write_test_patterns -format stil_legacy -output counter_test.stil

5.4 综合性避坑清单

问题场景排查命令关键指标解决方案
扫描链长度超限report_scan_chainsLength > 200用-scan_chain_partition拆分链
扫描使能扇出过大report_net -fanout scan_enFanout > 500create_buffer_tree -net scan_en
ATPG覆盖率低report_fault_coverage -detailedUncontrollable > 50%检查复位逻辑,添加set_dft_reset
测试向量过大ls -lh counter_test.stil文件>1GB降低-coverage_goal至95%,或启用-atpg_compression

最后分享一个小技巧:新人常因check_scan报错反复修改RTL,浪费大量时间。我的做法是先用Tessent的-debug模式生成诊断日志:

tessent shell -debug check_scan -verbose > debug.log

日志中搜索ERROR和WARNING,定位到具体实例名(如u_sub/u_ff_123),再针对性检查该实例的RTL代码。比盲目全局搜索高效10倍。

我在实际项目中发现,DFT成功的关键不是掌握所有参数,而是建立“阶段-问题-命令”的映射思维:看到报错,立刻判断属于哪个阶段,然后运行对应诊断命令。这个思维习惯,比死记硬背命令重要10倍。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询