形式验证——学习笔记

形式验证简介

  • 通过纯数学方法分析两个网表的逻辑是否完全等价
  • 一种静态比较,会遍历所有的组合保证逻辑等价性,不需要动态激励
  • 比仿真可靠性高!!!仿真覆盖率低,且后仿非常慢。

常用工具:

  • Synopsys: Formality
  • Candence: LEC

形式验证在设计流程中的位置:
在这里插入图片描述
1、在综合后:保证综合过程没有出错,逻辑正确
2、后端布局布线后:使用综合网表和和布局布线后网表进行比较(上图位置不正确,不用再STA后)

形式验证的应用

1、综合的网表与RTL对比做形式验证。保证综合过程没有逻辑错误。保证综合后的网表是想要的。

2、后端网表与综合后的网表对比做形式验证。保证后端没有引入逻辑错误。(后端做完就可以做形式验证,不一定要等到静态时序分析做完)

3、做ECO的时候,ECO后的网表与ECO后的RTL做形式验证。(ECO当芯片已经流片出去了,工厂只做了一个底层,但金属层还没做可以做metalECO,发现某些容易修的bug后可以利用一些冗余的cell改变某些连线来修掉这个Bug,修改后端网表的同时对RTL也进行相应修改,然后将这两个文件进行LEC比较)

LEC所需要的文件

  • 需要比对的两个文件,一个是标准的golden,一个是待比对的revised。

  • 各种库文件的verilog model

  • 约束文件:black box (IP)和pin constraint等

  • 所用的工具——LEC(或者Formality)

LEC输出的文件

  • 比较的结果报告

  • 保留结果的session文件

形式验证LEC的流程以及分步骤讲解

在这里插入图片描述
流程

  • setup mode:
    建立基本环境
    读入设计
    设置参数
  • LEC mode
    映射golden以及revised所有比较点
    比较设计
    检查结果

所有的命令都有使用mode的限制

LEC比较流程

  • 关键是所有的mapping point要一一对应映射

  • Mapping point主要有:
    输入输出primary inputs/primary outputs
    DFF
    Latch
    Black box
    Tie-z cell
    Cut point
    (后面两种比较少碰到,中间任何的组合逻辑都不是mapping point,只会比较输出和触发器)cut point是手动设置的两个点)
    示例:
    在这里插入图片描述
    比如3个触发器,经过一个组合逻辑驱动下一个触发器;首先LEC会确认RTL和网表中是否都又存在这些寄存器,然后3个触发器的输入有8种可能,最后再RTL和网表种遍历这些结果,看是否对应。

如何寻求帮助

  • man lec-command -v
  • help lec_command
  • LEC reference file/user guide

LEC命令行的两种模式

  • vpxmode:默认启动模式。运行效率较高。命令不同部分之间是空格。如:read library …大小写不敏感 用空格隔开。
  • Tclmode:传统模式。命令由不同部分直接由下划线连接。例如:read_library…(用的较少)
  • Tclmode大小写敏感。
    在这里插入图片描述

1、设置LEC环境

  • 设置环境变量,如顶层的名字
  • 创建目录结构,RPT等文件夹
  • 设置一些自定义命令等
  • add alias new_name original_command

2、读取库文件

  • 读取所有相关标准单元库的verilog model文件
  • 使用read library 命令读取verilog model。如果有多个verilog model需要一次性读入。
    例如:read library -both -verilog std_model.v std_mode2.v

3、读取设计文件

  • LEC把两个网表分别称为golden和revised。一般以RTL的作为golden。
  • read design -systemverilog -golden -sensitive(是不是大小写敏感) -root $working_design -file flist_rtl.f
  • read design -systemverilog -revised -sensitive -root $working_design -file syn.v

4、设置约束文件

  • 主要是对特定的一些pin给予约束,如RST设置成无效值,scan mode设置成无效值等,scan mode=0代表是功能模式。
  • 设置比较的参数,比较的方法。如按照名字映射还是按照功能映射。默认第一顺序都是按照名字映射。
    可以手动设置下mapping point

5、LEC compare

  • 进入LEC mode (set system mode LEC)
  • 再次对没有map上的点做映射,并比较golden和revised中所有的mapping point

6、检查LEC结果

检查是否有没有mapping的点****一般有两种情况会导致unmap

  • extra unmap:只在其中一个design里有
  • Unreachable: 定义了reg但是没用到,这些point与PO直接没有路径

RTL中的mapping point与NET中的 mapping point一样多,且一一映射。(理想情况)

实际RTL多一些,多余的往往是RTL冗余的点造成的,这种情况是extra unmap。代码冗余不会有实际的问题。冗余的代码没有通路输出到PO就是unreachable。

