第一次接触Tessent DFT工具时,很多人会被它复杂的命令和参数吓到。但别担心,就像学骑自行车一样,掌握几个核心命令后,你会发现它其实很友好。Tessent是业界领先的DFT(Design for Test)工具,主要用于芯片测试结构的插入、验证和测试模式生成。在实际项目中,我们通常从网表分析开始,这是整个DFT流程的基础。
report_gates命令是你的第一个好朋友。它能显示指定门级的网表信息和仿真结果。我刚开始用这个命令时犯过一个错误:直接对未展平的网表运行它,结果报了一堆错。后来才知道,使用前必须确保网表已经展平(flattened)。这个命令配合set_gate_report使用效果更好,后者可以定制report_gates显示的信息内容。比如你想重点关注时钟网络,可以这样设置:
tcl复制set_gate_report -type clock -detail high
report_gates -all
实际项目中,我常用这个组合来检查设计中是否存在意外的时钟门控(clock gating),这会影响后续的扫描链插入。有一次在一个28nm的项目中,就是通过这种方式发现了一个隐藏的时钟门控逻辑,避免了后期的大麻烦。
扫描链(scan chain)是DFT的核心,add_scan_chains命令就是用来管理它们的。新手常犯的错误是直接添加扫描链而不先检查现有设计。我的经验是:先用report_scan_volume评估当前设计的扫描数据量,这个命令比单纯看pattern count更能准确衡量EDT压缩效果。
记得有一次,团队里新来的工程师抱怨ATPG时间太长,我让他运行了report_scan_volume,发现他配置的扫描链长度差异太大,导致压缩效率低下。调整后,ATPG时间缩短了40%。配置扫描链时,我习惯这样操作:
tcl复制# 先查看当前扫描数据量
report_scan_volume -all
# 添加新的扫描链
add_scan_chains -name scan_chain1 -start pin1 -end pin2
add_scan_chains -name scan_chain2 -start pin3 -end pin4
# 再次检查扫描数据量变化
report_scan_volume -all
add_nonscan_instances也是个实用命令,它可以把特定实例排除在扫描插入过程外。比如某些模拟模块或存储器,我们通常不希望它们被扫描。但要注意,过度使用这个命令会影响测试覆盖率。
create_module命令看似简单,但用好它能极大提升工作效率。我习惯用它创建测试专用的模块,特别是做低功耗测试时。创建新模块后,记得用set_current_design切换当前设计上下文,否则后续操作可能会应用到错误的设计层级。
一个完整的模块创建流程通常是这样:
tcl复制# 创建新模块
create_module -name test_wrapper
# 设置为当前设计
set_current_design test_wrapper
# 添加端口
create_port -name clk -direction in
create_port -name reset -direction in
# 添加实例
create_instance -name uut -module original_design
# 连接引脚
create_connections -from clk -to uut/clk
create_connections -from reset -to uut/reset
# 保存设计
write_design -format verilog -output test_wrapper.v
create_port和create_instance命令的细节很多。比如create_port处理总线时,它会为每一位创建一个端口对象,从最高位到最低位。如果端口已存在,记得加-silent参数避免报错。
低功耗测试是现代芯片设计必须考虑的问题,set_power_control命令就是为此而生。它能启用低功耗ATPG并设置切换或捕获阈值。我建议在项目初期就设置好这些参数,而不是等到ATPG阶段才考虑。
完整的低功耗ATPG流程包括:
tcl复制report_power_metrics -patterns all
tcl复制set_power_control -switching_threshold 0.2 -capture_threshold 0.15
tcl复制run_atpg -low_power
tcl复制report_power_metrics -patterns generated
add_input_constraints命令也很关键,它用于约束输入端口到指定值。这个命令的智能之处在于它会自动应用一些推断约束(inferred constraints),比如来自ICL端口功能的约束。但要注意,如果端口设置了tessent_no_input_constraints属性,这个行为会被阻止。
在实际项目中,有几个技巧能帮你节省大量时间:
总线分析:使用analyze_bus检查总线竞争问题。有次项目后期发现总线冲突,用这个命令快速定位到了问题所在。
DFT控制点:add_dft_control_points命令可以指示工具在DFT插入期间插入控制逻辑。我习惯在DRC前运行它,能预防很多问题。
设计导出:write_design_import_script生成的脚本可以直接给综合工具使用,特别适合RTL到门级的转换。
常见问题及解决方案:
问题:ATPG模式功耗过高
解决:先用report_power_metrics识别问题模式,然后调整set_power_control参数
问题:扫描链长度不均
解决:使用report_scan_volume评估,重新平衡扫描链配置
问题:意外排除扫描实例
解决:检查add_nonscan_instances的使用,确保没有过度排除
最后,记得定期用write_design保存设计状态。有次我的Tessent会话意外崩溃,因为没及时保存,损失了几个小时的工作。现在我会在关键步骤后都保存一次。