Synopsys Formality的使用
日期 | 版本 | 内容 |
---|---|---|
2024/01/19 | V0 | 初版 |
Synopsys Formality(简称fm)是用于形式检查的软件,简单来说就是检查SDC综合过程有没有改变HDL的功能。
我从来没有使用过Formality,也没有可用的脚本,只能自己摸索着写。
1. 需要的文件
-
svf文件:SDC记录自己对HDL进行的操作,在fm中起到guidance的作用
-
原始RTL HDL文件
-
综合后网表HDL文件
-
数字库db文件:综合后的网表调用的都是数字库器件,因此需要综合后数字库的db文件
-
数字库HDL文件:不确定是否一定需要,想法是作为综合后网表实例化调用的器件库
2. GUI使用
2.1. 进入软件GUI
先进入安装路径。然后输入
fm_shell -gui
直接以GUI形式打开fm。
如果已经在fm_shell里面,但是不是以GUI形式启动的,也可以输入start_gui
命令手动启动。但是注意,不要在TCL脚本的开始写start_gui
,因为start_gui
进入GUI,这个命令并未结束,直到用户手动关闭GUI才会继续向后执行。所以如果在TCL中写start_gui
应该写在末尾。
2.2. 使用过程
这部分不再赘述,可以参考其他教程[1]。
总结为以下步骤:
-
Guidance:输入svf文件
-
Reference:输入所有RTL文件,并指定顶层
-
Implemented:输入综合后RTL文件,并指定顶层
-
Database:GUI中Ref和Impl两步都有输入DB的操作,实际上整个项目的DB是公用的,做一次就可以了。SDC默认的GTECH和DesignWare不需要自己导入,自己只需要导入PDK数字库的.db文件
-
Run:包括Match和Verify
-
Debug:如果上一步没通过需要Debug
以下展示一个通过Verify检验正确的GUI画面:
2.3. 从GUI提取TCL语句
注意,在GUI中执行的每个命令实际上都有对应的TCL语句。在按照GUI方法走一遍流程时,每一步的TCL命令都会在窗口中实时显示,可以把窗口中显示的TCL命令复制下来并写到脚本中。
3. 脚本启动
3.1. 软件TCL
TCL部分是fm启动后调用的语句,因此全是TCL语句。
下面是我根据GUI过程一步步堆起来的TCL代码:
# Set var
set filelist "../ft/rtl_files.f"
set myFiles {}
for {set f [open $filelist r];} {[gets $f line]!=-1} {;} {
lappend myFiles $line ; # get the names in filelist and turn into a list
}
close $f
set basename TOP; # Top module name
set dirname ../sdc/result/$basename; # SDC file directory
set svfname ${dirname}.svf
set ntlname ${dirname}_netlist.v
# Import svf
set_svf -append ${svfname}
###################
# RTL files
###################
# Import RTL verilog
read_verilog -container r -libname WORK -05 ${myFiles}
set hdlin_warn_on_mismatch_message "FMR_ELAB-146 FMR_ELAB-147";# waive specific error
# Read RTL DesignWare
# Read db
read_db { ../lib/svt/scx_csm_18ic_tt_1p8v_25c.db }
# Set RTL top
set_top r:/WORK/$basename
###################
# Implemented files
###################
# Import RTL verilog
read_verilog -container i -libname WORK -05 ${ntlname}
# Read RTL DesignWare
# Set RTL top
set_top i:/WORK/$basename
###################
# Run
###################
# Run match
match
# Run verification
verify
# Report
report_status > ./report/${basename}_status.rpt
report_designs > ./report/${basename}_design.rpt
report_parameters $basename > ./report/${basename}_param.rpt
report_multidriven_nets > ./report/${basename}_multidriven.rpt
report_hierarchy $basename > ./report/${basename}_hier.rpt
report_analysis_results > ./report/${basename}_analysis.rpt
report_failing_points > ./report/${basename}_fail.rpt
exit
以上脚本基本就是按照GUI输出TCL编写的。有几个地方做一些说明:
-
set_top [r/l]:[name]
:r/l
表示HDL所在的container为r(reference)或i(implemented),不要放错了。 -
for ...
:在外部写了一个filelist,将所有HDL文件的路径写进去,然后用这个for循环将这些文件名都拼成一个列表。一般只对reference文件需要,因为SDC综合只输出一个网表文件。 -
set hdlin_warn_on_mismatch_message [msg_name]
:强制将某种error降级为warning[2],避免程序因error卡住不继续进行。但是这是一种很危险的操作,在waive之前务必确保你知道这是什么错误,以及它是否真的可以被跳过。可以启动GUI之后点击错误信息,会弹出“SolvNet”给出相应的错误解释。 -
report_* > [filename]
:这是一类TCL命令,用于导出fm检查报告。
如果你不知道有哪些带report
的命令,可以使用通配符格式查询,语法为help report*
;而对于已知名称的命令,可用help [cmd]
或[cmd] -help
查询参数和用法。
>
表示将内容写入某个文件,此外还可以用>>
表示在某个文件末尾追加。
3.2. Linux启动bash脚本
该Linux脚本(.sh)文件从Linux系统命令行启动fm软件,并自动调用以上TCL文件运行。
#! /bin/csh -f
mkdir report
fm_shell -file ./fmtcl.tcl -overwrite -name_suffix FM -work_path ./WORK -gui
作出以下解释:
-
mkdir
:创建文件夹给fm软件存储文件,fm无权创建文件夹,因此需要在bash中提前建好。 -
-file [tcl_file]
:启动后自动引入tcl_file
执行,类似于source
命令。 -
-gui
:如果有这项,就会以GUI格式启动,反之不会自动启动GUI。
运行Linux脚本之后如果报错误Permission Denied
,可以参考以下方法[3]:
在命令行里执行一遍
chmod +x [bash_name].sh
经过试验,一般无需重复执行该操作。操作一次,以后只要是同名的bash都可以直接执行了。