Agentic AI-based Coverage Closure for Formal Verification

这篇文章讲的是什么

这篇文章讨论的不是“让 LLM 从零做完整 formal verification”,而是更具体的一个环节:

如何利用 agentic AI 去做 formal verification 里的 coverage closure,也就是“把还没覆盖到的 RTL 区域尽量补上”。

在已有 formal verification 流程和 Saarthi agent 框架基础上,再加两个 coverage 相关 agent,让系统能读 coverage report、定位 coverage hole、自动生成新的 SystemVerilog assertions / cover properties,然后反复跑 formal 工具,直到 coverage 提升。

所以这篇文章的定位很明确:

1. 它不是一个完整的“AI 验证工程师”从头到尾替代方案。
2. 它更像 Saarthi 的一个增强模块。
3. 它解决的是 formal flow 中非常现实、也非常耗人的一个痛点:coverage 老是收不齐。


背景知识:

1. 什么是 formal verification

formal verification 可以理解成:不是靠随机仿真去“试”,而是用数学方法去“证明”设计在所有可能输入下是否满足某些性质。

比如你写一个 RTL 模块,仿真只能测一部分输入情况;formal 则是尽量在状态空间上穷举或推理,检查某个 property 是否总成立。

2. 什么是 SVA

SVA 指 SystemVerilog Assertions,也就是 SystemVerilog 里的断言/性质描述语言。你可以把它理解成:

“我希望电路在满足某个前提时,后面必须出现某种行为”的形式化表达。

例如文中的 Listing 2:

如果 `(a && b)` 在时钟上升沿成立,那么下一拍 `c` 应该等于上一拍的 `d1`。

这种 property 可以拿给 formal 工具证明,或者找反例。

3. 什么是 coverage closure

验证里有一个现实问题:你写的 property 到底有没有把 RTL 中的重要逻辑覆盖到?

比如一个 if/else:

1. if 分支被证明过、被触发过;
2. else 分支从来没被触发;

那 coverage 就不完整。

formal coverage 本质上是在问:

1. 设计里的哪些 RTL 语句、分支、表达式被验证环境真正触达了?
2. 哪些还没被 exercise 到?
3. 没覆盖到是因为没写相关 property,还是因为约束太强、根本到不了?

所谓 coverage closure,就是把这些 coverage hole 逐步补齐。

4. 为什么 coverage closure 很麻烦

因为它不是单纯“再写几个断言”。

你得先判断:

1. 哪些语句没覆盖;
2. 它们属于 if/else、case,还是普通语句;
3. 相关控制条件是什么;
4. 对应的时钟、reset、信号关系是什么;
5. 这个 hole 是真的可达,还是环境约束把它堵死了;
6. 新生成的 property 会不会写错、写重复、写得过强或过弱。

这件事很吃经验,也非常耗人,所以作者觉得它很适合交给 agentic AI 试一试。


一、引言

引言先强调一个行业事实:验证经常占项目时间的大头,文中甚至提到可达项目时间的 60%。而 coverage 又常常是 sign-off 的硬指标。

作者的切入点不是“formal verification 自动化”这种特别大的口号,而是:

现有自动 assertion generation 和 formal execution 流程即使能跑起来,最后还是经常留下 coverage gap。

这个判断是合理的。因为很多自动化工作主要关注:

1. 根据 spec 生成 assertion;
2. 把 assertion 丢给 formal 工具跑;

但并不一定会系统性地问:

“哪些 RTL 分支其实还没被覆盖到?”

因此,作者提出的三个贡献都围绕 coverage:

1. 自动 gap 分类;
2. 定向 property 生成;
3. 迭代式 coverage closure。

从问题定义上说,这篇文章没有夸大到“AI 取代 formal engineer”,而是瞄准 formal 工程里一个真实且可量化的子问题,这一点是加分的。

二、 Background

第二部分分成两小节:

1. Agentic workflows。
2. Formal coverage。

前半部分基本是在解释 agentic AI 的典型特征:任务拆解、提议-批判-修复循环、多 agent 协作、工具调用、人类监督等。这些内容不新,更多是铺垫。

后半部分 formal coverage 的讲解更有实际价值。作者用一个很小的 RTL 片段(Listing 1)和一个 SVA(Listing 2)说明 line coverage 是怎么来的。

1. RTL 里有一个 if/else。
2. 如果 formal tool 只证明或触达了 if 分支对应的行为,而 else 分支没有被 exercise。
3. 那么 line coverage 就不会是 100%。

作者借这个例子强调一个常被忽略的问题:

coverage 不完整,不一定是设计有 bug,也可能是:

1. assertion 没写到位;
2. environment constraint 太强;
3. proof 深度不够;
4. 某个分支根本没被形式化地驱动到。

所以 coverage closure 本身就是一个推理和建模问题,而不只是“多写点 assertion”。

三. Methodology 总览

Figure 1 其实不是本文新方法图,而更像 Saarthi 的总流程示意。图里大致包含:

