ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Tessent ICL文件深度解析:从IEEE 1687到SIB网络调试实战

Tessent ICL文件深度解析:从IEEE 1687到SIB网络调试实战 每个做DFT可测试性设计的工程师大概率都被ICL文件折磨过。我记得第一次接触Tessent的IJTAG流程时对着一个上千行的ICL文件毫无头绪根本分不清哪些是工具自动生成的、哪些是人为定义的更别提理解SIBSegment Insertion Bit在嵌套网络里怎么层层展开。后来被项目里的实际交付节点追着跑才一步步摸索出这套语言的门道。这篇内容就是想把Tessent工具链里ICL文件的来龙去脉讲透从IEEE 1687标准本身的设计逻辑到ICL文件里每个关键结构到底在干什么再到调试仿真时那些让你抓狂的坑一次说清楚。先说清楚这篇文章适合谁。如果你正在做SOC片上系统级DFT整合需要把不同IP的IJTAG网络串到一起或者你被分到“写IP测试描述”的活要维护一个会被多个项目复用的ICL文件又或者你只是想在仿真阶段快速定位为什么某个instrument寄存器死活切不进去——那这篇文章的实操部分对你应该非常有用。我会尽量用项目里真实遇到的场景来解释而不是像手册那样只念语法。1. 先搞懂IJTAG到底在解决什么问题1.1 从JTAG到IJTAG边界扫描的进化之路要理解ICL文件的价值得先回到IEEE 1149.1传统JTAG的框架里看看它遇到了什么瓶颈。传统JTAG提出的时候芯片外部引脚还不算多一条TDI到TDO的扫描链串起所有边界扫描单元再挂几个核心的测试寄存器基本就够用了。但放到今天动辄上百个IP、内部有几十个可测试性仪器比如内建自测试BIST控制器、调试追踪模块、温度传感器、片上时钟测量单元的SOC里如果把所有registers全部串在一条链上光是移位一个pattern就要几万个时钟周期而且任何一个仪器逻辑上的缺陷都会拖垮整条链的测试这在量产测试成本上完全不可接受。IEEE 1687IJTAG解决这个问题的思路其实很朴素给每个测试仪器修一条可以动态通断的支路不用测它的时候就直接旁路掉。这样一来链的长度可以根据当前要访问的仪器动态缩短不同仪器的测试pattern也可以并行还是串行按需组织。这个“动态通断”的开关就是SIB而“网络长什么样、有哪些开关、开关怎么控制”这件事必须用一种机器可读、工具可解析的标准语言来描述——这就是ICLInstrument Connectivity Language诞生的原因。从行业演进看IJTAG还解决了另一个让DFT工程师头痛的问题IP供应商和集成商之间的交接。以前IP内部测试逻辑怎么访问基本靠PDF文档加几百页时序图集成的人要逐字逐行理解第三方IP的手册再把TDRTest Data Register映射到自己顶层的扫描链里。有了ICL之后IP供应商交付的不仅是RTL代码还有一个标准化的“说明书”——ICL文件。这个文件精确描述了该IP内部所有instrument的访问路径、所需要的扫描寄存器长度、控制bit的行为逻辑。集成方只要把这个ICL文件喂给EDA工具工具就能自动把不同的IP网络拼接成一个完整的IJTAG访问架构并生成对应的仿真pattern和测试向量不再需要人工去梳理内部细节。说到底IJTAG为复杂的芯片内部测试网络提供了一套“标准化建模自动化调度”的基础设施。1.2 ICL在整个体系里的位置IEEE 1687标准里其实包含了三个核心组成ICLInstrument Connectivity Language、PDLProcedural Description Language和一个执行模型。我们常见的误区是把ICL当成整个IJTAG的全部其实ICL负责描述静态的连接关系和层级结构告诉你“网络是怎么接的、每个仪器长什么样”PDL负责描述动态的操作行为告诉你“要对某个寄存器执行什么样的操作序列”。两者是配合关系PDL里的操作指令最终要落到具体的扫描网络路径上而路径的寻址和通断控制则完全依赖ICL提供的连接信息。在Tessent工具链中ICL最终会被工具解析成一张网络图PDL则被编译成一串串对这张网络图的“访问命令”两者结合才能生成最终的pattern。用一句话概括就是ICL是IJTAG网络的“静态拓扑图”PDL是用户对这张拓扑图下的“操作指令集”。在一个典型的Tessent流程里你会先装载ICL文件建立网络模型然后装载PDL定义操作序列之后工具自动跑一遍以确认满足约束并生成pattern。整个流程里ICL文件的完整性直接决定网络模型是否正确任何一个信号方向写反、任何一个寄存器位宽写错后续生成出来的pattern全是错的而且这种错误往往要到仿真阶段才能暴露出来。1.3 三个核心概念一次讲清Instrument、扫描网络与SIBICL文件里跟工程师打交道最多的是这三个概念Instrument、Scan Network和SIB。Instrument是指芯片内部能够执行某种测试或调试功能的硬件单元比如一个MBISTMemory Built-In Self-Test控制器、一个IEEE 1500的Wrapper接口、一个JTAG IP的TAPTest Access Port控制器在ICL文件里Instrument可以理解为“网络末端的一个功能节点”。每个Instrument都有一组Port其中跟IJTAG网络相关的端口叫ScanIn和ScanOut分别表示数据从哪个方向进来、从哪个方向出去另外还有一组用于选择和配置的控制端口比如ScanEn扫描使能、Select仪器选择等。ICL文件要非常明确地描述这些端口的方向和位宽因为工具是靠这个信息来建立网络连接的。Scan Network指的是从顶层TDI到TDO之间通过由SIB组成的开关网络连接起来的所有扫描寄存器的总路径。你可以把Scan Network想象成一组汇流排SIB就是汇流排上的多路阀门通过打开或关闭这些阀门把不同的仪器接入或旁路出当前的活动链路。这里最关键的设计是SIB本身也是一个扫描寄存器它自身会被串在当前链路上并且有一个单独的更新信号来锁存其控制位。当SIB被配置为“打开”状态时它的TDI和TDO之间的路径就会经过它所控制的子网络当配置为“关闭”状态时路径就直接从TDI到TDO旁路子网络被隔离。这种机制的好处在于网络的重构是在测试运行期间动态完成的不同测试阶段可以根据需要切换SIB状态而无需重新加载配置数据这对大规模仪器网络的调度极其重要。在ICL文件里SIB的定义会写成类似于一个拥有两路选择逻辑的ScanRegister一路是旁路直通一路是进入子网络。这里有个细节经常被忽略SIB的控制bit并不是普通的扫描数据它在更新阶段被锁存所以一个“打开/关闭”动作往往需要两个capture/update周期才能真正生效。Tessent工具在生成访问时序时会自动根据ICL语义插入这些额外的控制周期但如果你的ICL里SIB的更新信号定义得不清晰工具生成的时序就会有问题。2. ICL文件的语言结构一份写给测试仪器的“接线图”2.1 从一段真实ICL片段说起与其空谈概念不如直接看一段典型的ICL代码。下面是一个简化过的IP内部网络描述假设这个IP有两个instrument一个是MBIST控制器一个是扫描链回环的测试结构。Module my_ip { // 定义两个instrument的扫描端口 Instrument mbist_ctrl { ScanIn port ScanIn_mbist; ScanOut port ScanOut_mbist; ScanEn port ScanEn_mbist; } Instrument loopback_test { ScanIn port ScanIn_loop; ScanOut port ScanOut_loop; ScanEn port ScanEn_loop; } // 定义扫描网络一个SIB控制mbist_ctrl另一个SIB控制loopback_test ScanRegister sib0 { ScanIn port SI; ScanOut port SO; UpdateEn port UpEn; } ScanRegister sib1 { ScanIn port SI; ScanOut port SO; UpdateEn port UpEn; } // 连接关系sib0的旁路路径连到sib1sib0的子路径连到mbist_ctrl Interconnect conn_net { SI - sib0.SI; sib0.SO - sib1.SI; sib1.SO - SO; // sib0的子网络 sib0.SelIn - mbist_ctrl.ScanIn_mbist; mbist_ctrl.ScanOut_mbist - sib0.SelOut; } }请注意这段代码并不是IEEE 1687标准里完全标准的ICL语法实际Tessent生成的ICL文件要复杂得多命名规则也会带一堆前缀后缀。但通过这个骨架你能看出关键信息每个模块里定义了多个仪器每个仪器的扫描数据端口都明确方向SIB本身被当作一种特殊的扫描寄存器来建模最后通过Interconnect把所有的点连成一张有向图。2.2 ScanRegister定义的要点ICL里ScanRegister是个高频出现的关键词它描述了一段可以在当前扫描链上移动数据的存储器单元。扫描寄存器的位宽不一定等于内部寄存器的真实bit数它关心的是串行移位路径上的长度。比如一个控制寄存器在硬件上是64bit但你在IJTAG链上只需要串行写入其中8个bit的配置那么iccl里这个ScanRegister的位宽就可以定义为8多余的bit通过内部逻辑固定。这个灵活性是IJTAG的一个重要优势但也是错误的高发区——位宽写错、方向写反是最常见的ICL低级错误。定义ScanRegister时我强烈建议关注三个细节扫描端口ScanIn/ScanOut必须与真实硬件连接一一对应方向不能搞反。ScanIn永远是数据进入的方向ScanOut永远指向数据输出的方向。UpdateEn端口是否存在决定了这个寄存器是同步更新还是透明输出的。很多控制类寄存器需要专门的更新使能信号如果在ICL里漏掉对Update的建模Tessent在生成pattern时就不会产生相应的更新时序行为。如果该寄存器有capture行为比如从组合逻辑捕获状态还需要在ICL里通过ScanRegister的CaptureEn端口描述。漏掉这个仿真时连基本的Capture操作都跑不对。2.3 SIB与网络可重构的真正逻辑SIB在ICL里的角色特殊它可以理解成“带旁路能力的嵌套开关”。每个SIB都有两个数据路径一个是直通的旁路路径TDI-TDO一个是深入子网络的路径。控制这个切换的就是SIB自身扫描寄存器里的值。从ICL文件的角度看SIB的建模里最核心的是它的“Selected”映射关系——当SIB状态为1时数据路径走SelectedIn/SelectedOut方向当SIB状态为0时路径走Bypass方向。在一棵多级SIB树里网络的重构顺序非常重要。比如你要访问一个深藏在第三层SIB后面的仪器工具生成的访问流程一定是先通过旁路把第一层SIB配置成打开把第二层SIB配置成打开再把第三层SIB配置成打开最后才能真正把目标仪器连进当前链路。这些配置过程不是一蹴而就的而是多次“刷新-移位-更新”循环。我见过不少工程师在调试时以为只要在ICL里把SIB网络定义好了工具就会自动搞定所有层级。实际上工具确实会做层级配置但前提是你的ICL文件把SIB的路径、更新使能、层级关系全都描述正确。任何一处SIB的控制逻辑不完整你就可能在生成的pattern里看到“某层SIB没有被正确打开”的诡异现象。关于SIB还有一点值得提ICL标准里允许SIB的子网络本身再嵌套SIB这种递归结构会导致工具在展开网络时生成非常长的路径描述。Tessent有相应的优化机制来处理这种深嵌套网络但前提是文件本身要符合标准否则工具可能在解析层次关系时直接崩溃报一个让人摸不着头脑的解析错误。所以在设计嵌套SIB网络时务必保持层级清晰命名规范内部互连不要跨越层级随意新增额外的旁路路径。2.4 Interconnect连接关系的描述Interconnect承担了定义“谁连谁”的工作。它在ICL里的核心是方向性声明每条连线都有确定的起始点和终点。在大型模块里Interconnect特别容易抄错尤其当端口名字又长又像时比如scan_in_mbist_controller_data和scan_in_mbist_controller_ctrl复制粘贴时稍微一走神网络就连错地方了。我的经验是在编写或检查Interconnect时把ICL文件想象成一张PCB印制电路板的原理图每一根线都必须有明确的起点和终点不允许出现悬空或回环。悬空好理解就是端口定义了但没接任何线回环则复杂一些比如A的Output连到了B的Input而B的Output又绕回来连到了A的Input形成环。这种环在IJTAG网络里如果不涉及组合逻辑通常不会造成物理上的死锁但会给工具的可达性分析带来麻烦可能导致生成的pattern永远无法收敛。2.5 ICL和Verilog容易混淆的差异平时做RTL设计的人第一次接触ICL很容易产生一种错觉这不就是一种另类的Verilog吗但实际上两者有本质区别。Verilog描述的是电路硬件的行为和结构一个module对应一个实际的硬件实体而ICL更接近一种“描述性元数据”它建模的对象包括了很多不直接对应实体硬件的抽象概念比如旁路路径、动态可变的网络拓扑、由工具推断出的访问顺序。ICL不关心SIB内部的晶体管如何实现只关心它在网络中的行为特性。另外ICL采用的是严格的标准语法结构它有很多强制性的关键字和冒号结尾容易让人误以为它是某种简化的HTML。实际上在编写ICL时每一个分号、每一个大括号的位置都有讲究一个缺失的分号就能让整个解析直接失败。Tessent自带的解析器虽然会给出“行号列号”的错误提示但在复杂嵌套结构里有时候一个错位括号引发的连锁报错能让你找半天。这种时候我通常会直接把文件交给tessent_ijtag_server解析一遍看它报错的位置和上下文比自己去数括号高效得多。3. Tessent工具链中ICL是怎么工作的3.1 ICL的生成手写、脚本生成与自动抽取ICL文件的来源主要有三种第一是直接手写这通常出现在IP定义者需要对内建仪器做精细描述时第二是用脚本自动生成比如基于IP的寄存器描述文件如IP-XACT描述跑一个脚本直接转换出ICL第三是从已有的RTL设计里自动抽取Tessent的工具链能够识别设计里的IJTAG扫描网络结构并自动生成对应的ICL文件。现实中一个成熟的IP项目往往是三者结合自动抽取生成的ICL作为底稿然后人工增删、修正、补充最终形成正式版本。我需要特别提醒的一点是如果一个IP的RTL功能在后续迭代中发生了变化比如寄存器位宽从32bit改成了64bit但ICL文件没有同步更新那么工具会拿着过时的ICL去生成pattern最后在仿真或者ATE自动化测试设备机台上出现错位。这种问题很难排查因为前仿真有时候并不会立刻暴露所有不一致。所以严谨的做法是在每次RTL freeze时跑一次regression回归测试检查ICL描述与RTL网表的一致性这在Tessent流程里有专门的一致性检查命令做DFT的同学一定要养成跑这个检查的习惯不要省这一步。然后说说脚本生成。如果你的项目维护了很多结构相似的IP强烈建议把ICL生成脚本化。我曾经维护过一个IP家族几十个成员IP的ICL内容90%相同只有端口名和寄存器位宽有差异。如果用人工去维护这些文件既慢又容易错。后来我把端口信息抽到Excel表或一个YAML配置里用Python脚本生成统一的ICL模板再跑一个格式验证。这个改动把ICL的维护成本从几天压缩到几小时而且错误率大大降低。当然脚本生成的关键是模板的正确性模板一旦有错生成出来的所有文件都是错的所以模板要经过充分的验证。3.2 工具如何调用ICL从解析到仿真验证Tessent的IJTAG流程里ICL文件会被几个不同的组件用到。首先是tessent_ijtag_server它是核心的IJTAG网络解析与验证引擎负责加载ICL文件、构建网络拓扑、提供访问路径查询接口。当你在Tessent Shell里执行read_icl命令时实际上就是在调用这个server去加载文件。加载之后工具会对ICL做静态检查比如端口方向是否一致、网络是否可达、有没有未连接的悬空引脚等。接下来是pattern生成阶段。当你写完PDL并指定了目标instrument后Tessent会基于ICL构建的“网络模型”来计算一条从TDI到目标仪器再到TDO的完整路径同时确定需要配置哪些SIB以及配置这些SIB需要分几步完成。这个过程非常依赖ICL的准确性也决定了生成的pattern质量高低。同一条逻辑链如果ICL里的SIB描述顺序不同工具生成的配置序列可能就差好几个cycle。仿真验证阶段Tessent会生成带有IJTAG时序行为的Verilog testbench。这里ICL的作用体现在仿真模型中——工具会为每个instrument生成对应的行为模型模型中扫描寄存器的位宽、使能逻辑完全按照ICL来构建。如果你在ICL里把某个寄存器的位宽写错了仿真波形里就能看到数据移位时错位的现象典型表现是capture阶段捕获的数据跟预期值不一致。3.3 ICL与PDL的配合ICL和PDL是一对搭档但很多新人会把它们混为一谈。ICL描述的是“硬件网络结构”PDL描述的是“在硬件上执行的操作”。举个例子MBIST控制器的ICL里定义了它的ScanIn、ScanOut、AddrRegister、DataRegister等端口和寄存器结构PDL里则定义了一系列高层操作比如run_mbist_test这么一条PDL命令它内部实际展开的是一长串的移位、capture、update操作序列。而这些展开后的操作要落在物理网络上就必须依赖ICL定义好的寄存器位宽和连接关系。在Tessent里PDL和ICL文件的组合使用还有一个关键优势PIN级别的可移植性。同一个IP在项目A里它的IJTAG端口可能叫tdo_ip_a在项目B里可能叫tdo_ip_b但只要ICL文件里的端口映射关系正确同一个PDL文件不需要改动就能复用到两个项目里。这就是标准化的价值测试工程师只需要维护一份PDL描述操作行为网络差异由ICL和集成工具去消化。3.4 复用策略把ICL组织成可扩展的资产当项目里的复用的IP越来越多ICL之间的关系就不仅仅是“一个文件”这么简单。Tessent支持模块化加载多个ICL文件最后在顶层把它们拼接成一个统一的IJTAG网络。这时候就需要考虑命名空间隔离的问题了。不同IP的模块内部很有可能出现相同的命名比如很多IP都会把自己内部的SIB取名为sib_top如果没有命名空间隔离工具会在加载时报告冲突。Tessent的做法是在加载时通过模块实例化路径来区分不同上下文但在编写ICL时还是要养成统一命名的习惯用IP名做前缀可以避免大量的命名冲突和调试时间。另外ICL文件应该被当成一等公民进入版本管理。我见过不少项目RTL代码严格走git流转但ICL文件是发邮件传递的版本常常对不上。正确做法是让ICL文件和RTL源文件放在同一个仓库里并设置review机制任何RTL改动都要同步检查是否需要更新ICL。这个约束一旦落地能为你避开很多不必要的半夜调试任务。4. 实操与避坑ICL调试的完整现场4.1 静态检查阶段先过语法、再查语义在进入仿真之前第一步永远是静态检查。我常用的命令是check_icl或者read_icl加check参数看起来枯燥但多数语法和基础语义问题都能在这步暴露出来。语法问题包括漏了分号、括号不对称、找不到定义、端口未声明等。语义问题包括信号方向不一致、位宽不匹配、路径不可达、存在未初始化的端口等。我在实际项目中见过一个非常典型的语义错误某个IP的ICL文件里ScanOut端口声明了8bit宽度但实际RTL里只有1bit输出。这种错误在静态检查阶段如果检查不严格可能不会立刻报出来等到仿真测试时波形上就表现为数据总是错位而且错位的规律很固定——每读一次就少了7个bit的数据。这种问题定位起来非常吃力因为仿真波形往往是几十万行单靠人眼盯着看效率太低。最好的办法还是在静态检查阶段把位宽比对开了Tessent的read_icl命令支持检查端口位宽一致性如果报错直接定位到ICL行号就能快速修正。4.2 仿真阶段必须盯的几个信号如果静态检查都通过了但仿真还是出问题就需要回到波形上看了。我调试ICL相关仿真问题时一般会先盯住这几个信号TDI、TDO顶层数据路径上的数据流确认从TDI进入的数据经过SIB层级后能正确到达目标仪器的ScanIn。SIB控制信号通常是扫描寄存器里的控制bit确认配置序列里SIB的值按预期翻转在“旁路/连通”两个状态间正确切换。UpdateEn信号的时序确认在更新阶段、控制位能正确锁存。如果UpdateEn时序不对SIB的配置值可能没有真正生效导致后续数据全部流错方向。目标仪器的ScanEn信号确认仪器在需要工作时被正确使能在不工作时被隔离旁路。仿真调试时用Tessent的report_scan_path之类的命令查看当前工具计算出的扫描路径也是很有用的手段。它能列出从TDI到TDO经过哪些寄存器、每个SIB的分支状态这样你就能拿ICL描述的预期路径跟实际波形做对照定位是网络描述错还是时序行为错。4.3 常见问题的排查速查表我在多个项目里总结过一份常见的ICL问题排查表现在分享出来给大家做个参考问题现象可能原因排查建议read_icl报语法错误提示缺失分号/括号文件某处漏了分号或括号不匹配用带括号高亮的编辑器打开逐层检查也可用简化脚本闭合所有大括号再做差集工具报端口方向冲突ICL里某个端口的ScanIn/ScanOut方向与RTL的输入输出不对应到RTL顶层查端口方向在ICL里倒过来改生成的pattern中某仪器数据始终错位扫描寄存器位宽与RTL不一致对比ICL里位宽和RTL实现重点看是否有隐藏bit被忽略仿真中SIB状态始终切不到目标值UpdateEn时序不对或控制bit位映射错误检查SIB的更新阶段数据和更新信号时序确认控制bit对应的是ICL里的哪个端口某个深层仪器无法访问多级SIB嵌套网络里中间某级SIB的路径描述错误用report_scan_path逐层检查每一级SIB的配置序列找到无法到达的那一级工具解析ICL时内存溢出或卡死网络描述中存在大量无意义的层级嵌套或未知回环简化网络结构检查是否存在实际不存在的环路必要时拆分大模块这张表是我反复推敲过的基本覆盖了项目里八成以上的问题。其中“位宽不一致”和“SIB状态切不到”这两个问题出镜率最高也最难一眼看出来建议各位在工程交付前专门写一个脚本做全量比对。4.4 一个完整的调试案例我挑一个印象最深的调试案例来讲讲整个排查过程。当时有个第三方IP的ICL文件在Tessent里怎么都通不过静态检查工具报了一个很奇怪的错误“could not resolve reference to portscan_cell_0/Q”。第一眼看上去完全摸不着头脑因为ICL里确实没有定义这个端口。仔细排查才发现问题出在那个第三方IP的ICL是用他们自己的脚本自动生成的脚本在处理某个多bit寄存器时展开成了命名规则为scan_cell_0/Q、scan_cell_1/Q的多个单bit端口但展开之后连接关系里却还遗留了一个对整体寄存器端口的引用导致引用解析失败。这种问题如果遇到的是不开源的第三方工具可能真的就卡住了。但因为在Tessent流程里read_icl会输出具体的行号和上下文我顺着报错追到了连接关系那一段发现脚本展开逻辑缺了一个else分支导致特定条件下端口名没有替换干净。最后我在脚本里Patch了一下重新生成ICL文件才把整个流程跑通。从这个案例想说明的是很多ICL的坑本质上不是ICL标准的问题而是“生成ICL的脚本”的问题。如果你手里有几十个IP需要维护一定要给ICL的生成脚本做充分的回归测试不要相信一次生成就永远正确硬件迭代后脚本逻辑很可能悄悄被破坏。说到底ICL文件的本质是一种“描述性资产”它的价值不在于它能跑出漂亮的波形而在于它能长期稳定地、精确地反映芯片内部的IJTAG网络结构。我在实际维护ICL文件的过程中最深的体会是再先进的EDA工具也只是放大器你喂给它的ICL文件是垃圾它反馈给你的就是更复杂的垃圾。把ICL文件当作RTL代码一样对待做规范命名、充分验证、统一版本管理后续的项目才会越走越顺。这套标准化思路也是IJTAG标准本身真正想要传达的核心理念。
返回列表