☰
Tessent PDL实战:DFT测试流程与MBIST/SSN应用
2026/10/8 15:01:08 网站建设 项目流程

任何一个用Tessent做过DFT项目的工程师,大概都有这样的经历:打开Tessent的文档,最先记住的是MBIST、SSN、Scan这些大块头关键词,可真正到了生成测试向量、调试覆盖率的阶段,几乎所有流程都会回到同一个载体——PDL。PDL的全称是Procedural Description Language,名字听起来很学术,但用大白话说,它就是Tessent用来描述“怎么测”的语言:什么时刻给时钟、什么时候拉复位、扫描链怎么装载、响应在哪个窗口采样。没有它,工具生成的测试数据就是一堆没有播放脚本的乐谱。

这篇文章我打算把Tessent的PDL好好拆一遍。不仅讲清楚它是什么、为什么需要它,还会把我在实际项目里踩过的坑、验证过的方法、调试时常用的套路都整理出来。内容主要面向刚接触Tessent的DFT工程师,也适合那些已经把Tessent跑通、但PDL部分一直靠工具自动生成、遇到问题不知道从哪里下手的同学。你可以把它当成一份从“能用”到“会用”的PDL实践笔记。

1. PDL到底是什么:Tessent测试流程的“脚本语言”

1.1 从需求说起:为什么需要描述测试流程

芯片制造出来之后,要用ATE(自动测试设备)去验证它有没有物理缺陷。ATE不会自己猜芯片该怎么工作,它需要一份明确的“动作清单”:第几个周期把某个引脚拉高,第几个周期给时钟,第几个周期检查输出。把这份“动作清单”标准化、程序化,就是PDL存在的最大理由。

我经常跟新同事打一个比方:测试向量(pattern)是一串数据,PDL是播放这些数据的“唱片机”。比如扫描链测试,你可以先算好要移入0和1的组合,但如果没有PDL去控制shift时钟和scan enable信号,这些数据根本不知道什么时候应该进入芯片、什么时候应该被观察。无论是SCAN、MBIST还是Boundary Scan,最终的测试执行都离不开类似的过程描述。

Tessent之所以把PDL单独作为一个概念提出来,是因为它要解决一个现实问题:同一个设计,在仿真阶段、在ATE阶段、在芯片返回后的硅调试阶段,测试流程必须保持一致。如果每个阶段都手工写一套时序,早晚上出偏差。PDL作为一种“过程描述语言”,尽可能把测试时序和被测对象解耦,让同一份PDL可以被Tessent Shell解析,也可以被转换成不同pattern格式去跑仿真或者上机。

1.2 PDL与Tessent Shell的分工定位

很多同学会把Tessent Shell和PDL混在一起理解,这很正常,因为我们在终端敲命令的时候,看到的都是同一个Tcl脚本环境。但它们在逻辑上是两层东西:Tessent Shell是工具的运行环境,负责加载设计库、执行命令、管理数据库;PDL则是一套基于该环境的过程化描述规范,负责定义测试流程。

用我自己的项目经验来说,Tessent Shell就像一个操作系统的shell,你可以在这套shell里面执行Tessent的所有命令;而PDL更像是一组高层的、可复用的API,专门用来描述测试器时序。比如在Shell里,你会用read_netlist去读网表,用add_clocks去定义时钟信号;而PDL里更关心的是某个测试步骤中的force、measure、capture动作在哪个周期发生。

从工程实践看,Tessent的标准做法是让工具自动生成大部分PDL。你配置好时钟、复位和测试模式之后,Tessent MBIST会自动写出内存BIST控制器的PDL,Tessent Scan也会自动写出扫描测试流程的PDL。但这不意味着工程师可以完全不去理解PDL。一旦出现仿真失败、pattern在细粒度调试时不匹配、或者需要手写自定义时序,不懂PDL就只能干瞪眼。

2. PDL的核心语法与实现原理

2.1 基础结构:过程、时序与变量

我在项目里接触到的PDL,本质上是一段Tcl脚本。它有过程定义、变量赋值、条件判断和循环,语法风格跟普通Tcl几乎一样。如果你会Tcl,上手PDL会非常快。

一个典型PDL块通常由几个部分组成:首先是变量声明,用来表示信号名、周期、位宽等信息;然后是过程定义,每个过程描述一个完整的操作序列;最后是过程调用,把定义好的测试流程串起来。Tessent的工具库里其实已经预置了很多标准过程,你在自己的脚本里更多是“调用”而不是“重新发明”。

我之所以强调“过程”这个概念,是因为PDL和普通RTL测试bench最大的不同,就是它把测试器相关的行为封装起来了。你不需要关心每一个电气细节,只需要调用类似“装载扫描链”“产生一个BIST时钟”“等待测试完成”这些高层过程。Tessent在解析这些过程时,会结合测试器的波形信息,把它展开成真实的事件序列。这也是PDL简洁又专业的原因。

2.2 常用命令集与执行逻辑

