第2章 VC Formal工具套件与验证流程:核心概念、原理机制、实战要点

2.1 问题背景

随着设计规模和数据通路复杂度上升,传统仿真验证面临两个难题:一是测试向量难以覆盖深度状态空间;二是覆盖率收敛周期过长。VC Formal 作为 Synopsys 形式化验证平台,通过数学推理取代向量采样,在断言验证、数据通路验证和协议验证中扮演关键角色。

工程观察:很多团队引入 VC Formal 时,将形式化验证等同于“跑一条命令”,结果在断言质量、约束环境和收敛管理上遇到困难。形式化验证能力不仅来自工具,更取决于工具链的合理组合与流程纪律。

2.2 核心概念

  • VC Formal:Synopsys 形式化验证平台,集成静态形式化验证(Static)、动态形式化验证(Dynamic)与应用级验证套件(Apps)。
  • 属性 / 断言(SVA):对设计行为的数学描述,是形式化验证的输入核心。
  • BMC(有界模型检查):在有限时间步内搜索违反属性的反例。
  • 全证明(Full Proof):在可达状态空间中证明属性对所有路径成立。
  • 形式化覆盖率(Formal Coverage):衡量属性检查对状态空间与逻辑行为的覆盖程度,指导收敛与签核。
VC Formal 验证流程与工具链 RTL + SVA 约束与环境 输入 / Spec VC Formal 编译集成 Setup / TCL BMC/证明 应用引擎 Static/Dynamic/Apps 反例/证明 结果分析 CEX / Proof / Failing 覆盖率收敛 签核关闭 Metric / Sign-off 核心价值:把“设计验证”从仿真采样转变为“状态空间推导”

2.3 原理机制

VC Formal 底层融合 SAT、BDD、SMT 等数学引擎,通过约束传播、状态抽象和位级推理,将 RTL 与断言转换为可判定的逻辑问题。

  • 状态空间搜索:与传统仿真不同,VC Formal 在给定边界内遍历所有可能的输入序列,而非采样若干向量。
  • 反例(CEX):命中属性失败时,自动生成可仿真的波形 / 时序图,帮助定位根因。
  • 证明与收敛:采用归纳法、抽象精化等技术,在资源限制下从“BMC 有界证明”向“全证明”收敛。
  • 约束求解:将 assume、constraint 与环境模型转换为求解器输入,保证验证状态合法可达。

2.4 流程步骤

  1. 属性与约束准备:梳理设计规格,编写 SVA 断言和形式化约束(assume / environment)。
  2. 工程配置与编译:使用 VC Formal 创建工程、读入 RTL、elaborate 顶层设计。
  3. 验证任务执行:按目标选择引擎,运行 BMC、全证明或 VC Formal Apps。
  4. 结果分析:区分证明(Proven)、反例(Failing / CEX)、未收敛(Inconclusive)三类状态。
  5. 覆盖收敛与回归:检查 Metric 覆盖率,补充断言或约束,将任务纳入 CI 回归。
# VC Formal TCL 脚本示例
create_project -name fifo_fv -dir ./work
read_file -format sverilog ./rtl/fifo.sv
elaborate -top fifo

# 读入断言
read_file -format sverilog ./tb/fifo_fv_props.sv

# 设置时钟与复位
create_clock -name clk -period 10 clk
set_constant rst_n 1

# 运行 BMC 20 步
bmc -depth 20 -property fifo_props

# 运行全证明
prove -property fifo_props

# 输出报告
report -summary
建议:项目初期先选 1~2 个核心模块建立完整的属性环境并跑通,再横向推广到其他模块,避免团队在流程未定型时大规模铺开。

2.5 案例说明

案例:FIFO 满信号与写使能的冲突检测

假设 FIFO 深度为 8,断言为:

assert property @(posedge clk) !(full && wr_en);

在 VC Formal 中运行 BMC 深度 8,立刻得到反例:FIFO 在连续写入 7 个周期后,第 8 个周期 full 拉高且 wr_en 仍为 1。通过波形定位,根因是指挥逻辑未在 full 时关闭写使能。修复后运行 prove,属性结果变为 Proven。

启示:BMC 适合快速找反例,全证明适合给出设计结论,两者需配合使用。

2.6 工具套件组成与流程总结

工具 / 模块 核心作用 适用场景
VC Formal Static 属性证明、BMC、全证明 控制逻辑、数据通路、协议检查
VC Formal Dynamic 动态形式化与仿真融合 复杂 SoC 系统级验证
VC Formal Apps 预置协议验证套件 AMBA、PCIe、DDR、USB 等
VC Formal DPV 数据通路形式化验证 算术单元、流水线、ALU
VC Formal Metric 覆盖率与收敛分析 验证进度评估、签核检查

2.7 误区提醒

  • 误区 1:把 BMC 结果当作全证明。BMC 只在有限深度内有效,深度不足会漏掉深层错误。
  • 误区 2:断言越多越好。错误或冗余的断言会拖慢引擎,并产生大量无效反例。
  • 误区 3:忽略约束环境。没有合理的 assume,引擎会进入非法状态,验证结果不可信。
  • 误区 4:只跑一次不管理资源。形式化验证需要按设计复杂度分层设置 timeout 和内存限制。
  • 误区 5:不上回归。形式化任务应与仿真一样纳入每日回归,防止 RTL 修改破坏已证明属性。

2.8 实践清单

  • ☐ 搭建 VC Formal 运行环境,确认 License 与 TCL 脚本通路正常。
  • ☐ 为设计关键控制点编写至少 3~5 条 SVA 断言,并设置合法的 assume 约束。
  • ☐ 使用 create_project 建立工程,读入 RTL 并完成 elaborate。
  • ☐ 先用 BMC 快速找反例,再对稳定属性执行 prove 全证明。
  • ☐ 收集并查看形式化覆盖率报告,针对未覆盖点补充断言。
  • ☐ 将证明任务封装为 TCL 脚本,接入回归流水线。