第二章FPV App 流程与 GUI 导览

FPV App 完整流程

Formal Property Verification (FPV) App 是 JasperGold 最核心的应用,也是其他 App 的基础。FPV 的标准工作流程如下:

  1. 启动 FPV Appjg -fpv
  2. 分析设计:使用 analyze 命令加载 Verilog/VHDL/SVA 文件
  3. 细化设计:使用 elaborate -top <module> 构建设计层次
  4. 指定时钟和复位clock / reset 命令
  5. 配置证明参数:trace length、引擎模式、时间限制等
  6. 运行证明prove -all 或 GUI 中点击证明按钮
  7. 分析结果:查看 proven/cex/bounded_proven 属性,调试反例
  8. 迭代优化:添加约束、调整抽象、增加引擎时间

FPV App GUI 导览

启动 FPV App 后,GUI 主要分为以下区域:

官方 FPV App 流程图
用户指南给出的 FPV App 流程图,把整个流程收敛成五步:Read design and propertiesanalyzeelaborate)→ Add basic tie-off constraintsstopatassume)→ Define proof environmentclockreset)→ Prove propertiesprove)→ Interactive Debuggingvisualize
和上面那份八步清单对照着看:官方五步把「配置证明参数」并入了 proof environment,把「迭代优化」并入了 Interactive Debugging。另外注意官方在 analyze/elaborate 之后、定义时钟复位之前,专门列了一步 Add basic tie-off constraintsstopatassume)——先把不关心的部分绑定住,再谈证明环境。

证明状态指示器

JasperGold 默认把状态拆成两套:运行状态(run status)有效性状态(validity status)。Task Tree 顶部的进度条按三种颜色归类有效性状态:

颜色包含的状态
🔴 红色cexunreachablebounded_unreachable (user)
🟢 绿色provencoveredbounded_proven (user)
🟡 黄色unknownundeterminedbounded_proven (auto)
注意状态的准确名称:断言被违反时的状态叫 cex(counterexample found),不是 "failed";有界证明的状态叫 bounded_proven,分 (auto) 和 (user) 两种,其中 bounded_proven (user) 属于绿色而非黄色。covered 也归在绿色里。

各有效性状态的准确含义(Appendix B,Table B-2):

状态含义
unknown初始有效性状态(在处理开始之前
undetermined证明深度(proof bound)小于目标深度(target bound)
bounded_proven (auto)目标深度由工具自动提取;证明深度已达到或超过目标深度
bounded_proven (user)目标深度由用户通过 set_prove_target_bound 指定并已达到
proven / covered属性已证明 / 覆盖点已命中
cex / unreachable找到反例 / 覆盖点不可达
error属性编译超时,或证明过程发现 task 中的假设与设计、或假设彼此之间不一致

运行状态(Table B-1)是另一套独立的取值:unprocessed(尚未开始证明)、queued(排队等待处理)、processing(正在证明)、processed(证明已结束)。

容易混淆的一点unknown 是"还没开始跑"的初始状态,而不是"跑了但超时"。"跑了但没收敛"对应的是 undetermined;"根本没跑"对应的是运行状态 unprocessed

界面截图

FPV App GUI 界面(第 45 页)
FPV App GUI 界面(第 46 页)

FPV 验证方法论:多轮收敛流程

FPV 不是"跑一次 prove 就结束"的工具,而是一个多轮迭代收敛的过程。理解这个流程是掌握形式验证的关键。

三轮证明策略

1第一轮:快速浅证明

设置较小的 set_max_trace_length(如 10-20),使用默认引擎模式。这一轮的目标不是完整证明,而是快速发现浅层 bug。如果在深度 10 就能找到反例,没必要花时间跑深度证明。

经验:第一轮通常在几分钟内完成,能发现大部分明显的设计错误。

2第二轮:加深证明

增大 trace length(如 50-100),换一组不同的引擎(官方示例第二轮用的是 {K I N}),并设置每个属性的时间限制(如 30s)。官方示例对这一轮的注释就是"用不同的引擎验证剩余属性"。

3第三轮:逐个攻克 remaining 属性

第一轮和第二轮后仍未证明的属性,需要逐个分析:是属性本身有问题?约束不够?还是设计太复杂需要抽象?对难证明的属性单独调整引擎和时间限制。

还有一个很有用的手段是用已证明的断言去帮助证明更难的断言:一条断言一旦被证明,就可以把它当作假设来使用,工具提供 assume -from_assert 自动完成这个转换。这属于 assume-guarantee 技术——在次要 task 中证明一条属性,然后在主要 task 中假定它成立。

什么算"验证完成"?

FPV 的 signoff 标准不是"prove 跑完了",而是以下条件同时满足:

常见误区:看到所有绿色就认为验证完成。但如果约束过强,形式引擎可能在一个被限制得过小的状态空间内"证明"了属性——这是假 proven。一定要用 cover 属性确认约束空间足够大,合法的场景能被覆盖到。

FPV 的局限性

来源文档

  • jaspergold_apps_userguide.pdf