IJTAG与IEEE 1687:SIB机制及ICL/PDL在Tessent中的落地实战
发布时间:2026/9/14 3:07:23 作者:尧图编辑部 阅读量:1,286

IJTAG这套东西在DFT领域里算是越聊越热的话题。如果你接触过复杂SoC或先进工艺节点的芯片一定对测试数据量爆炸、测试时间失控、调试访问困难这几个问题深有体会。IEEE 1687标准也就是常说的IJTAG提供了一套解决如何高效访问芯片内部仪器问题的标准化方案。上一篇讲了基础概念和动机这一篇我们深入内部把SIB机制、ICL/PDL描述语言以及和Tessent等工具的配合讲透。对于正在做DFT实现、或者准备在项目中引入层级化测试架构的工程师这篇内容应该能帮你少走不少弯路。1. 为什么传统JTAG在复杂芯片面前越来越力不从心要理解IJTAG的价值先得看清楚传统JTAGIEEE 1149.1在当下芯片设计中的困境。这不是说JTAG不好——它依然是整个测试架构的基石但当芯片规模到一定程度后它的短板会变得非常扎眼。1.1 指令空间和TAP端口成了瓶颈传统JTAG通过TAPTest Access Port状态机和指令寄存器来控制所有测试逻辑。指令寄存器的位宽一旦定死能编码的指令数就固定了。比如一个5位的指令寄存器最多就是32条指令。听起来不少但当你芯片里有几十个IP、每个IP需要独立的BIST内建自测试、边界扫描、调试访问功能时32条指令根本不够分。我在一个实际项目里就撞到过这堵墙。那颗SoC集成了将近40个不同的可测性模块每个模块至少需要2到3条指令来完成配置和启动。光把指令分配表列出来就超过了256条指令寄存器被迫做到8位以上但即便如此指令译码逻辑的复杂度也让人头大。更糟糕的是任何新的IP加入都意味着指令表要重新规划前期定好的分配方案可能被推翻重来。1.2 测试数据串行搬移的低效JTAG本质上是一条串行移位链。所有的测试向量、配置数据、响应数据都要经过TDITest Data In和TDOTest Data Out一位一位地搬进搬出。芯片规模变大、测试模式的复杂度和深度提升之后这条串行通道就变成了整个测试流程的咽喉。举个具体数字假设一颗芯片的内部扫描链总长约500万位一次全芯片扫描测试要灌入的向量可能有上千条。按JTAG串行移位的机制就算时钟跑到50MHz仅仅搬移数据就要花掉相当可观的时间。这在实验室调试阶段还能忍到了量产测试阶段每一毫秒都是成本。1.3 层级化和模块化设计带来的访问难题现代SoC几乎都是多层级的顶层有CPU子系统和总线互联下面挂着各种功能IP每个IP内部又有自己的测试逻辑。传统JTAG的扁平化访问机制要求所有测试逻辑都能从顶层TAP直接看到、直接控制。可模块化设计里很多IP是第三方提供的它们内部的具体测试结构对集成者来说是黑盒子甚至连扫描链怎么接、BIST怎么触发都不清楚。这就产生了一个矛盾测试逻辑存在于不同层级、属于不同团队但访问路径只有顶层一条。结果就是每次集成新IP都得重新梳理JTAG访问路径手工做大量的地址译码和指令扩展工作量大不说还特别容易出错。说实话这些痛点做DFT的人迟早都会遇到。IJTAG就是针对这些问题提出来的——它不推翻JTAG而是在JTAG的基础上增加了一套更灵活、更利于层级化复用的仪器访问机制。2. SIB机制层级化测试访问的设计核心IJTAG最核心、也最值得你花时间理解的就是SIBSegment Insertion Bit。这个小小的电路单元解决了如何在有限端口下按需访问内部仪器的问题。理解了SIB你就理解了整个IEEE 1687的硬件架构。2.1 SIB的功能本质是一个可控旁路开关SIB本质上是一个1位寄存器单元附带一个旁路逻辑。它串联在扫描数据通路中间控制着某一段扫描通路是接入还是旁路。当选通的时候数据从TDI经过这段通路再流向TDO意味着这段通路里的所有仪器可以被访问当旁路的时候数据直接跳过这一段通路变短、访问速度更快。我习惯把它理解成水管里的阀门。水管是测试通路阀门就是SIB。你要给后花园浇水就打开阀门让水流过去不需要的时候关掉阀门水走主管道直接到终点又快又省。放到芯片里这个省的好处体现在测试时间上——配置哪个SIB只需要把对应的控制位置1或清0不需要给每个仪器都分配独立指令。2.2 层级SIB树的组织方式SIB最有价值的能力是可以嵌套。多个SIB可以组成一棵树状结构顶层SIB导通后里面还有第二层SIB再导通后里面还有第三层。每一层控制各自的仪器子网络驱动逻辑只需处理当前开通的路径。以我参与过的一个车载芯片项目为例测试架构分了四级顶层挂音频子系统SIB、显示子系统SIB、安全子系统SIB每个子系统内部再挂具体的IP测试SIB有些大IP内部还有第三级、第四级。最终从顶层TAP到最深的那个IP测试逻辑中间需要依次打开4个SIB才能访问到。层级化的好处是显而易见的配置某个IP的测试逻辑时不需要关心其他子系统的SIB状态也不会有其他模块的寄存器在数据链路上干扰你。模块团队内部怎么组织测试逻辑完全由他们自己决定顶层只关心这一级SIB的控制。这就实现了真正意义上的模块化测试复用。2.3 SIB的硬件实现代价与优化很多人一听到每级都要加SIB第一反应是面积开销。确实每个SIB都会有额外的门电路但实际算下来这个代价很低。一个SIB通常只需要一个D触发器和几个门标准单元库下折合面积大约只有2到3个等效门。对比一个IP内部动辄几百万门的逻辑这几乎可以忽略不计。不过需要注意的是SIB的级联深度会影响访问延时。每经过一级SIB数据通路上就多了一级额外的移位寄存器配置指令和数据到达目标的周期数会增加。如果层级过深比如超过10级测试配置时间会变得不可接受。我在做功耗管理芯片的时候就踩过这个坑当时没有预估SIB层级深度对配置时间的影响结果测试用例里光配置就耗掉了不少周期后来不得不调整SIB的位置把高频访问的仪器上移。2.4 正确理解SIB的配置即指令思想传统JTAG里你想访问某个仪器需要先通过TAP状态机往指令寄存器灌入一条对应指令然后数据路径才会切到目标寄存器。IJTAG的SIB方式不同它是在数据路径上做文章——通过移位寄存器链上的数据位来控制SIB的开合从而动态决定扫描数据通路。这个设计在操作上更加灵活。因为SIB控制了扫描通路本身一旦某个SIB开启后续所有数据移位操作都直接面向其控制的仪器链不需要反复灌指令、切状态。尤其对大量连续的数据操作应用场景效率提升非常明显。你可以把SIB机制想象成在一个可动态改线的电路板上重新布线而不是每次操作前都重新插拔跳线帽。3. ICL和PDL让工具和工程师共享同一种测试语言如果SIB是IJTAG的硬件骨架那ICLInstrument Connectivity Language和PDLProcedural Description Language就是让这套骨架能够被EDA工具理解、被测试程序生成器使用的软件接口。没有这两门语言光有SIB电路实现不了自动化。3.1 ICL描述什么仪器、连接和扫描路径的电路图ICL是一种文本描述语言它的作用是把芯片内部的可测试性结构用标准化格式描述出来。简单说ICL就是在告诉工具芯片里有哪些仪器比如BIST控制器、扫描链包装器、调试寄存器堆这些仪器在扫描通路里是怎么连接的SIB网络的结构是什么样。来看一个简化版的ICL描述片段Module top_ic { ScanInterface top_tap : TDI, TMS, TCK, TDO; ScanMuxReg sib_audio { ScanIn top_tap; ScanOut audio_chain; } Instrument audio_bist { ScanIn sib_audio; ScanOut sib_audio; ControlRegister length 8; } }这段描述里ScanMuxReg就是SIBInstrument定义一个仪器这里是BISTScanIn/ScanOut描述了数据通路的连接关系。工具拿到这份描述就能自动生成访问特定仪器的扫描路径。实测下来ICL最需要花的功夫是在模块级写清楚每条扫描链的路径定义。这个环节偷懒后面生成测试向量的时候就会有一堆连接性错误反复报错排查极耗时间。我建议你把ICL当成带测试信息的网表来维护做到和RTL版本同步更新这样省心很多。3.2 PDL描述什么仪器操作的操作步骤书ICL描述了硬件结构PDL则描述了对仪器进行的操作步骤。PDL更接近一门编程语言它有变量、循环、条件分支、函数调用还能直接对寄存器位域进行操作。PDL最常见的应用场景是描述一个测试序列比如配置BIST控制器寄存器为随机模式启动BIST等待完成读取签名值。用PDL写出来大致长这样proc run_bist { // 打开通往BIST模块的SIB iWrite top_ic.sib_audio 1; // 配置BIST寄存器 iWrite audio_bist.control 0x01; // 启动BIST iWrite audio_bist.start 1; // 等待BIST完成 iLoop 100 { iRead audio_bist.status; if (audio_bist.status.done 1) { break; } } // 读取签名 iRead audio_bist.signature; // 关闭SIB恢复旁路 iWrite top_ic.sib_audio 0; }这个PDL过程的含义非常清晰打开SIB配置寄存器启动BIST轮询状态读签名最后关闭SIB。整套流程和我们手工在实验室里用JTAG调试器敲的命令几乎一样但PDL是标准格式可以被工具自动编译、调度并生成对应的ATE测试程序。3.3 工具侧如何使用ICL/PDL在Tessent的IJTAG流程中ICL和PDL是被当作标准输入来对待的。Tessent会自动解析ICL描述构建内部的可测性层次树然后根据PDL中的仪器操作序列自动生成对应的扫描加载数据和捕获使能信号。这相当于工具的测试生成器不再需要你手工指定每条芯核的具体寄存器地址而是直接照着PDL的描述去驱动整个测试序列。这种自动化带来的学术价值是测试向量和硬件结构解耦。模块团队更新了内部BIST寄存器的定义只要同步更新ICL/PDL顶层和使用方的测试环境无需做任何手工修改重新生成的向量自然就是正确的。这在以往的JTAG流程里几乎不可能做到。4. 在Tessent DFT流程中落地IJTAG架构我知道很多团队关心的是IJTAG概念看上去好但在Tessent里到底怎么落地这里直接分享我们项目里实践过的路径和几个关键参数设置。4.1 从工具配置到SIB网络插入Tessent DFT曾用名Tessent Shell对IEEE 1687的原生支持是这几年用下来最值得推荐的一点。它提供了专门的命令来创建和插入SIB网络不需要你手动在RTL里写SIB逻辑。最基础的配置大致是这样set_config -ijtag on create_tap -instruction_length 8 add_sib -name sib_audio -depth 1 add_sib -name sib_video -depth 2这几条命令的含义分别是启用IJTAG流程创建8位指令寄存器的TAP增加两个SIB音频和视频到指定层级。Tessent会自动分配SIB的控制位并把它们嵌入到扫描链路中。值得提醒的是-instruction_length这个参数要留够余量。虽然IJTAG的核心思想是少用指令、多用SIB配置但TAP本身仍然需要一些基础指令如IDCODE、BYPASS、SAMPLE等。如果计划要保留和传统JTAG指令的兼容建议指令寄存器不要低于8位否则某些IP对接会很困难。4.2 Tessent中ICL/PDL的生成流程Tessent在插入SIB网络之后会顺带生成一份ICL描述文件描述整个测试网络的连接关系。这份文件会按层次组织顶层的ICL文件引用各个子模块的ICL文件。具体命令类似write_icl -output top_ic.iclPDL的生成则相对复杂一些因为它来源于具体的测试需求。Tessent提供了一种称为procedure的机制你可以为每个仪器定义测试过程。写好的PDL可以独立于硬件设计被维护和编译当网表更新后只需要重新映射一遍即可。我们自己是用脚本维护每个IP的PDL文件库芯片版本换的时候只更新寄存器地址映射不需要重写整个测试行为描述。这个习惯帮我们节省了大量回归测试时间。4.3 与IEEE 1500芯核测试包装器的配合做IP复用的时候一定要清楚IJTAG和IEEE 1500芯核测试包装器标准的关系。IEEE 1500解决的是芯核内部的扫描链和测试逻辑如何标准化包装的问题而IJTAG解决的是如何从芯片顶层访问这些芯核测试逻辑的问题。两者不是替代关系而是天然互补。在Tessent中你可以给一个IEEE 1500包装的芯核加一个SIB做成可旁路的测试访问通道。这样当这个芯核被集成到不同项目时测试访问方式无需改变只要顶层打开相应的SIB即可。我们有个第三方 modem IP就是用这种方式实现了一次开发、多项目复用的效果。4.4 测试时间收益到底有多明显说一个实际数据。我们之前那颗车规SoC全芯片扫描测试向量大约有几十万条原始JTAG的扁平化架构下测试时间接近10秒。引入IJTAG SIB结构后因为可以按需配置SIB只访问需要测试的子系统测试向量搬移量大幅减少最终量产测试时间降到了4秒以内优化比例超过一半。当然这个收益不是凭空来的。SIB网络的层级和深度规划、PDL中操作序列的精简、以及ATE通道和时钟频率的匹配每一环都影响了最终的数字。如果你正准备做类似架构调整建议先从子系统试点测完一个子系统再全面铺开。5. 项目中容易踩的坑SIB网络和工具配合的实战教训IJTAG不是装上就能一帆风顺。我们团队在落地过程中踩了不少坑这里挑几个最有代表性的讲一讲希望能帮你提前绕开。5.1 SIB层级过深导致的配置时间失控前面提到过SIB层级过深会让配置时间增长。这里给出一个具体的定量分析假设10级的SIB链每级配置一个SIB位需要1个TCK周期纯配置时间就10个周期。看似不长但如果每个测试模式都要配置一遍上万个测试模式累积起来时间是相当可观的。我们最初在某个AI加速芯片上设计了层层嵌套的5级SIB树最初觉得挺规整。可当真跑到testmax生成测试向量的时候发现每次模式切换光配置就得几百上千个周期而且大部分配置周期都花在反复打开/关闭中间层的SIB上。后来调整策略是将测试过程中保持开启状态的SIB尽量上提只对切换频繁的末端SIB做动态控制。这样既保留了SIB的灵活性又把配置开销压在了可控范围内。设计SIB树之前先列一下每个子系统的测试模式切换频率再决定哪些层级需要做成常开路径这种做法很管用。5.2 ICL描述与实际网表不一致ICL本质上是对网表格的抽象描述如果两边不一致工具在生成测试程序时不会立刻报错而是生成错误的地址映射和移位序列到时候在ATE上跑测试才发现问题定位起来非常痛苦。我们踩过最典型的一次是某个模块的RTL在更新时调整了扫描链的拼接顺序但ICL文件没有同步更新。结果工具生成的BIST配置序列全部错位测出来的签名完全不对整整排查了一周。后来我们强化了一个流程约束任何ICL相关RTL的改动必须同时更新对应的ICL描述并且跑一遍形式化校验把ICL生成的扫描路径和网表的真实扫描路径做对比确保完全一致才能提交。这一条救了我们很多次。5.3 多个SIB同时配置时的互锁问题如果你的PDL流程中有多个SIB需要同时配置要注意它们之间是否存在路径互锁关系。所谓互锁就是一个SIB的开启依赖另一个SIB的关闭或者两个SIB共享同一段物理通路同时开启会导致移位数据冲突。Tessent在生成PDL时通常会做可访问性分析自动处理好大部分互锁关系。但碰到修改过手工网表的情况工具分析不到的边界情况就会漏掉。我的习惯是在写完PDL之后先用形式化工具做一遍SIB状态可达性检查确认所有需要同时建立的访问路径都是可达的再投入向量生成。5.4 Tessent版本间的行为差异不同版本的Tessent对IJTAG的支持力度和默认行为有差异。早期版本对SIB的默认插入方式、指令映射策略和后版本都不完全一致。如果你从项目中期升级了Tessent版本建议先对既有的IJTAG工程做一次完整的回归仔细核对生成向量的变化。我们有一次升级版本后发现生成向量的数量不变但每个向量的移位深度变短了看起来是优化实际上是因为新版本工具默认展开了部分SIB层级改变了路径选择策略。这种行为差异本身不一定是坏事但如果你没有注意到就直接拿去量产风险就大了。6. 从JTAG到IJTAG团队协作和流程规范的实战建议最后聊点软性的但同样重要。IJTAG带来的不只是新技术还有团队分工和流程规范的改变。如果你正在推动部门引入IJTAG下面这几件事越早做越省力。6.1 建立模块级的ICL/PDL负责人机制ICL/PDL的维护如果全压在DFT集成工程师一个人身上信息传递非常低效。因为模块内部的测试逻辑细节只有模块所有者最清楚。我们现在的做法是每个IP的ICL/PDL由该IP的DFT工程师负责维护集成工程师只维护顶层SIB网络的描述。这样权责清晰出了问题也很好定位。6.2 让ICL进入设计同步流程RTL版本管理和ICL版本管理的同步几乎是我们早期最痛苦的事。后来引入了一个简单的检查脚本在每次同步版本之前自动比对ICL描述的模块端口列表和RTL的实际端口列表是否一致。这种低成本的方式堵住了大部分因版本错位引起的低效调试值得一试。6.3 PDL用例库的积累每写一个新测试用例都顺手沉淀成可复用的PDL模板。别觉得前期开发慢回头看你会发现好的PDL模板能让你在新IP验证、系统级测试甚至诊断分析时节省大量时间。比如一个通用的读取设备ID流程、一个执行BIST并返回签名的流程几乎每个模块都能复用。把这些公共流程抽出来后续跟芯片验证团队、测试工厂对接的时候沟通成本能降一个量级。我自己在这块还有一个体会让PDL模板尽量短小、聚焦单点功能。之前我们做过一个巨大的PDL流程把整个芯片的所有仪器测试都揉到一个过程里结果调试起来非常痛苦因为任何一个环节出问题你都得先搞清楚跑到第几步、卡在哪条访问路径上。拆成小过程之后每次只做一个仪器的操作出了问题可以很精准地定位这个习惯帮我们省了无数个小时。