形式验证和符号推理
符号推理,简单调研一下
符号 vs 模拟
形式验证和 UVM 验证方法(Functional Verification)本质出发点是不同的,一个基于符号逻辑推理,另一个基于模拟器。
比如有组合电路 A 和组合电路 B,要验证他们逻辑功能一致,即真值表一致。
⚠️以下内容有猜测部分,待调研工具具体实现补充
- Functional Verification:生成所有输入的可能组合,输入仿真器,对比输出结果
- Formality Verfication:根据描述得到二者的布尔表达式,证明二者等价
模拟器方法可以把待测元件当作黑盒,只需要关注输入和输出,UVM 本质也是用高级方法写 testbench;而形式验证需要把电路当作白盒对待。有点类似人工智能连接主义路线和符号主义路线区别。
如果考虑时序电路,引入状态输入空间用计算遍历不可行,就要人为约束状态空间了。
形式验证方法
SystemVerilog 中的 SVA(System Verilog Assertions) 包含大量形式验证的语法,工具链则是 Formality 最为出名,用于描述符号的格式是 CNF(Conjunctive Normal Form),日后可深入研究。
形式验证主要工具有 Binary Decision Diagrams[1]、 SAT (Satisfiability)Solver[2] 等。
将形式验证引入设计流
具体到 SVA 语法,形式验证实际就是在描述正确功能的波形图,只不过比波形图更抽象更有重点甚至可能更加直观。
现有设计过程中,验证占用了很大时间,最头疼的是验证很难和设计分开,小作坊没有时间建立 Ref Model,对同一个模块的验证和设计往往交织进行,无法分工处理,而验证和设计又相对不重叠。
尝试在设计写 spec 先用形式语言描述部分功能,一是使用规范的语法描述脑中过一遍,功能更加清晰;二是设计完成后,这部分文字可以直接复用验证。
计算所 23 年自动设计 CPU 的方法就使用的 BDD https://arxiv.org/abs/2306.12456 ↩︎
https://medium.com/leep3/從-sat-solver-玩-leetcode-37809cb61df ↩︎