1. 从设计规格和 RTL 出发。
2. 生成 SVA。
3. 证明性质。
4. 分析 CEX。
5. 更新 SVA。
6. 做 formal coverage,最后 sign-off。

Figure 2 则把 multi-agent 执行方式画得更清楚:lead agent、verification agent、critic agent、executor agent,再加 group chat manager 和 formal tool。

为什么 coverage closure 被设计成 agent 问题:

1. 一部分 agent 负责理解任务和上下文;
2. 一部分负责生成形式化 property;
3. 一部分负责检查质量;
4. 一部分负责调用工具、看结果、决定是否继续迭代。

从研究角度讲,这两张图更多是在借已有 Saarthi 框架给本文方法做托底,而不是本文最强的原创部分。

coverage closure 子流程

真正属于本文自己的部分,是 Section III-B 以及 Figure 3、Figure 4 展示的 coverage pipeline。

作者的方法流程可以概括成:

1. 先把 RTL、已有 SVA 文件送进 formal verification tool。
2. tool 跑完后生成 coverage report。
3. 如果没有 hole,就直接 sign-off。
4. 如果有 hole,就进入 agentic AI coverage stage。
5. coverage hole analyzer 读取 coverage report 和 RTL 上下文,定位未覆盖区域。
6. SVA property generator 根据分析结果生成新的 assertions / cover properties。
7. 把新 property 合并进 SVA 文件。
8. 再次调用 formal tool,重新跑 coverage。
9. 重复这个循环。

Figure 3 画的就是这个最基础的闭环。它虽然不复杂,但很重要,因为它把“coverage 提升”这个目标落到了一个明确的输入输出链条里。

Coverage Hole Analyzer

Coverage Hole Analyzer 的任务不是直接写 assertion,而是先把“coverage hole 到底是什么”结构化。

论文里说它会做几件事:

1. 定位未覆盖 RTL 代码的位置。
2. 恢复 surrounding context,也就是周围的结构和语义上下文。
3. 识别 hole 所属模块、时序行为、输入输出信号、前置条件。
4. 判断它属于 if/else、case、always_ff、always_comb 等哪种结构。
5. 把这些信息压成精简 JSON,供下游 agent 使用。

文章中 Listing 3 给了 agent 的 system prompt 和目标,大意是让它做 RTL coverage hole 分析,并带强制代码抽取能力。Listing 4 则展示了一个 JSON 输出例子。

这里的设计思路是合理的:

1. 不让生成 agent 直接啃原始 coverage report 和整份 RTL。
2. 先做一次“结构化中间表示”。
3. 再让 property 生成建立在这个中间表示之上。

这相当于把大模型任务拆成“理解 hole”与“生成 property”两步,降低了复杂度。

但这一块也带来一个明显风险:如果 analyzer 的抽取不准,后面所有步骤都会被污染。作者在实验分析里也承认,coverage hole analyzer 的 RTL 抽取质量会直接影响最终 proven rate。

SVA Property Generator

在拿到 JSON 输出后,SVA Property Generator 开始生成针对性 property。

文中 Listing 5 给了这个 agent 的定义和目标。它的约束很具体,例如:

1. 只能使用已有信号。
2. 要匹配现有 timing style。
3. 对 `always_ff` 优先使用 `|=>` 这种时序写法。
4. 尽量生成单 statement 形式的 property。

这些约束非常像真实工程经验。

1. 写法是否符合原工程习惯;
2. 命名是否重复;
3. 是否和已有 SVA 文件兼容;
4. reset、clock 语义是否正确;
5. property 是否 traceable 到原 coverage location。

Listing 6 给了一个生成例子:

这个例子本身不复杂,但它能帮助你理解作者想做的事情:

对于一个未覆盖的简单语句 `c <= a + b`,agent 不是写自然语言解释,而是生成一个真正能送进 formal 工具的 SVA。

这一步把“语言理解”落到了“EDA artifact 生成”上,是整篇文章最实际的部分。

Figure 4 把两个 coverage agent 以及 preprocessing 的关系画了出来:

1. coverage report 先经过预处理;
2. 进入 Coverage Hole Analyzer;
3. 输出给 SVA Property Generator;
4. 生成新 SVA;
5. 再回 formal verification。

coverage closure 不是一次性问答,而是一个流水线。

也就是说,作者并没有把这个问题建模成“给 LLM 一份 report,让它一次性吐出所有答案”;而是设计成一个可迭代、可插拔、可插入 HIL 的流程。

迭代机制

论文提到每次更新 SVA 文件后,formal tool 会重新执行,生成新的 coverage report。然后 agent 再根据新的 hole 更新 property 集合,直到达到目标 coverage。

这其实比“生成一个最终 property 集合”更接近现实。

因为真实项目里 coverage 是动态变化的:

1. 你补了一条 property,可能带出新的 uncovered branch;
2. 也可能让某些原来被掩盖的问题暴露出来;
3. 甚至可能生成过强 property,导致证明难度上升。