检查所有mapping的点是否都是逻辑等价的

  • Equivalent
  • Inverted-equivalent(反相等价)
  • Sequential-merge(写了两段代码功能上比较接近,工具就会把这两段代码融合到一起,比如第一段代码有20个触发器,有5个是冗余的,最后会把它合并成15个,以减小面积)
  • Non-Equivalent
  • Abort (工具比较不出来)

前面三个都是表示相等
相反相位相等,最后到了端口上还是一一对应的。designer关心的应该是端口的输出结果。前面四个碰到的比较多,最后的比较少。

  • report mapped points
  • report unmapped points
  • report compare data
  • report black box
    图形化界面可以打开电路,更有利于Debug

7、保存结果

  • 保存数据文件: save session my.session
  • 恢复之前保存的数据文件 :restore session my.session

LEC实操

LEC启动方式

  • 普通启动方式:lec -gxl (图像化界面)(用的更多)
  • 纯命令行启动方式:lec -nogui -gxl
  • 启动并运行写好的脚本:lec -gxl -dofile top_lec.tcl
  • 打开或者关闭图形化界面:set gui on/off

流水线加法器形式验证

在这里插入图片描述

在这里插入图片描述

top_lec.do


  set log file  ./top_lec.log -replace
  dofile ./script/set_env.do

  reset

  read library -Both -sensitive -Verilog /home/XXX/fab/synopsys90nm_lib/stdcel/verilog/saed90nm.v

  read design -systemverilog -Golden -sensitive  -root $working_design -file ./source_file/flist.f
  read design -systemverilog -Revised  -sensitive  -root $working_design ./source_file/syn.v


set flatten model  -seq_merge -seq_constant  -SEQ_Redundant
set datapath option -auto -verbose
set analyze option -auto

// add renaming rule a2 \[ _  -golden -type DFF
// add renaming rule a1 ] _  -golden -type DFF
set flatten model -seq_constant
set flatten model -latch_transparent
// 
add pin constraints 0 RST  -Both

// add pin constraints 0 SCAN_MODE_REG[0] -module scan_ctrl -Both


dofile ./script/lec_black_box.do

// would map the invert phase
set mapping method -phase

set system mode lec 

// add mapped points top/a/b top/a/d  -noinvert
// analyze setup
analyze setup
remodel -seq_const -repeat
set mapping method -name first -phase -UNREACH
map key points

add compared points -all

compare > $RPT_OUT/lec_$working_design.log

report compare data > $RPT_OUT/lec_verbose_$working_design.log
report mapped points > $RPT_OUT/lec_mapped_points.rpt
report unmapped points > $RPT_OUT/lec_unmapped_points.rpt

report black box -class Full -Both -Instance -Hier -Hidden > $RPT_OUT/lec_black_box.rpt
report statistics > $RPT_OUT/lec_statistics.rpt

save session my.session

set_env.do


setenv file_version     cp_test
setenv working_design   plus_pipe

setenv source_file      source_file

setenv RPT_DIR RPT
setenv OUT_DIR OUT

setenv RPT_OUT  $RPT_DIR/$file_version

//$::env(RPT)
tclmode
if {[file exist RPT]} {
    echo "RPT already exist"
} else {
    system mkdir RPT
} 
vpxmode

// system mkdir ./RPT -f
system rm    ./RPT/$file_version -rf
system mkdir ./RPT/$file_version

补充:
formality软件使用教程

  • 27
    点赞
  • 278
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
回答: 当出现"pull 分支报错 fatal: Need to specify how to reconcile divergent branches"的错误时,这意味着在合并分支时存在冲突,需要指定如何解决这些冲突。在SourceTree中,有几种方法可以解决这个问题。 一种方法是使用回滚提交。回滚提交是指将分支恢复到之前的某个提交状态。在SourceTree中,你可以切换到线上分支,然后找到要回滚的提交记录,右击该提交记录,选择回滚,然后点击确定即可。这样就可以将分支恢复到指定的提交状态。\[2\] 另一种方法是重置当前分支到某个提交。重置当前分支是指将当前分支的指针移动到指定的提交,丢弃之后的提交记录。在SourceTree中,你可以切换到线上分支,然后找到要重置的提交记录,右击该提交记录,选择重置,然后点击确定即可。这样就可以将当前分支重置到指定的提交状态。\[2\] 如果你只需要合并某个分支的部分代码,可以使用遴选方式。具体操作是,在开发分支的提交记录上找到要遴选到线上分支的那条提交记录,右击该提交记录,选择遴选,然后点击确定即可。这样就可以将指定的提交记录合并到线上分支中。\[3\] 希望以上解答对你有帮助。 #### 引用[.reference_title] - *1* *2* *3* [【Git】常用命令和sourceTree的使用](https://blog.csdn.net/sj13036141506/article/details/128708160)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值