第五章证明引擎原理与选择

Proof Orchestration(证明编排)

JasperGold 的 Proof Orchestration 自动管理多个证明引擎的调度和切换,是证明自动化的核心。

为什么需要 Proof Orchestration

不同属性有不同的特征,适合不同的引擎。手动选择引擎需要丰富经验。Proof Orchestration 自动:

Proof Orchestration 如何工作

它同时启动多个引擎(Engine Race),监控各引擎的进展。当一个引擎进入 plateau(长时间没有新进展)时,编排器会:

如何控制 Proof Orchestration

# 设置引擎模式
set_engine_mode {K I N B L P}

# 设置时间限制
set_prove_time_limit 120s
set_prove_per_property_time_limit 30s

引擎算法概览

引擎算法适用场景
B / BMCBounded Model Checking(SAT 有界模型检测)查找浅层 bug(短 trace 的反例)
I / Interpolation基于 Craig Interpolation 的模型检测中等深度属性的完整证明
K / K-InductionK 归纳法需要归纳证明的属性(如不变量)
NBMC 变体(深界 BMC)深界属性查找反例
L / PDRProperty Directed Reachability(IC3/PDR)安全属性的完整证明,特别适合控制逻辑
PBDD 基础引擎小规模复杂属性
MBPModel Based Projection特定类型的高级证明
引擎模式选择指南
引擎模式选择指南

Engine Race

Engine Race 同时启动多个引擎竞争证明同一个属性,第一个完成的引擎获胜。这在 ProofGrid 环境中特别有效:

# ProofGrid 自动启用 Engine Race
set_proofgrid_mode on

Engine Mode 选择指南

场景推荐引擎模式
快速查找 bug(初始验证){B N}(BMC 优先)
不变量证明{K L I}
复杂控制逻辑{L K I B}(PDR 优先)
数据通路{B N I}(BMC+Interpolation)
全面证明(回归){K I N B L}(全部引擎)

Bounded Proof Information

当 BMC 引擎达到时间边界仍未找到反例时,产生有界证明(bounded proof)。这意味着:

处理 State-Space Explosion

状态空间爆炸是形式验证的主要挑战:

引擎选择决策:不是记名字,是理解特性

新手最常问的问题是"我应该用哪个引擎?"答案不是记住某个引擎名字,而是理解每个引擎擅长什么,然后根据问题特征选择。

核心引擎特性对比

引擎代号擅长不擅长
BMCB找浅层反例(深度 < 50 周期),速度快不能完整证明(只证明到有限深度)
K-InductionK, N完整证明属性成立,特别适合数据通路和不变量需要辅助不变量,对深时序属性慢
InterpolationI中等深度证明,不需要用户提供不变量对某些类型属性不完备
Heavyweight TraceHt深层反例搜索,复杂控制逻辑耗时较长
Heavyweight ProofHp深度证明,难证明的属性耗时最长
BMC-MotorBm深 BMC(比普通 BMC 搜得更深)仍然是有界的
TriageTri自动调度其他引擎,先试快的再试深的全自动,不适合精细调优

引擎选择策略

1先用默认或 Tri 引擎

不指定引擎模式让工具自动选择,或用 set_engine_mode {Tri} 让 Triage 自动调度。这一步能快速解决 70-80% 的属性。

2对 remaining 属性换引擎

第一轮后剩下的属性,根据类型换引擎:控制逻辑的 fail 用 Ht/Bm 深搜,需要证明的属性用 K/I/N,特别难的用 Hp。

3对特别难的属性手动调优

少量 remaining 属性可能需要:增大时间限制、添加辅助不变量、黑盒化部分逻辑、数据路径抽象。

状态空间爆炸的信号

当你观察到以下现象时,说明遇到了状态空间爆炸:

经验法则:flop 数是状态空间的粗略指标。500 flop 以下通常容易证明;500-2000 flop 需要调优;2000 flop 以上几乎总是需要抽象和分模块验证。

复杂度控制手段

来源文档

  • jaspergold_engine_selection.pdf