Synopsys Formality的使用

日期 版本 内容
2024/01/19 V0 初版

Synopsys Formality(简称fm)是用于形式检查的软件,简单来说就是检查SDC综合过程有没有改变HDL的功能。

我从来没有使用过Formality,也没有可用的脚本,只能自己摸索着写。

1. 需要的文件

  1. svf文件:SDC记录自己对HDL进行的操作,在fm中起到guidance的作用

  2. 原始RTL HDL文件

  3. 综合后网表HDL文件

  4. 数字库db文件:综合后的网表调用的都是数字库器件,因此需要综合后数字库的db文件

  5. 数字库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]

总结为以下步骤:

  1. Guidance:输入svf文件

  2. Reference:输入所有RTL文件,并指定顶层

  3. Implemented:输入综合后RTL文件,并指定顶层

  4. Database:GUI中Ref和Impl两步都有输入DB的操作,实际上整个项目的DB是公用的,做一次就可以了。SDC默认的GTECH和DesignWare不需要自己导入,自己只需要导入PDK数字库的.db文件

  5. Run:包括Match和Verify

  6. Debug:如果上一步没通过需要Debug

以下展示一个通过Verify检验正确的GUI画面:

image

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编写的。有几个地方做一些说明:

  1. set_top [r/l]:[name]r/l表示HDL所在的container为r(reference)或i(implemented),不要放错了。

  2. for ...:在外部写了一个filelist,将所有HDL文件的路径写进去,然后用这个for循环将这些文件名都拼成一个列表。一般只对reference文件需要,因为SDC综合只输出一个网表文件。

  3. set hdlin_warn_on_mismatch_message [msg_name]:强制将某种error降级为warning[2],避免程序因error卡住不继续进行。但是这是一种很危险的操作,在waive之前务必确保你知道这是什么错误,以及它是否真的可以被跳过。可以启动GUI之后点击错误信息,会弹出“SolvNet”给出相应的错误解释。

  4. 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

作出以下解释:

  1. mkdir:创建文件夹给fm软件存储文件,fm无权创建文件夹,因此需要在bash中提前建好。

  2. -file [tcl_file]:启动后自动引入tcl_file执行,类似于source命令。

  3. -gui:如果有这项,就会以GUI格式启动,反之不会自动启动GUI。

运行Linux脚本之后如果报错误Permission Denied,可以参考以下方法[3]

在命令行里执行一遍

chmod +x [bash_name].sh

经过试验,一般无需重复执行该操作。操作一次,以后只要是同名的bash都可以直接执行了。


  1. formality软件使用教程_formality使用-CSDN博客 ↩︎

  2. 求助formality 遇到FMR_ELAB 146 147问题 - 后端讨论区 - EETOP 创芯网论坛 (原名:电子顶级开发网) - ↩︎

  3. 运行shell脚本报错:Permission denied_shell 脚本里写路径 permission denied-CSDN博客 ↩︎

posted @ 2024-01-19 10:54  白发戴花君莫笑  阅读(816)  评论(0编辑  收藏  举报