每个Tessent版本的PDL命令集大体相近,但细节会有差异。我不建议死记文档里的命令全名,更好的方式是熟悉那几条核心动作类型:

  • force:把某个信号强制为0或1,或者任意值。
  • measure:在某个时刻采样某个信号的输出值。
  • pulse:给时钟或复位信号一个脉冲。
  • wait:等若干个时间单位或周期。
  • capture:执行一次捕获操作,通常用于扫描测试的捕获阶段。
  • load_unload:执行扫描装载/卸载的流程,是扫描测试里最常用的动作之一。

我来给一段很朴素的示意代码,展示PDL看起来是什么样的(不同版本可能有修饰差异,但思路不变):

proc my_scan_shift {} { variable period 10 variable scan_en [get_port scan_en] variable clk [get_port clk] force scan_en 1 force clk 0 for {set i 0} {$i < 100} {incr i} { pulse clk $period } force scan_en 0 pulse clk $period measure scan_out }

这段代码的好处是直白:先把扫描使能拉高,连打100拍移位时钟,然后把扫描使能拉低,打一拍捕获时钟,最后采样输出。实际项目里的PDL会比这个复杂很多,因为还涉及多时钟、锁存窗口、安全隔离逻辑等,但从执行逻辑上看,无非就是这么几类动作的组合。

2.3 PDL与TCL的融合细节

PDL既然是Tcl之上的描述语言,那Tcl的杀手锏——变量替换、表达式计算、循环、数组——自然都带进来了。这在处理可配置流程时非常有用。

举个例子,我做MBIST的时候,经常需要根据内存实例的数量自动生成多个BIST控制器的测试流程。我会在Tcl里先用foreach循环遍历所有BIST控制器名称,然后为每个控制器生成一段PDL过程。这样做的好处是,项目里新增一块内存时,不需要手改PDL,只要更新配置文件再重新生成一遍。

另一个Tcl的实用之处是可以通过数组管理信号关系。比如把内存名字存为数组下标,把对应的地址、数据、控制信号名字作为数组值,后面生成PDL时统一引用。这样既减少了拼写错误,也方便后期维护。我强烈建议在大型SoC项目中这么干,否则PDL文件会膨胀到让人没法阅读。

3. PDL在MBIST和SSN场景中的实战记录

3.1 一个典型的MBIST测试流程配置

MBIST(Memory Built-In Self-Test)是Tessent里非常常用的一块,PDL在其中的角色主要是定义BIST控制器如何启动、等待、读取结果。

我之前做的一个项目里,有几十个SRAM实例,Tessent MBIST把它们分成了多个BIST域。我给每个域写一段PDL,过程很简单:先给BIST控制器复位,然后启动BIST,接着等待RUN_DONE信号拉高,最后捕获FAIL状态和故障日志。整个过程用高层过程描述,看起来比RTL testbench还要简洁。

proc run_mbist_start { } { reset_bist enable_bist wait until {run_done == 1} capture_fail_log }

当然,实际中不存在一个叫wait until的通用命令,但Tessent的PDL库里确实有类似的等待机制,可能是用循环加measure去轮询。千万别小看这个轮询,如果你的时钟或复位信号没有在变量里定义清楚,工具在生成事件时就会报一串时钟冲突错误。我在第一次跑通MBIST流程时,就花了整整两个下午在处理这类时钟定义不一致的问题。

还有一个关键点是:MBIST中的内存BIST时钟往往不是普通功能时钟,可能是独立的BIST时钟域。PDL必须明确描述BIST时钟的启动和停止时序。如果你在PDL里只定义了功能时钟,那仿真时BIST控制器可能一直处于死等状态,run_done信号永远拉不高。

3.2 通过SSN提升并行度时PDL的相应调整

SSN,全称Streaming Scan Network,是Tessent用来提升芯片测试并行度的网络架构。简单理解,它把多个测试接口的数据通过一条高速串行链路流式传输,从而减少测试引脚数量、降低测试时间。

SSN和PDL的关系非常密切,因为SSN执行测试时,需要通过PDL描述流式数据的装载、控制和捕获。跟传统扫描测试不同的是,SSN的移位过程不再是一个core独立一个shift时钟,而是多个core共享同一条串行链路。所以PDL中的移位长度、数据位宽、通道掩码都需要根据SSN配置动态计算。

我在第一次适应SSN时犯过一个错:沿用老式scan的PDL模板,没有考虑SSN协议通道,结果仿真波形里出来的数据全部串位。后来我把PDL里的位宽参数改成根据SSN配置宏动态赋值,并重新生成了标准PDL,问题才消失。这里给一个建议:在使用SSN时,尽量优先使用Tessent自动生成的PDL,不要手动去拼SSN协议的事件序列。因为SSN的状态转移非常容易出错,手动写一两个通道还行,通道一多,错误概率成倍上升。

3.3 从PDL到pattern的完整工具链

PDL不是孤立存在的,它在Tessent工具链中处于很核心的位置。简单梳理一下我常用的流程:先配置好环境变量,把Tessent的安装路径和license搞定;然后启动tessent_shell,读入库文件、门级网表,执行DFT插入或MBIST集成;接着在Shell里加载或生成PDL;最后运行ATPG生成pattern,并对pattern做仿真验证。

