简介:这份PDF是Cadence JasperGold连接性验证应用(Connectivity Verification App)的官方用户指南,版本为2020.03,面向芯片设计与IC验证工程师。工具聚焦形式验证中的连接性检查,利用数学推理验证设计逻辑,能覆盖信号路径、接口和总线连接中容易被传统仿真遗漏的隐患。指南系统讲解了完整验证流程:环境配置、输入网表与约束准备、连接性检查定义、验证任务提交、结果报告分析以及错误修复迭代,并介绍了定制脚本、第三方工具集成、性能优化及系统级连接性验证等高级主题。资源包仅有1个PDF文件,大小约874KB,内容紧凑规范,适合需要系统掌握JasperGold形式验证方法的工程师阅读,目前已有423人学习/下载。通过该指南,读者可快速搭建验证环境,学习如何定义端口连接规则、追踪信号流向、定位并修复连接风险,从而在复杂IC设计中提升验证效率与设计可靠性。
1. JasperGold Connectivity App 用户指南:把 RTL 连接性从「仿真碰运气」变成「形式化证明」
做 SoC 集成的人最清楚,顶层几千条互联总线里悄悄接错一根,往往要等仿真跑到很深才能炸出来,甚至直接流片后才在硅片上现形。JasperGold Connectivity Verification App 是 Cadence 在形式验证(formal verification)领域专门处理这类问题的工具:把你在 worksheet 表格里定义的连接关系当成判决书,逐条去证明 RTL 和它对得上,不靠仿真激励碰运气,而是用数学证明的方式穷尽所有条件分支。这份 2020.03 版用户指南,覆盖正向与反向连接流、map workbook 表格式输入、连接分类与结果判读,以及从 IFV/IEV 迁移的过渡说明。我拿到之后通读了三遍,把里面真正影响项目进度的关键点拆出来写成这篇笔记,适合做 IP 集成和 block/unit/chip 级连接性检查的 SoC 设计、验证工程师案头参考。
2. 连接性验证在验什么:正向/反向流、连接分类与结果判读
2.1 连接性验证的本质:RTL 与 worksheet 的等价性证明
Connectivity Verification App 做的事情,一句话讲就是「穷尽验证 RTL 匹配 worksheet 格式里定义的连接关系」。以前我用仿真查这种问题,得针对每个条件连接专门写定向激励,比如某个信号只在enable == 1'b1 && mode == 2'b01时才从 A 走到 B,仿真要覆盖这种条件,得穷举所有相关状态组合,既耗时又容易漏。形式化验证的思路完全不同,它直接对设计空间做数学证明,把所有可能的状态和条件分支都纳入考量,不需要你一条条去构造激励。
连接性检查的适用范围很广,原手册里列的典型场景就有 IP 集成、设计规格核对、物理布局后的连接确认,层级上还可以用在 block、unit 或 chip 级。我自己的经验是,IP 集成阶段收益最大——各个子模块来自不同团队甚至不同厂商,接口定义各有各的写法,靠人眼对 netlist 上的连接关系不现实,靠仿真又覆盖不全,这个场景简直是 Connectivity App 的主场。
提示:如果你是第一次接触这个工具,先别急着看命令,把「连接定义在表格里、工具负责证明 RTL 符合定义」这个模型想清楚,后面所有的操作都是围绕这个模型展开的。
2.2 正向连接流与反向连接流:什么时候必须用 reverse
原手册第一章把基本流程分成了正向连接流和反向连接流(Reverse Connectivity Flow)。正向流好理解:从 source 出发,沿着信号路径查它最终有没有连到预期的 destination。反向流则是反过来的思路,从 destination 出发,往回追溯信号到底是从哪里来的。
实际项目中我倾向于优先考虑反向流,原因很现实:top 级集成时,信号路径上往往串着 mux、buffer、level shifter、时钟门控之类的东西,正向从 source 一路查过去,中间节点太多,每过一个逻辑都要判断「这个算不算连接的一部分」,很容易在中间层迷失。反向从最终 sink 往回追,更像是验证人员脑子里的问题——「这个寄存器的数据到底从哪来」,答案直接对应到 worksheet 里的定义。
原手册第三章整章都在讲 Reverse Connectivity 的生成逻辑,核心包括 source 和 destination 规格说明、连接复杂度控制、搜索停止行为和搜索深度行为,以及 map refinement 流程。这些概念单独看都挺抽象,但把它们串起来理解就顺了:反向连接的第一步是「猜」源端,然后通过细化流程逐步锁定唯一答案,搜索深度和停止条件则是控制这个猜测过程不要发散到荒谬的范围。
2.3 Console 界面与连接分类怎么读
Connectivity App 的 GUI 里,Console 区域是日常打交道最多的地方。原手册第二章专门有一节讲 Connection Classifications(连接分类),这玩意是判断每一条连接检查结果的核心依据。界面上不是简单给个 pass/fail,而是会把每条连接按分类归好,让你能快速筛出问题项。
我一般会先按分类筛选,把结果分成三堆:明确通过的、明确失败的、既不是通过也不是失败而是处于未定状态的。前两种好理解,真正需要花时间的是第三种——未定状态通常意味着规则没写全、搜索深度不够,或者设计本身存在工具无法判定的抽象边界,这时候问题往往不在 RTL,而在你的验证环境定义。很多人第一次用这个工具,看到大量 undetermined 就开始怀疑设计,这是最容易翻车的心态。
2.4 验证指标:pass 之外还有 undetermined
Verification Indicators(验证指标)是结果判读里容易被忽略的一环。它告诉你每一条连接到底是被「充分证明了」,还是只达到了「看起来对但有空隙」的程度。举个例子,如果某条连接经过了黑匣子模块,工具无法穿透黑匣子确认内部实际连接,给出的 pass 其实是有条件的 pass,这时候指标里会体现出来。
注意:区分「理论 pass」和「验证 pass」。理论 pass 是逻辑上确实通了,验证 pass 是工具在给定抽象和深度下证明通了。二者不一致时,优先怀疑验证环境,而不是怀疑 RTL。
我自己养成的习惯是每次跑完先看验证指标汇总,而不是直接看 pass/fail 列表。指标里如果出现大量「assumed」「bounded」这类字眼,说明验证环境里加了太多假设,结果的可信度要打折扣,这时候继续往下分析 fail 是浪费时间。
3. 反向连接生成:Source/Destination 规格、搜索边界与 Map Refinement
3.1 Source Instance 与 Destination Instance 的三种指定方式
反向连接的起点是把 source 和 destination 说清楚。原手册第三章把规格分成三种情况:只指定 Source Instance(源实例)、只指定 Destination Instance(目的实例)、以及同时指定 Source and Destination Instance。第三种情况通常用于回路(loop-back)场景,比如一个模块的输出经过外部路径又绕回自己的输入。
指定实例的方式,常见做法是在 GUI 里直接点选设计层次,脚本里则用 Tcl 写路径表达式。这类工具的命令语法一般遵循下划线分隔开关的约定,开关不区分大小写,可选参数用方括号,多选一用竖线,我在脚本里习惯这样写:
# 指定 destination 实例,允许工具反向搜索 source set dest_inst [get_instance "tb_top/u_core/u_ahb/u_slave_interface"] # 用方括号包裹可选开关,竖线表示多选一 set conn_rule [add_connection \ -destination $dest_inst \ -search_mode (forward | reverse | both)]这里get_instance是拿到设计层次上的实例句柄,add_connection是添加一条连接检查规则,-search_mode控制搜索方向。实际命令名可能因版本而异,但思路通用:先把边界实例定死,再让工具在边界内部做形式化搜索。参数上我一般把-search_mode设成reverse而不是both,因为 both 会让搜索空间翻倍,大部分时候没必要。
3.2 Target 规格:把连接边界说清楚
Target 规格是反向连接里另一个关键维度,它定义的是「连接的目标边界」。原手册里 Target Specifications 单独成一节,强调的是连接要到哪一层、哪个引脚、哪条总线才算数。这个边界如果定得太粗,工具会把很多无关信号也纳入搜索;定得太细,又会把合法的连接路径拦腰截断。
我一般按这个顺序定 target:先看 worksheet 里这条连接定义的是信号级还是总线级,再看路径上有哪些层次需要穿透、哪些层次应该停住。寄存器边界通常要停,组合逻辑层级的 buffer 和 inverter 可以穿透,黑匣子模块则必须停——因为工具看不到黑匣子内部,穿过去只会产生大量不可判定的结果。
这里要特别提醒一个误区:target 不是越多越好。我见过有人在每条连接上都加了一堆 target 条件,结果工具为了满足所有条件疯狂扩大搜索空间,跑一晚上都收不了。target 的粒度应该跟 worksheet 定义保持一致,不要自己额外加戏。
3.3 控制连接复杂度:黑匣子与抽象边界
连接搜索的复杂度是指数级的,路径上每多一个分支点,搜索空间就翻一倍。原手册里 Controlling Complexity of Connections 这一节讲的就是怎么把这个空间压到可控范围。核心手段是抽象:把不影响连接判定的逻辑块标记为黑匣子,让工具直接穿透,而不是逐门逐 cell 去展开。
实际项目里,我一般会把三类模块设成黑匣子:已经单独验证过的成熟 IP、与当前检查无关的电源管理逻辑、以及模拟/混合信号模块。这三类东西展开后既消耗内存又产生不了有效信息,设成黑匣子可以直接把搜索空间砍掉一个数量级。
提示:黑匣子是把双刃剑。设得太狠,连接经过黑匣子内部的路径会被当成「假定成立」,验证结果的可信度下降;设得太少,搜索发散的效率问题又会反噬。建议先跑一版宽松的(少设黑匣子),看工具报哪些路径搜不动,再针对性地把那条路径上的模块黑匣子化。
3.4 Search Stop 与 Search Depth:两个决定「搜到哪为止」的参数
原手册把 Search Stop Behavior 和 Search Depth Behavior 分别拿出来讲,足见这两个参数的重要性。Search Stop 决定的是「什么时候停下来报告找不到连接」,Search Depth 决定的是「从起点出发最多穿透多少级逻辑」。
这两个参数调不好,要么漏报要么跑死。Search Stop 设太严,工具稍微遇到一个未建模的逻辑就直接 fail,产生一堆假错;设太松,工具会一路追到设计的最源头,把无关信号全包进来。Search Depth 同理,设小了合法连接被截断,设大了搜索空间爆炸。
我的调参顺序是固定的:先用默认深度跑一版,把结果按 undetermined 和 fail 分类看;如果 undetermined 集中在某几条路径,说明深度不够,只对这几条连接单独加大深度;如果 fail 里出现大量「路径穿过了不该穿过的逻辑」的报告,说明深度设大了,该用黑匣子而不是靠深度限制来收边界。一句话,深度是兜底手段,黑匣子才是主要手段。
3.5 Map Refinement 流程:从候选源收敛到唯一源
反向连接里最核心的机制是 Map Refinement,原手册专门用一节讲这个流程。简单说,反向搜索第一步会先产出一堆「候选源」,然后通过细化流程逐步锁定唯一的、与 worksheet 定义一致的源。这个收敛过程不是一次性完成的,而是多轮迭代:每轮细化基于上一轮的结果和新增的约束条件,把不满足候选剔除掉。
这个流程里最容易出问题的点是「引入了错误的假设」。比如你在 worksheet 里把某个信号的位宽定义错了,反向搜索会基于这个错误定义去筛选候选源,结果可能把所有正确路径全部排除,最后锁定的唯一源反而是错的。而且这个错误非常隐蔽,因为你看到的结果是收敛且唯一的,没有对比参照。
所以我的习惯是:反向连接收敛出唯一源之后,不急着接受结果,先手工抽查三到五条关键连接,用正向方式人工核对一遍。特别是跨时钟域的信号和经过多级 mux 的信号,这两个地方是 map refinement 最容易错误收敛的重灾区。
4. Map Workbook 表格式输入:Checker 接口、列结构与可选属性
4.1 Checker Instance Interface:连接检查的判决机构
JasperGold Connectivity App 的输入设计很有特色:它不是让你写一堆验证脚本,而是把连接定义放在表格(workbook)里,工具通过 Checker Instance Interface(检查器实例接口)把表格里的规则挂到设计上。checker 实例相当于一个判决机构,挂在目标端口上,实时检查经过的信号连接是否满足表格定义的规则。
这个设计的好处是,验证环境的表达跟设计规格的表达形式保持了一致——设计团队用表格描述连接关系,验证工具也吃表格,不需要中间翻译一层。坏处是表格格式本身成了约束,列名、关键字拼错一个字符,工具不会报错,而是把整行规则默默忽略掉,这类问题排查起来非常费劲。我第一次用的时候就有过这种经历:跑了一晚上,pass 率 100%,后来发现有一半的规则根本没被加载,完全是白跑。
4.2 Map Workbook 的列结构与关键字
原手册第四章开头讲 Input Format 时,把输入分成 Checker Instance Interface 和 Map Workbook Format 两大部分。Map Workbook 是连接定义的载体,每一行描述一条连接关系,列结构里包含源信号、目的信号、所属层次、连接类型等关键字段。工具的全局配置里设好 checker 实例的位置和接口定义,workbook 负责提供连接数据。
典型 work sheet 里需要关注的列信息如下:
| 列含义 | 典型内容 | 容易踩的坑 |
|---|---|---|
| 连接标识 | 连接名/编号 | 重名会导致规则互相覆盖 |
| 源信号 | 层次路径 + 信号名 | 路径写法不统一(大小写) |
| 目的信号 | 层次路径 + 信号名 | 总线标注方式不一致 |
| 连接类型 | 直连/经过逻辑/经过黑匣子 | 类型描述与 RTL 实际不符 |
| 生效标志 | 激活/暂不生效 | 拼写错误整行被忽略 |
关于关键字,我的经验是先用小样本把「最小可用的 workbook」跑通,再往上叠加字段。别一上来就把几百行的完整定义灌进去,一旦结果里出现大面积 undetermined,你根本分不清是格式问题还是设计问题。先用十条连接把格式验证明白,再逐步放开,这个节奏能省掉大量回头排查的时间。
4.3 可选属性:控制检查范围,但也容易静默翻车
原手册里 Optional Attributes 一节讲的是那些可以不填、但填了能精细化控制行为的属性。常见的用途包括标注某条连接是否当前生效、限制搜索范围、指定连接经过特定层次的规则等。
这些属性的坑在于,它们大多是「非强校验」的——你填错了或者填了个不支持的枚举值,工具不报错,只是默默把这条规则当成无效处理。最典型的情况就是生效标志字段,拼写从active写成actve,工具不会提示,但这条连接的检查就永远不会执行。这是我在多个项目里反复遇到过的坑,毫不夸张地讲,它比设计本身的问题更能消耗时间。
注意:每轮迭代跑完,先确认生效的连接数跟 workbook 里的总行数对得上。对不上就先查属性字段,再去查设计问题,顺序反了会白折腾很久。
4.4 从 IFV/IEV 到 JasperGold Apps:输入格式的过渡信号
原手册第 4 章末尾专门留了一节讲 Transitioning from IFV/IEV to JasperGold Apps,对用惯了旧工具的老工程师来说,这一节是必读的。IFV/IEV 时代的验证思路以命令驱动为主,规则的表达方式跟表格驱动差的不是一星半点。
迁移阶段最容易出问题的反而不是命令语法,而是思维模式。IFV/IEV 里你是在「写一段检查程序」,JasperGold Apps 里你是在「填一张描述表」。前者出了问题你在代码里找,后者出了问题你得先怀疑表格格式再怀疑工具行为。这种思维切换需要一点时间,我自己的做法是第一个月严格按 workbook 的列结构走,不在表格里写工具不支持的扩展字段,等完全适应了再考虑高级特性。
5. 排错实战:从 jg.log 到 hs_pid_errXXXX.log 的完整排查路径
5.1 现象:工具行为异常,但 GUI 里看不出原因
原因:GUI 展示的是结果,不是过程。工具内部很多关键事件(命令执行顺序、触发时刻、内部状态变化)只记录在 log 文件里。
解决:先开 jg.log,里面包含所有命令和工具消息。排查原则是定位触发问题的「那一步」。比如内存暴涨、搜索发散、结果异常,都能在 jg.log 里找到对应时间点的命令和工具输出。我习惯每次跑完不管结果对不对,都顺手存一份 jg.log,否则出了问题连现场都没有。
5.2 现象:验证环境突然跑飞,或者 pass 率莫名变化
原因:session 层面的事件(license 掉线、tool idle 状态变化、forced timeout、数据库自动保存、工具退出)不会显示在普通命令日志里,但它们会直接影响 session 的完整性。
解决:查 jg_console.log。这个文件记录了 license 事件、工具空闲状态变化、分析会话活动、强制超时设置、数据库自动保存和工具退出等信息。比如你发现某次跑批在凌晨三点自动停了,十有八九是 forced timeout 或者 license 回收导致的,这个线索只能在 jg_console.log 里找到。
5.3 现象:工具崩了,core dump 出现,但不知道内部哪里出了错
原因:内部错误(internal error)触发时,JasperGold 会生成一个hs_pid_errXXXX.log文件,通常伴随 core 文件,里面是相关代码的堆栈轨迹。但这个文件不一定每次都能生成——目标目录必须要有写权限,没权限就静默跳过。
解决:先确认目录可写,再看堆栈里的调用序列。另一个实际教训是,别只拷 log 文件不拷 core,支持团队定位内部错误很多时候靠的是 core 里的完整现场。还有一点,红帽系统上把/etc/redhat-release的内容一块打包,这个文件对判断内核和系统版本比uname -a直观得多,支持团队通常也会主动问这个。Fedora 上对应的文件是/etc/fedora-release,可以看但官方不支持,别指望工具在 Fedora 上有完整的兼容性验证。
5.4 现象:同一个脚本在同事机器上跑得好好的,到我这里就报错
原因:环境差异。工具对操作系统版本、库文件、甚至安装路径的敏感度比你想象的高。
解决:用工具安装目录/bin下的checkMachine.sh脚本输出机器和 OS 信息,连同redhat-release一起发给支持团队比对。我处理过一例类似的问题,最后发现是两台机器上某个共享库版本不一致导致的,这个靠猜猜不出来,必须靠环境信息的完整收集。另外,上报问题前先用capture_testcase命令打包现场,这条命令能用 Tcl 脚本和设计文件完整复现问题,支持团队处理这类 case 的速度会快很多,命令的可选开关还能附带相关文件和截图,GUI 里敲help capture_testcase -gui能看到完整用法。
5.5 现象:怀疑工具结果不对,但又说不出具体哪里不对
原因:验证环境假设过多,导致结果偏离真实性。这是最隐蔽的一类问题,工具不会报错,结果也收敛,但结论是错的。
解决:按严重程度给 case 分级(Critical/Important/Minor),把精力集中在真正阻塞进度的问题上。Critical 只留给「没有解决方案就无法继续」的情况,不要滥用,否则支持团队的响应节奏会被你打乱。我自己的经验是:结果可疑时,先把验证指标里所有 assumed、bounded 类标注列出来,逐条判断这些假设是否合理,比反复重跑更有效。
6. 从 IFV/IEV 迁移到 JasperGold Apps:三个具体切换技巧
迁移这件事,命令语法是表面,真正要切换的是三个习惯。
第一,把「写检查程序」的习惯换成「描述检查规则」的习惯。IFV/IEV 时代你面对的是一个命令解释器,思路是命令流式的;JasperGold Apps 里你是先填 workbook 再跑流程,思路是数据驱动式的。我刚开始迁移时总想着在脚本里加各种流程控制,后来发现自己想复杂了——把连接定义写清楚,剩下的事情交给工具的证明引擎就行。
第二,别把旧工具的路径写法直接带过来。新工具对层次路径、总线表达、通配符的支持细节跟旧版本不完全一致,最稳妥的办法是用最小样例重新验证路径语法,确认无误后再把真实设计导进去。
第三,结果报告阅读方式要主动调整。IFV/IEV 的报表偏线性,JasperGold Apps 的报表是分类驱动的,连接分类、验证指标、undetermined 状态这些概念在旧工具里没有对应物,得重新建立读报表的直觉。
从那以后,我每次拿到新版本的 JasperGold,都强制先翻一遍 Table Format 那一章——版本之间的 workbook 列变化比你想的大,属性字段一个拼写变更,可能就让你上一轮的规则全部静默失效。养成这个习惯之后,我在连接性验证上翻车的次数明显少了很多。希望帮到你。
本文还有配套的精品资源,点击获取