☰
Tessent IJTAG中SIB与TDR协同机制及分区网络配置实践
2026/10/7 13:52:41 网站建设 项目流程

芯片测试领域有个很现实的问题:当设计规模从几百万门膨胀到几十亿门,片上需要观测和控制的测试点数量会呈指数级增长。如果还沿用早期那种"一根线接一个点"的直连思路,光是布线就能把后端工程师逼疯,更别提时序收敛和面积开销了。Tessent IJTAG这套机制就是为解决这个矛盾而生的,而其中**SIB(Segment Insertion Bit)和TDR(Test Data Register)**这两个基础构件,是把杂乱无章的测试网络整理成分区清晰、可寻址、可扩展结构的关键。这篇内容面向已经接触过DFT基础概念、正在用Tessent搭建或维护IJTAG网络的工程师,重点讲清楚SIB和TDR到底怎么配合、分区网络为什么这样设计、以及实际配置时容易踩的坑。

1. 从"手动连线"到"网络分区":IJTAG要解决的真实痛点

1.1 直连式测试网络的三个死结

早期做DFT,很多团队的做法是把每个需要控制的测试点直接引到顶层端口,或者用简单的多路选择器做选择。设计小的时候没问题,一旦规模上去,三个问题会同时爆发。

第一个是布线资源。每个测试点都要一条独立路径通向访问端口,几十亿门的芯片上测试点动辄上千个,这些线在版图上横穿整个芯片,占用大量金属层资源,还会和功能逻辑抢布线通道。第二个是时序。长距离的测试信号路径会引入延迟,在高速时钟域下很难满足建立保持要求,后端反复迭代也未必收敛。第三个是可扩展性。每加一个测试点就要改一次顶层连接,验证和回归的成本随规模线性甚至超线性增长。

这三个死结的本质是:测试访问没有做层次化和寻址化。功能逻辑早就用总线、用地址来访问了,测试网络却还停留在"点对点"的原始阶段。

1.2 IJTAG的层次化思路

IJTAG(Internal JTAG,IEEE 1687标准)的核心思想,是把测试网络组织成一棵可寻址的树。顶层通过一个访问端口(通常是TAP控制器)进入,往下每一层通过SIB来决定"要不要打开这条支路",打开之后里面的TDR就挂到了扫描链上,可以读写数据。

打个比方,这就像一栋大楼的配电系统。你不会从总闸拉一根线到每个房间的每个插座,而是总闸到楼层配电箱、配电箱到房间、房间到插座,每一级都有开关控制通断。SIB就是那个"开关",TDR就是"插座上的设备"。要访问某个设备,就沿着路径把对应的开关依次打开,形成一条从总闸到设备的通路。

这种结构带来的直接好处是:测试点数量增加时,只需要在对应层次挂新的SIB和TDR,顶层连接几乎不用动。布线是局部的,时序是分段的,扩展是增量的。

1.3 分区到底分的是什么

标题里说的"网络分区",分的不是物理区域,而是逻辑访问域。一个分区通常对应一个功能模块、一个IP核、或者一组需要协同控制的测试点。每个分区有自己的SIB作为入口,分区内部可以再嵌套子分区。

分区的粒度需要权衡。分得太粗,一个分区里塞太多TDR,扫描链变长,访问延迟大;分得太细,SIB数量增多,打开路径的步骤变多,控制复杂度上升。实际项目中,通常按时钟域和功能边界来划分,让同一个分区内的测试点共享相似的访问时序要求。

2. SIB的工作机制:一个比特如何控制一条支路

2.1 SIB的本质是一个带扫描位的开关

SIB全称Segment Insertion Bit,直译是"段插入位"。它的物理形态很简单:一个多路选择器加一个扫描触发器。触发器的值决定多路选择器是"旁路"还是"插入"。

  • 当SIB的值为0时,信号走旁路通道,这条支路被跳过,支路内部的TDR不参与当前扫描链。
  • 当SIB的值为1时,信号走插入通道,支路被接入,支路内部的TDR成为扫描链的一部分。