聊到这里,顺便回答很多新手会问的“Tessent安装包”问题。Tessent本身是商业EDA工具,安装方式一般是获取正式安装包和license文件后,在Linux服务器上解压、设置TESSENT_HOME环境变量、把$TESSENT_HOME/bin加到PATH里,然后启动工具。不要花精力去找什么破解版或绿色版,安全和稳定才是DFT工作流的第一位。

在整个流程里,PDL文件是链接“设计意图”和“最终pattern”的中间层。工具根据PDL生成pattern时,会把每个force、measure动作映射到具体的测试周期。如果你在PDL里写的时钟周期是10ns,但仿真环境里给的约束是8ns,最终生成的pattern时序就是错的,这种错误非常隐蔽,往往要到硅片测试时才会暴露出来。

4. 实操中的常见问题与排查方法

4.1 问题速查表

我在Tessent PDL调试过程中积累了一张速查表,记录遇到的问题、可能原因和解决办法。这里整理成表格,方便大家直接对照:

现象可能原因排查思路
PDL解析报错,提示命令不存在版本不匹配,或未加载对应过程库检查tessent_shell版本;用help确认命令;加载TDK标准库
仿真时所有输出都是X态PDL中时钟或复位没有明确定义确认PDL变量中的时钟名,核对时钟周期和初始电平
MBIST流程卡在wait,run_done不拉高BIST时钟未启动,或启动时序不对检查PDL中BIST时钟的pulse事件是否覆盖整个等待区间
SSN数据串位/错位SSN通道位宽配置错误用自动生成的SSN PDL,不要手写;核对channel mask
生成的pattern在仿真器里出现setup violationPDL中的时序窗口与库单元约束不匹配对比PDL的时钟沿与仿真库的时钟沿,调整force/measure的相对位置
设备上测试不稳定,时好时坏PDL中measure的采样点靠近信号跳变沿把采样点往窗口中间移动,避开竞争区
pattern文件太大,仿真时间不可接受扫描链移位次数过多或时钟周期过短考虑增加SSN并行度;优化PDL中的移位事件

这张表只是起点,真正的排查过程往往需要结合仿真波形和Tessent的调试命令一起看。

4.2 两个让我印象极深的坑

第一个坑是PDL里时钟周期和RTL仿真不一致。当时我做一个SoC级别的验证,PDL里定义的功能时钟周期是20ns,但RTL仿真环境里测试bench把时钟周期改成了10ns,结果生成的pattern在仿真时大面积出现setup和hold冲突,很多功能模块的输出变成了X态。我当时第一反应是约束文件有问题,查了半天才发现是PDL里的周期定义和测试bench不一致。后来我养成了一个习惯:每次跑流程前,先用Tcl打印出PDL里所有时钟变量的值,再和仿真环境比对,确认一致才继续。

第二个坑是SSN通道掩码漏配。某个项目里有6个core通过SSN并行测试,我沿用单core的PDL模板,结果前两个core测试正常,后面四个core的扫描输出全部和预期不符。这个问题的表象看起来像scan chain物理连接断开,但实际只是SSN的PDL通道掩码只覆盖了前两个core。改成自动生成的SSN PDL后,一切恢复正常。这件事给我的教训是:涉及多通道并行时,人脑的可靠性远不如工具自动生成,不要为了省事去复制旧脚本。

4.3 给新手的几条避坑建议

如果你想减少在Tessent PDL上浪费的时间,下面这几条建议可以帮到你:

第一,重生成胜过手写。Tessent工具可以自动生成大多数PDL,手写只在需要自定义时序或排错时使用。手写前先看看工具生成的标准PDL风格,别自己发明一套命名。

第二,学会看事件展开结果。PDL解析后,工具一般会生成展开的测试事件报告。这个报告能直接告诉你某个force在哪个周期生效、某个measure在哪个周期采样。我每次遇到怪问题时,第一件事就是看事件展开,很多模棱两可的疑问都会瞬间清晰。

第三,把变量集中管理。不要在一个超长PDL里到处散落信号名,用Tcl数组或字典统一管理信号映射。这样既方便复用,也减少拼写错误。

第四,版本要固定。Tessent版本升级后,PDL库的接口可能有变化。同一个PDL文件,在旧版本能跑,新版本不一定能跑。项目里最好统一工具版本,并保留每次生成PDL的完整环境记录。

最后,再分享一点个人体会。刚开始用Tessent时,我总觉得PDL是工具自动生成的“附属品”,只需要关心pattern结果。但踩过几次坑之后,我改变了看法:PDL才是整个DFT测试流程里最贴近“测试意图”的一层。它既是工具和ATE之间的翻译官,也是工程师检查测试时序合理性的直接抓手。愿意花时间把PDL吃透的人,后面遇到硅片调试和良率分析时,会明显比别人从容。

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

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

立即咨询