芯片测试领域有个很现实的问题当设计规模从几百万门膨胀到几十亿门片上需要观测和控制的测试点数量会呈指数级增长。如果还沿用早期那种一根线接一个点的直连思路光是布线就能把后端工程师逼疯更别提时序收敛和面积开销了。Tessent IJTAG这套机制就是为解决这个矛盾而生的而其中**SIBSegment Insertion Bit和TDRTest Data Register**这两个基础构件是把杂乱无章的测试网络整理成分区清晰、可寻址、可扩展结构的关键。这篇内容面向已经接触过DFT基础概念、正在用Tessent搭建或维护IJTAG网络的工程师重点讲清楚SIB和TDR到底怎么配合、分区网络为什么这样设计、以及实际配置时容易踩的坑。1. 从手动连线到网络分区IJTAG要解决的真实痛点1.1 直连式测试网络的三个死结早期做DFT很多团队的做法是把每个需要控制的测试点直接引到顶层端口或者用简单的多路选择器做选择。设计小的时候没问题一旦规模上去三个问题会同时爆发。第一个是布线资源。每个测试点都要一条独立路径通向访问端口几十亿门的芯片上测试点动辄上千个这些线在版图上横穿整个芯片占用大量金属层资源还会和功能逻辑抢布线通道。第二个是时序。长距离的测试信号路径会引入延迟在高速时钟域下很难满足建立保持要求后端反复迭代也未必收敛。第三个是可扩展性。每加一个测试点就要改一次顶层连接验证和回归的成本随规模线性甚至超线性增长。这三个死结的本质是测试访问没有做层次化和寻址化。功能逻辑早就用总线、用地址来访问了测试网络却还停留在点对点的原始阶段。1.2 IJTAG的层次化思路IJTAGInternal JTAGIEEE 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三个开关。操作过程是这样的先把扫描链配置成只包含SIB_A的状态扫描写入1把SIB_A打开。此时扫描链自动延伸包含了SIB_A后面的SIB_B再扫描写入1把SIB_B打开。扫描链继续延伸包含SIB_C写入1打开。现在目标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第一步是把网络结构描述清楚。核心文件有两类ICLInstrument Connectivity Language描述IJTAG网络的硬件结构。包括每个SIB的位置和层级、每个TDR的位宽和接口、以及它们之间的连接关系。PDLProcedural Description Language描述操作过程。比如打开某个SIB、向某个TDR写入数据、从某个TDR读取数据这些动作的序列。这两个文件通常由IP提供方给出或者由DFT工程师根据设计手动编写。如果是手动编写建议先用小规模网络验证流程确认工具能正确解析后再扩展到全芯片。4.2 分区划分的实操原则划分分区时我一般遵循这几条按功能模块划分一个IP核内部的测试点尽量放在同一个分区减少跨分区访问。按时钟域划分同一时钟域内的TDR放在一起避免访问时频繁切换时钟配置。控制单分区TDR数量单个分区内的TDR总位宽建议控制在一个合理范围太大则扫描时间长太小则SIB开销占比高。预留扩展位每个分区的SIB支路里预留一些空位方便后期加测试点。下面是一个简化的分区配置示意用表格说明各分区的SIB层级和TDR分布分区名称SIB层级TDR数量TDR总位宽访问路径深度CPU_CORE28643GPU_CLUSTER312964MEM_CTRL14322PERIPH26483这个表里访问路径深度指的是从顶层到该分区最远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_APDL里写成了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的各种高级特性比如扫描链重定向、多端口访问、动态重配置都会觉得顺理成章。实际做项目时我建议不要一上来就追求复杂的网络结构。先用最简单的SIBTDR把基本访问跑通确认工具流程没问题再逐步增加层次和分区。IJTAG的调试成本主要在网络建立阶段结构越简单出问题时越容易定位。等基本流程稳定了再根据测试需求做优化这样风险可控进度也可控。