这个设计精妙的地方在于:SIB本身也是扫描链上的一个位。你要控制它,不需要额外的控制端口,只需要在扫描数据流里把它对应的那一位写成1或0。这就实现了"用数据流控制数据流路径"的自举效果。

2.2 打开一条路径的完整过程

假设要从顶层访问某个深层TDR,路径上经过了SIB_A、SIB_B、SIB_C三个开关。操作过程是这样的:

  1. 先把扫描链配置成"只包含SIB_A"的状态,扫描写入1,把SIB_A打开。
  2. 此时扫描链自动延伸,包含了SIB_A后面的SIB_B,再扫描写入1,把SIB_B打开。
  3. 扫描链继续延伸,包含SIB_C,写入1打开。
  4. 现在目标TDR已经接入扫描链,可以正常读写它的数据。

这个过程叫路径建立(path establishment)。注意每一步扫描链的长度都在变化,因为每打开一个SIB,链上就多了一段。工具需要知道当前链的预期长度,否则读写会错位。

提示:路径建立时扫描链长度是动态变化的,这是SIB机制最容易出错的地方。手动调试时一定要先确认当前链长,再决定写入数据的位宽。

2.3 SIB的级联与嵌套

SIB可以级联,也可以嵌套。级联是同一层次上多个SIB串行排列,嵌套是一个SIB的支路里还有SIB。嵌套结构让IJTAG网络形成真正的树形,而不是简单的线性链。

嵌套带来的一个实际问题是路径深度。如果一棵树有10层,访问最底层的TDR就要依次打开10个SIB,每次都要重新扫描。这会显著增加测试时间。所以实际设计中,树的深度通常控制在合理范围内,一般不超过5到6层,超过的话就要考虑把某些子树的访问端口独立出来。

3. TDR的定位:它和普通扫描寄存器有什么不同

3.1 TDR是"挂在网络上"的数据寄存器

TDR全称Test Data Register,是IJTAG网络里承载实际测试数据的寄存器。它和普通扫描触发器的区别在于:TDR的时钟和使能是由IJTAG网络控制的,而不是直接来自功能时钟。

一个TDR通常包含几个部分:移位寄存器(用于扫描输入输出)、更新寄存器(用于在shift和capture之间保持数据)、以及可选的并行输入输出接口(连接到实际的测试点)。这种结构保证了在扫描移位时,测试点上的值不会被扰动,只有在update阶段才真正生效。

3.2 TDR的读写时序

TDR的访问分两个阶段:

  • Shift阶段:数据从扫描输入逐位进入移位寄存器,同时移位寄存器里的旧数据从扫描输出移出。这个阶段TDR的输出保持不变。
  • Update阶段:移位寄存器的值被锁存到更新寄存器,更新寄存器的输出驱动实际测试点。如果是读操作,则是把测试点的当前值捕获到移位寄存器,准备下一次shift移出。

这个两阶段机制是IJTAG能安全访问测试点的关键。如果只有移位寄存器,那么移位过程中测试点会被中间状态反复扰动,可能触发误动作。

3.3 TDR与SIB的配合关系

SIB和TDR在网络里是"路"和"货"的关系。SIB负责把路打通,TDR是路上运的货。一个SIB的支路里可以挂一个TDR,也可以挂多个TDR串成的子链,还可以挂更深的SIB子树。

实际配置时,TDR的位宽、数量、在支路里的排列顺序,都要和工具的预期一致。Tessent通过IJTAG描述文件(通常是ICL和PDL)来记录这些信息。ICL描述网络的结构(有哪些SIB、哪些TDR、怎么连接),PDL描述操作序列(怎么打开路径、怎么读写)。两者配合,工具才能自动生成正确的扫描向量。

4. 用Tessent搭建分区网络的实操路径

4.1 环境与描述文件准备

在Tessent里做IJTAG,第一步是把网络结构描述清楚。核心文件有两类:

  • ICL(Instrument Connectivity Language):描述IJTAG网络的硬件结构。包括每个SIB的位置和层级、每个TDR的位宽和接口、以及它们之间的连接关系。
  • PDL(Procedural Description Language):描述操作过程。比如"打开某个SIB"、"向某个TDR写入数据"、"从某个TDR读取数据"这些动作的序列。