作者还提到,遇到纯静态分析解决不了的情况,可以引入 expert agent 或 HIL 来避免 over-constraint 和复杂边界误判。

四、实验

实验部分用更新后的 Saarthi + coverage agents,在多个设计上做比较,包括:

1. ECC
2. CIC Decimator
3. AXI4LITE
4. Automotive IP
5. Memory Scheduler

这里既有开源设计,也有内部工业设计。虽然规模不算特别大。

作者使用两个 KPI:

1. Proven percentage:LLM 生成的 property 中,有多少最终被证明成功。
2. Coverage:经过完整 formal flow 之后得到的 coverage。

 coverage 提升和 property 质量不完全等价。你可能生成了很多 property,coverage 上去了,但 proven rate 反而下来了。

Table I 对比了“without coverage agents”和“with coverage agents”,并分别测试 GPT-4.1、GPT-5、Llama3.3。

这张表最值得读的地方,不是单纯看 coverage 有没有提升,而是看三个变量之间的关系:

1. 生成了多少 property;
2. proven rate 变化如何;
3. coverage 最终涨了多少。

先看 ECC:

1. 不加 coverage agents 时,GPT-5 coverage 是 70.30%。
2. 加了 coverage agents 后,GPT-5 coverage 到 92.11%。

这个提升非常显著,说明在这类设计上,coverage closure agent 确实有效。

再看 AXI4LITE:

1. GPT-5 从 45.85% 提升到 53.59%。
2. GPT-4.1 从 27.87% 提升到 36.63%。
3. Llama3.3 从 24.82% 提升到 51.29%。

这里也能看到明显提升,但不同模型差异很大,说明这个流程对基础模型能力仍然敏感。

再看 Automotive IP:

1. GPT-4.1 coverage 从 80.48% 到 83.04%,提升有限。
2. GPT-5 反而从 72.67% 到 79.05%,有提升但不夸张。
3. Llama3.3 从 5.81% 到 38.87%,提升巨大但绝对值仍不算高。

这说明:当设计复杂、或者模型本身能力不稳定时,这套流程并不能保证所有维度都漂亮。

再看 Memory Scheduler:

1. GPT-5 coverage 从 46.39% 到 67.91%,提升显著。
2. proven rate 也从 45.45% 到 90.29%,这一点很亮眼。

综合看,Table I 能支撑一个中等强度的结论:

coverage agents 大多数情况下能提升 coverage,而且复杂设计中提升往往更明显。

但它不能支撑“agentic AI 已经稳定解决 formal coverage closure”这种更强结论。

Figure 5 把不同设计、不同模型、加不加 coverage agents 的 coverage 指标画成对比图。

这张图的作用主要是让趋势更直观:

1. 几乎所有设计在加 coverage agents 后都比基线更高;
2. GPT-5 整体表现最好;
3. Llama3.3 波动较大;
4. 提升幅度和设计复杂度、基础 coverage 状态都有关系。

图和表配合起来看,会更容易得出一个客观判断:

这篇文章的方法不是“在所有设计上都暴涨”,而是“多数情况下稳定增益,个别场景提升有限甚至伴随 proven rate 下降”。

我认为这篇文章一个比较好的地方,是它没有把结果写成无条件胜利叙事。

作者明确提到:

1. 有些情况下,coverage 上升了,但 proven rate 下降了。
2. 原因是新加入 property 虽然能覆盖更多 RTL,但这些 property 可能更难证明。
3. 如果 Coverage Hole Analyzer 抽取上下文不准,或者 LLM 生成了错误/重复 property,也会影响 proven rate。

这一点很重要,因为 formal verification 不是“多写一点 property 就一定更好”。如果 property 写得不严谨、过强、过弱、重复、甚至和设计 intent 不一致,反而可能制造新的噪声。

作者还说,目前这些结果是在没有 HIL 的情况下获得的,未来把 HIL 插进去,可能会进一步提高效果。

这句话可以理解成两面:

1. 正面:说明纯自动流程已经有一定效果,还有提升空间。
2. 反面:也说明当前 fully autonomous 还不够稳,很多时候还是需要人把关。

四、个人看法

问题

第一,创新性更多来自 workflow 集成,而不是新算法。它更像工程整合型工作。

第二,实验规模有限。

第三,评测深度还不够。

第四,依赖上游抽取质量。

Coverage Hole Analyzer 一旦定位错、抽 context 错、理解 precondition 错,下游 property 生成就会被带偏。这使得系统鲁棒性很依赖第一步。

第五,coverage closure 不等于 verification closure。

文章提升了 formal coverage,但这不自动意味着:

1. property 语义就都正确;
2. design intent 就被完整刻画;
3. sign-off 风险就真的消失了。

如果只盯 coverage 数字,可能会高估系统实际价值。

 这篇文章说明了一个现实趋势:EDA 里的 agent 真正有价值的地方,往往不是“替代所有工程师”,而是吃掉某个高重复、高上下文依赖、但又能通过工具反馈闭环的子任务。coverage closure 就很符合这个特点。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