什么是形式验证?
在IC设计中,需要通过DC工具将设计的RTL代码转换为网表,为了验证所生成的网表与RTL的功能是否一致,需要进行形式验证,形式验证是一种等价性检查
形式验证需要什么东西?
- 参考设计(Reference Design) 一般情况下指RTL
- 待比较设计(Implementation Design) 指综合后的网表
- 容器(Containers)
- 放入“r” -参考设计
- 放入“i” -待比较设计
- formality相关约束
什么时候需要做形式验证?
只要设计发生改变(对代码进行改动)
- 综合前后 -RTL比对DC综合网表
- DFT前后 - DC综合网表比对DFT网表
- 物理优化前后(PR) -DFT网表比对PR网表
形式验证是如何比较两个设计是否等价?
使用比较点(Comparie Point):比较输出是否正确
例如:输入10bit,即查看1024个输入对应的输出是否都正确相等
形式验证的流程
Step0-引导(Guidance):添加综合产生的.svf文件(在DFT前后与PR前后,不需要该步)
svf文件记录了综合所有的信息,包括:
- Object name change
- Constant register optimizations
- Duplicate and merged refisters
- Multiplier and divider architecture types
- Datapath transformations
- FSM re-encoding(Must be abled in Formality to be used)
- Retimming
- Register phase inversion
Step2a-读RTL(Read Referenece Dseign and Libs),并设置顶层
Step2b-读网表(Read Implementation Dseign and Libs),并设置顶层
Step3-设置约束(Set up),例如一些路径只走1端,就设置不走0,特别是DFT后,如dft_mode之类的引脚应当对于i文件和r文件都置0
Step4-匹配(Match)
Step5-比对(Verify)
形式验证工具
形式验证需要在fm_shell环境下进行,相关基本指令如下:
Typical Formality TCLK Script execation
fm_shell -f runme.fms |tee runme.log
Staring the GUI for UNIX
formality
或者
fm_shell -gui -f runme.fms |tee runme.log
Staring the GUI within a batch seession
fm_shell -f (setup) > star_gui
To view other invocation options
fm_shell -help
形式验证脚本
#step_1:Guidance
set_svf default.svf
#step_2a:Read Reference Design
read_verilog -r xxx.v
read_db -r xxx.db
set_top -r xxx
#step_2b:Read Implementation Design
read_db -i xxx.db
read_verilog -i xxx.0.v
set_top -i xxx.v
#step_3:set up
set_constant i:WORK/XXX/DFT_MD 0 #设置i文件的端口常0
set_constant r:WORK/XXX/DFT_MD 0 #设置i文件的端口常0
set__dont_verify_point i:/WORK/xxx/xx/xx #设置i文件中不需要verify的点
#step_4 & 5:Match and verify
match
report_matched -status unread > ../log/unread.rpt
report_unmatched > ../log/unmatched.rpt
report_balck_boxes > ./balck_box
verify
report_failing > ../log/failing.rpt
save_session ./formal -replace