这两个文件通常由IP提供方给出,或者由DFT工程师根据设计手动编写。如果是手动编写,建议先用小规模网络验证流程,确认工具能正确解析后再扩展到全芯片。

4.2 分区划分的实操原则

划分分区时,我一般遵循这几条:

  • 按功能模块划分:一个IP核内部的测试点尽量放在同一个分区,减少跨分区访问。
  • 按时钟域划分:同一时钟域内的TDR放在一起,避免访问时频繁切换时钟配置。
  • 控制单分区TDR数量:单个分区内的TDR总位宽建议控制在一个合理范围,太大则扫描时间长,太小则SIB开销占比高。
  • 预留扩展位:每个分区的SIB支路里预留一些空位,方便后期加测试点。

下面是一个简化的分区配置示意,用表格说明各分区的SIB层级和TDR分布:

分区名称SIB层级TDR数量TDR总位宽访问路径深度
CPU_CORE28643
GPU_CLUSTER312964
MEM_CTRL14322
PERIPH26483

这个表里"访问路径深度"指的是从顶层到该分区最远TDR需要打开的SIB数量。深度越大,访问越慢,所以深层分区要控制规模。

4.3 路径建立脚本的编写

在Tessent里,路径建立通常通过PDL描述,工具会自动生成对应的扫描序列。如果需要手动控制,可以用类似下面的伪代码逻辑:

# 打开到目标分区的路径 iWrite SIB_TOP 1 # 打开顶层SIB iWrite SIB_CPU 1 # 打开CPU分区SIB iWrite SIB_CORE0 1 # 打开CORE0子分区SIB # 此时目标TDR已接入,写入测试数据 iWrite TDR_CPU_CTRL 0x1F # 读取TDR数据 iRead TDR_CPU_STATUS # 关闭路径(可选,取决于是否需要保持) iWrite SIB_CORE0 0 iWrite SIB_CPU 0 iWrite SIB_TOP 0

注意这里的iWrite和iRead是IJTAG操作的抽象表示,实际工具里对应的是具体的扫描序列生成命令。关键是打开顺序必须从顶层往下逐层进行,关闭顺序则相反,从底层往上逐层关闭。

4.4 验证网络连通性

网络搭好之后,第一件事是验证连通性。方法是从顶层逐个打开SIB,检查每个TDR是否可读可写。Tessent提供了相应的检查命令,可以自动遍历网络并报告异常。

我通常的做法是:先写一个全0模式,读回来确认;再写一个全1模式,读回来确认;最后写一个走位模式(比如0xAA55),确认每一位都能独立翻转。这三步能覆盖大部分连接错误,比如SIB没打开、TDR位宽配错、扫描链顺序颠倒等。

5. 那些手册上不会写的踩坑记录

5.1 SIB打开顺序错误导致的"数据错位"

最常见的坑是SIB打开顺序不对。假设路径是TOP→A→B,正确顺序是先开TOP,再开A,再开B。如果先开A再开TOP,那么开A的时候TOP还没打开,A根本不在扫描链上,写入的数据会跑到别的地方去。

更隐蔽的情况是:打开了错误的SIB组合,导致扫描链长度和预期不符,但工具没有报错,只是读回来的数据整体偏移了几位。这种问题很难查,因为表面上看读写都"成功"了。

排查方法:每次打开一个SIB后,打印当前扫描链长度,和预期值对比。如果长度不对,说明路径有问题。

5.2 TDR位宽与扫描链长度的匹配

TDR的位宽必须和ICL描述一致。如果ICL里写的是32位,实际硬件是31位,那么扫描时就会多移一位或少移一位,导致后续所有数据错位。

这个问题在IP集成时特别容易发生,因为IP提供方给的ICL可能和实际RTL有细微出入。我的经验是:在集成初期就做一次全网络的位宽核对,把ICL里的位宽和RTL里的寄存器定义逐一比对,不要等到测试向量生成失败才回头查。

5.3 嵌套SIB的路径深度与测试时间

