1、Formality概述:什么是形式验证、Formality在芯片设计流程中的位置、Formality与传统仿真验证的对比
1.1 什么是形式验证?
形式验证,说白了就是用数学方法证明你的设计是对的。
你想想看,传统仿真跑一万个case,可能还漏掉某个边界情况。但形式验证不一样——它用数学逻辑把所有可能的情况都覆盖了。嗯,这里要注意,它不是“跑”出来的,是“证”出来的。
我个人习惯把形式验证分成两类:
- 等价性检查:检查两个设计是不是功能一样。比如RTL代码和综合后的网表。
- 属性检查:检查设计是否满足某些特定属性。比如“这个信号永远不会同时为1”。
Formality就是做等价性检查的工具。我在项目中遇到过不少次,综合工具把代码优化得面目全非,但Formality一跑,嘿,功能等价,心里就踏实了。
核心思想:形式验证不是“测试”,是“证明”。它告诉你“你的设计在所有情况下都是对的”,而不是“在跑过的case里是对的”。
1.2 Formality在芯片设计流程中的位置
Formality在整个芯片设计流程里,扮演的是“守门员”的角色。它出现在几个关键节点:
- RTL vs 综合网表:综合完成后,检查综合工具有没有改错功能。
- 综合网表 vs 布局后网表:布局布线后,检查有没有因为时序优化引入功能错误。
- 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的基本流程和命令行操作。到时候我会分享一些我踩过的坑,保证有用。