1、Formality概述:什么是形式验证、Formality在芯片设计流程中的位置、Formality与传统仿真验证的对比

1.1 什么是形式验证?

形式验证,说白了就是用数学方法证明你的设计是对的。

你想想看,传统仿真跑一万个case,可能还漏掉某个边界情况。但形式验证不一样——它用数学逻辑把所有可能的情况都覆盖了。嗯,这里要注意,它不是“跑”出来的,是“证”出来的。

我个人习惯把形式验证分成两类:

  • 等价性检查:检查两个设计是不是功能一样。比如RTL代码和综合后的网表。
  • 属性检查:检查设计是否满足某些特定属性。比如“这个信号永远不会同时为1”。

Formality就是做等价性检查的工具。我在项目中遇到过不少次,综合工具把代码优化得面目全非,但Formality一跑,嘿,功能等价,心里就踏实了。

核心思想:形式验证不是“测试”,是“证明”。它告诉你“你的设计在所有情况下都是对的”,而不是“在跑过的case里是对的”。

1.2 Formality在芯片设计流程中的位置

Formality在整个芯片设计流程里,扮演的是“守门员”的角色。它出现在几个关键节点:

  1. RTL vs 综合网表:综合完成后,检查综合工具有没有改错功能。
  2. 综合网表 vs 布局后网表:布局布线后,检查有没有因为时序优化引入功能错误。
  3. ECO修改后:手动改网表时,检查改得对不对。

我记得有一次做项目,后端工程师为了修时序,手动改了网表。改完后我让他跑Formality,他还不乐意,说“就改了两根线”。结果一跑,真出问题了——他改的那根线影响了另一个模块的逻辑。从那以后,团队里没人敢跳过Formality了。

我的建议:在综合后、布局后、ECO后,都跑一遍Formality。别嫌麻烦,流片回来发现问题,那才叫真麻烦。

1.3 Formality与传统仿真验证的对比

传统仿真验证和Formality,说白了是两种思路。一个靠“跑”,一个靠“证”。

对比项 传统仿真验证 Formality形式验证
验证方式 输入激励,观察输出 数学证明,无需激励
覆盖率 取决于测试用例质量 100%覆盖所有输入组合
运行时间 随测试用例增加而增加 与设计复杂度相关,通常较快
适用场景 功能验证、系统级验证 等价性检查、属性检查
局限性 可能漏掉边界情况 对大型设计可能状态爆炸

你可能会问:“那是不是有了Formality,就不用仿真了?”

当然不是。Formality和仿真验证是互补的。仿真验证适合做系统级的功能验证,而Formality适合做设计转换后的等价性检查。我一般是这样用的:

  • RTL阶段:用仿真验证功能
  • 综合后:用Formality检查等价性
  • 布局后:再用Formality检查一遍
  • ECO后:Formality是必须的

避坑指南:我曾经见过一个团队,只做仿真不做Formality。结果综合工具优化时,把某个状态机的逻辑优化错了。仿真没跑出来,流片回来才发现。嗯,那叫一个惨。所以,仿真和Formality,一个都不能少。

1.4 小结

Formality形式验证,说白了就是给你的设计上一道保险。它用数学方法证明设计转换前后的功能等价,让你睡得踏实点。

我个人觉得,做芯片验证,心态要稳。仿真验证帮你发现bug,Formality帮你确认没引入新bug。两者配合,才能把风险降到最低。

下一章,我会带你看看Formality的基本流程和命令行操作。到时候我会分享一些我踩过的坑,保证有用。