前面提到过,嵌套层数太深会增加测试时间。我遇到过一个设计,最深路径有8层SIB,访问一个TDR要扫描8次,每次都要重新建立路径。整个测试时间比预期多了将近40%。

后来优化方案是把这棵深树拆成两棵浅树,各自有独立的访问入口。虽然多了一个顶层SIB,但路径深度从8降到4,测试时间明显改善。这个取舍需要根据实际测试时间预算来定。

5.4 PDL描述与ICL不一致

PDL里的操作序列必须和ICL里的结构严格对应。如果ICL里某个SIB叫SIB_A,PDL里写成了SIB_B,工具可能不会报错,但实际操作的是错误的SIB。

这类问题的排查成本很高,因为错误是静默的。建议在PDL编写完成后,用工具的静态检查功能做一次一致性校验,确认所有引用的SIB和TDR都在ICL里有定义。

6. 分区网络的扩展与维护思路

6.1 增量添加测试点

IJTAG网络最大的优势是增量扩展。要在某个分区里加一个测试点,只需要在该分区的SIB支路里挂一个新的TDR,更新ICL和PDL,重新生成测试向量即可。顶层连接不用动,其他分区不受影响。

但要注意:新加的TDR会改变该分区的扫描链长度,如果PDL里有硬编码的长度假设,需要同步更新。建议PDL里尽量用符号引用而不是硬编码数值。

6.2 跨分区访问的协调

有些测试场景需要同时访问多个分区,比如要对比两个模块的状态。这时候需要把多个分区的SIB同时打开,让它们的TDR串在同一条扫描链上。

这种操作的难点在于顺序。多个分区的TDR在扫描链上的排列顺序由网络结构决定,不能随意调整。如果需要特定的读写顺序,可能要在PDL里分多次操作,每次只打开一个分区。

6.3 网络文档的维护

IJTAG网络一旦搭起来,后续会有很多人用。维护一份清晰的网络文档非常重要。文档里至少要包含:分区划分图、每个分区的SIB层级和TDR列表、常用操作的PDL示例、以及已知的注意事项。

我见过太多项目因为网络文档缺失,导致新人接手时反复踩同样的坑。花半天时间把文档写好,能省下后面无数次的沟通成本。

7. 几个实际项目中的参数参考

不同规模的芯片,SIB和TDR的配置策略差别很大。下面这张表是我根据几个实际项目整理的经验值,供参考:

芯片规模分区数量单分区TDR位宽SIB最大深度典型访问时间
千万门级4-632-643几十微秒
亿门级8-1264-1284百微秒级
十亿门级16-24128-2565毫秒级

这些数值不是硬性标准,但能帮你快速判断自己的配置是否在合理范围内。如果单分区TDR位宽远超同规模的经验值,可能要考虑拆分;如果SIB深度超过5层,要评估测试时间是否可接受。

另外,TDR的位宽不一定是2的幂次。有些设计里TDR是12位、20位这种非标准宽度,这完全没问题,只要ICL和RTL一致就行。不要为了"整齐"强行凑成32位,浪费的面积和测试时间不划算。

8. 从SIB和TDR看IJTAG的设计哲学

用久了会发现,SIB和TDR这套机制背后有一个很清晰的设计哲学:用最小的硬件开销,换取最大的访问灵活性。

SIB只用一个比特的存储,就实现了对整条支路的通断控制。TDR用标准的扫描寄存器结构,就实现了对任意测试点的读写。两者组合,让测试网络从"硬连线"变成了"可编程路由"。

这种思路其实和网络领域的路由交换很像。SIB是路由器,TDR是终端设备,PDL是路由协议。理解了这一层,再看IJTAG的各种高级特性,比如扫描链重定向、多端口访问、动态重配置,都会觉得顺理成章。

实际做项目时,我建议不要一上来就追求复杂的网络结构。先用最简单的SIB+TDR把基本访问跑通,确认工具流程没问题,再逐步增加层次和分区。IJTAG的调试成本主要在网络建立阶段,结构越简单,出问题时越容易定位。等基本流程稳定了,再根据测试需求做优化,这样风险可控,进度也可控。

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

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

立即咨询