- assert 它是一种描述,关于期望你的设计的某些属性一直为真的描述
- assume 是对验证环境的约束,意味着是条件,这些条件在环境中永远为真。
- cover 覆盖点被期望偶尔是对的;
- 用自动设计的波形来理解设计的电路原理;
- 用来衡量验证的状态。
常用命令
avemc [-gui/f]:启动AveMC
read_desin:从文件中读取设计,并执行其所有模块
prove:执行形式化验证
reset:重置属性为Undetermine
clear/exit/quit:清理工作并退出
show_design_info:查看更多更详细的信息
show_prop:显示待验证的断言属性,即形式化验证的验证目标。
show_cons:显示验证环境中的约束,即形式化验证的前提条件。
show_init:查看所有寄存器的初始值,这时的初始值就是寄存器的复位值。
add_cons:添加约束断言
rm_cons:删除约束断言
add_prop:添加cover或者assert
rm_prop:删除cover或assert
copy_task:制作任务副本
crese_task:创建一个新的验证任务
del_task:删除一个任务
get_active_task:获取当前被激活的任务
get_tasks:获取所有任务
cut:信号打断
clk_ana:查看工具找到的所有的时钟信号
def_clk:定义时钟
def_rst:定义重置信号
ave_trace:显示一个属性的反示例波形
cex_wave:显示一个属性的反示例波形
目录
一、启动命令
1.avemc [-option]中各个option的解释
- -f:以脚本模式启动AveMC,启动之后直接运行-f后面所跟的tcl脚本。
- -gui:以图形化用户界面运行AveMC。
- -h:显示avemc启动选项,查看AveMC启动命令指南、软件版本及安装路径、license使用情况deng信息
- -log:log和结果的保存路径,默认为avis.log文件及avis目录。
- -no_exit:在运行完-f之后的脚本之后,不退出avemc,留在交互式界面继续调试。
- -override:覆盖之前的log路径,如果不加这个选项,会自动将上一次的log和结果目录改
- 名成avis.log.bak.X和avis.bak.X。
- -usage:显示AveMC所有的tcl命令使用指南。
- -work_dir:设置avis.log和avis的存放路径,默认为当前运行目录。
2.AveMC 提供得三种不同运行方式:
① 交互式界面,启动方式为运行 avemc 命令:
- avemc
用于日常的调试、验证工作,启动之后,用户可以手动 source 待执行的 tcl 脚
本或者手动输入各种 tcl 命令来完成验证工作和调试。
②图形化界面,启动方式为 avemc 命令后加上-gui 选项:
- avemc -gui
启动 avemc 的图形化用户界面,用户可以手动通过图形按键完成接下来的一系列操作。
③脚本模式,启动方式为 avemc 命令之后加上-f 选项:
- avemc -f <tcl 脚本>
这个模式下,avemc 启动之后自动执行-f 之后的 tcl 脚本,默认情况下执行完 tcl 脚本所有命令之后会自动退出 avemc。该模式适用于回归测试的场景。
如果在执行完 tcl 脚本之后,用户希望留在 avemc 交互式界面,则需要在 avemc 启动命令后添加-no_exit 选项。运行完毕后,avemc 会留在和 1 一样的交互式界面。
- avemc -f <tcl 脚本> -no_exit
3.AveMC支持的硬件语言语法
- Verilog:包括 verilog95 和 verilog2001 可综合部分。
- SystemVerilog:包括 SystemVerilog2005、2009、2012、2017 可综合部分。
- SystemVerilog Assertion:基于 SystemVerilog 的断言。
- VHDL:VHDL2008。
-verilog_95,-verilog_2000,-sysv_2005,-sysv_2009,-sysv_2012,-sysv_2017,-sysv(对应最新版的SystemVerilog,在当前版本里等同于-sysv_2017),-vhdl_2008。Systemverilog Assertion包含在在SytemVerilog的语法规范里,使用和SystemVerilog相同的选项。
二、读入设计和验证文件的命令
1.AveMC 读入设计和验证文件的两种方式:
① 单步读入法,一般适用于读取单一硬件语言语法的设计和验证文档,如下:
read_design -top <顶层模块名> -<硬件语言语法选项> <设计及验证文档名>
② 两步读入法,将设计和验证文件读入分成 analyze 和 elaborate 两步,其中 analyze 命令可以使用多次,而 elaborate 命令只能有一个。这里 analyze 读 入所有的设计和验证文档,elaborate 则对这些文档进行逻辑建模。一般适用于读取不同语法混合的设计和验证文档,简单的多步读入的命令如下:
analyze -start -<硬件语言语法选项 1> <设计及验证文档名>
analyze -end -<硬件语言语法选项 2> <设计及验证文档名>
elaborate <顶层模块名>
2.读入设计和验证文件选项
① 用于 analzye(同样适用于 read_design)
-f:读取设计及验证文档文件列表
-mfcu:多文件编译,所有的文件将被放在同一个编译单元中进行编译,因此文件读入的先后顺序不再重要。
-sfcu:单文件编译,每个文件有一个单独的编译单元,因此文件读入的现后顺序会影响编译结果。和-mfcu 不可同时使用。-sfcu 是默认的编译方式。
-define:设定编译时的 RTL 宏定义,例如 -define TYPE=1, 在编译时,TYPE 会被当做1 来编译。
-start, -end:当有多个 analyze 命令时,需要给第一个 analzye 命令加上-start,给最后一个 analyze 命令加上-end。
-v <文件名>:定义编译库文件,-v 后指定的文件不会被直接编译。当编译发现有未定义的模块时,工具会自动去-v 定义的文件中寻找该模块并进行编译。
-y <文件夹名>:定义编译库文件夹,-y 后指定的文件夹中的文件不会被直接编译。当编译发现有未定义的模块时,工具会自动去-y 定义的文件夹中存在的文件里寻找该模块并进行编译。
-libext :定义可以在-v 和-y 中被搜寻的文件扩展名,有助于减少库文件的搜索范围。还有一组用于替代指定单一编译语法的选项,用于指定某一个特定的扩展名文件采用何种语法来编译。
② 用于 elaborate(同样适用于 read_design)
-bb_inst, -bb_module, -no_bb_inst, -no_bb_module:这是一组用于指定黑盒处理的选项,详细请参考章节“设置黑盒”。
-generic:用来重写顶层模块的参数设置,例如:-generic WIDTH=8,在顶层设计中,将 WIDTH 改写成 8。
-hier_tree:基于层次树进行综合建模,适用于处理设计中有跨层次跨模块调用的情况。
三、统计信息查看和基本设置
1.统计信息查看
- show_design_info 命令:查看一些更多更详细的信息,在运行 show_design_info 命令时,可以使用-dump 选项将设计信息打印到结果文件夹(默认为 avis)下的文件中。
- show_module_inst <模块名>命令:列出该模块在设计中的所有实例化单元。
- show_prop:显示待验证的断言属性,即形式化验证的验证目标。
- show_cons:显示验证环境中的约束,即形式化验证的前提条件。
2.基本设置
① 时钟信号
- clk_ana 命令:查看工具找到的所有的时钟信号。
- set_opt -default_clk on:自动配置时钟,将所有来自输入的时钟信号自动定义成时钟,并且全部对齐相位。用户无需再进行进一步的设置,只需理解成,在这个设计中所有的时钟都是同频时钟。
- def_clk:手动配置时钟,例如:
- def_clk sys_clk -init 0 -period 3
- 定义 sys_clk 为设计的一个时钟,它的初始值为 0,时钟周期为 3。
② 复位信号
- clk_rst:得到设计中所有可能的 reset 信号。
- def_rst 信号名称 [-option]:和时钟定义不同的是,所有的 reset 信号都必须通过手动设置来完成
- -value 定义了复位信号的有效电平;
- -seqfile 可以通过读入一个文件来指定该复位信号的复位序列;
③ 初始值
- show_init:用户定义好时钟和复位之后,通过该命令看到所有寄存器的初始值,这时的初始值就是寄存器的复位值。
- 给无复位寄存器赋初值
- add_init -uninit -zero:表示将所有的 x 初始值赋成 0
- add_init -uninit one:表示将所有的 x 初始值赋成 1
- 改写特定寄存器初始值
- add_init timer.state -value 2'b01:表示将寄存器 timer.state 的初始值重写成 2’b01
- add_init -file init.file:将寄存器初始值写在一个文件中让 AveMC 读入后改写这些寄存器的初始值
- 清除手动设置的初始值
- rm_init:清除手动设置的初始值,将该寄存器的初始值恢复到复位后状态。
- 清除当前设计和设置。
- clear:在重新读入设计和进行配置之前,用户需要清除 AveMC 中所有的数据库从空白开始
四、断言和约束
1.断言(assert)和覆盖(cover)
主要针对SVA,参考链接:
傻白入门芯片设计,SystemVerilog Assertion(SVA)学习(二十一)_好啊啊啊啊的博客-CSDN博客
① show_prop [-option]:查看所有的 cover 和 assert。
- -only_cover
- -only_assert
- -summary(会显示所有的assertion数量+最后的汇总消息)
- -only_summary(只显示最后的汇总消息)
② rm_prop 断言名称 [-option]:删除 assert 和 cover 操作并不会真的从验证环境中删除这些验证目标,而是将其设置为无效状态,在验证中不再验证这些验证目标。用户可以随时恢复这些验证目标。
- -cover:默认删除assert,要对cover操作,需加上-cover,不能同时操作assert和cover,可以使用通配符。
- 删除一条 cover:rm_prop -cover cov_1
- 删除几条 cover:rm_prop -cover {cov_1 cov_2 cov_3}
- 用通配符*删除一组 assert:rm_prop -cover cov_AXI_*
③ add_prop 断言名称 [-option]:恢复删除的 assert 和 cover,默认我们会将某条删除的断言恢复成 assert(不管它删除前是 assert 还是 cover)。如果加上 -cover 选项,则会将删除的断言恢复成 cover。如果用户需要在恢复的时候恢复成和删除前一样的断言类型,则使用 -restore 选项。可选参数:
- -cover
- -restore
2.约束及其种类
① 常量
AveMC 支持将顶层输入或者无驱动信号约束成常量。添加(删除)约束使用的命令及格式为:
- add_cons <信号名> -pinvalue <常量值> [-option]
- rm_cons -pin <信号名> -postreset [-option]
- -postreset ,表示该常量只在复位后的形式化验证阶段有效,不影响复位阶段寄存器初始值的生成。
- -reset ,表示该常量只在复位阶段有效,只影响寄存器初始值的生成,不影响形式化证明。
- 如果这两个选项都不加,则在两个阶段都有效。
② SVA(assume断言)
- rm_cons :和 assert 和 cover 类似,删除SVA assume 约束
- add_cons :恢复删除的 asm。
③ 时钟域约束
- strobe信号名称 [-option]:添加时钟约束
- -all 表示将为所有的非时钟和非复位信号定义时钟域
- -clock 是所属时钟域的时钟名称
- -edge posedge/negedge 表示信号在时钟域上沿跳变还是下沿跳变。
用户可以进行多次 strobe 约束操作,但是同一个信号只能被约束一次,否则AveMC 会报出错误信息并忽略第二次操作,注意 strobe 命令只能对顶层输入和无驱动信号进行约束。
- unstrobe:移除strobe 约束
④ SVA断言在不同声明类型中的转换
SVA 断言主要有三种类型:assert、cover、assume。这三类断言可以在验证过程中相互转换,转换思路主要分成两步:
- 用 rm_prop/rm_prop -cover/rm_cons 命令将需要改变类型的 SVA 断言移除
- 用 add_prop/add_prop -cover/add_cons 命令将移除的 SVA 断言添加成需要改变的类型
五、验证及验证设置
1.建删查任务
- create_task [-name name名称]:在设计文件被读入之后,AveMC 会给用户自动建立第一个任务,名字叫 default。create_task 把 default 任务的当前状态复制出一个新的任务,用-name 给新的任务命名。
- del_task [-name name名称]:如果某个任务不再需要,用户可以将其删除,被删除的任务将无法被恢复
- copy_task -from mode1 -to mode2:不以 default 任务为样本建立新的任务,将 mode1 任务复制出一个新的任务,取名 mode2。
- get_task:查看当前验证项目中有多少个任务。
- set_active_task -name name名称:将指定的任务激活(当前被操作的任务,称为激活任务),配置和验证操作将只对 trial 任务生效。
- get_active_task:查看被激活的任务是哪一个
2.配置进程
在 AveMC 中,每一个验证目标(assert 和 cover)每使用一个验证引擎,都会占用一个验证进程。
- set_opt -max_jobs N:表示最大并行进程为 N。注意 N 不要超过当前运行服务器的最大核数,否则可能引起比较大的性能下降。默认为 0,表示不使用并行进程。
3.配置运行时间
- set_opt -total_time N:设置脚本模式运行总时间,表示从 AveMC -f <脚本文件>启动开始计时,到 N 秒的时候,AveMC 自动停止所有验证目标的验证,并返回所有验证目标的验证结果。该命令选项只在脚本模式运行时才有效,在交互式运行模式下不起作用。
- set_opt -timeout N:表示单个验证进程的最长时间为 N 秒,这里的时间为验证进程占用的 CPU 时间。当验证达到最大时间之后,会中止当前验证目标的验证,继续验证剩下的验证目标或者等待用户的下一条指令。
4.配置验证引擎
set_opt -eng 引擎名称:配置验证引擎,常见的引擎组合名称及其作用如下:
- bmc/sbmc2/sbmc3:用于快速找到 assert 反例或者 cover 成功的引擎,但无法完全证明一个 assert 为真
- mbmc:可以把大量的验证目标放到一起进行验证,可以通过一次验证得到多,mbmc 引擎不要和其他引擎并行使用。用法如下:
- set_o t -en multi -cluster N - ar mbmc:表示将所有的验证目标自动分成 N 组,每个验证进程将其中一组的验证目标放在一起验证。
- bdd:是一个快速且轻量级的引擎,在对于很小的验证目标的时候,表现出色,来寻找验证目标的反例,且该反例一定是一个最短波形
- ip:可以用于寻找验证目标的反例,也可以完成验证目标的完全证明。ip 引擎适用于验证时序深度较浅的验证目标。
- pdrx/pdr2/pdr3:一组最常用的引擎,和 bdd 和 ip 一样,他们可以用于寻找验证目标的反例,也可以完成验证目标的完全证明。在大多数的验证场景中的表现都不错,可以处理大多数的证明问题。
- par:并行证明引擎,par 引擎本身不是一个验证引擎,而是一个管理进程,用来管理多个验证引擎一起工作,只要其中一个引擎得到了证明结果,par引擎会采用此结果并中止其他引擎的证明。使用方法为:
- set_opt -eng par -par {引擎列表}
- absref:该引擎本身不是一个证明引擎,而是一个对验证目标进行优化的算法,它将优化结果提供给其他证明引擎进行证明并管理其他引擎的证明结果。使用方法为:
- set_opt -eng absref -par {引擎列表}
- ind:采用归纳法证明,推荐单独使用,并且配合比较短的 set_opt -timeout N 设置。
- Pdrxi:相当于使用了如下的引擎设置:set_opt -eng absref -par {pdrx}。理论上每个验证目标会占用两个进程,如果使用 pdrxi 引擎,则只占有一个进程,是对 absref+pdrx 引擎的优化,Pdrxi引擎只适合单独使用。
- bh(bug hunting):结合了随机仿真的形式化验证引擎。用于寻找需要很长时钟周期才能达到的反例,不能用于 assert 的完全证明。
5.添加波形信号
watch [-option]:添加需要储存的信号,无论用户添加了什么信号,只有该断言 COI 中的信号可以被存储到波形中,其余信号会被忽略。
6.信号打断和取消打断
- cut [-option]:将某些信号进行打断操作。打断操作相当于把信号和它的驱动逻辑断开,使其成为一个无驱动的信号,参数如下:
- -inst 表示打断某个实例化单元,-module 表示打断某个模块的所有实例化单元,-
- net 表示打断某个信号,-postreset 表示只在复位后打断,-reset 表示只在复位前打断。
- uncut [-option]:取消打断
被打断后的设计验证出来的错误不是真实错误,默认也不会报成验证错误(Fail),而是报告成无法判断(undetermined)。
7.prove [-option]执行形式化验证
- -assume_true_except,表示该命令不执行真正的证明,而是将验证目标所有其他的 assert 直接赋予通过(Pass)的结果。
- -background,后台运行 prove 命令。默认情况下,prove 命令在前台执行,会锁住整个AveMC 的操作界面,在证明过程中,用户无法进行任何其他的操作
- -bundle {验证目标 ID},组合证明。AveMC 可以将一组 property 组合成一个验证目标一起
- 证明,原则上只能将 assert 进行组合证明。
- type assert/cover/all,选择证明的目标类型。用于在选中的目标中,只证明其中的 assert 或者 cover。默认值是 all,即 assert 和 cover
- stop_prove:停止当前正在后台运行的 prove 进程
六、验证结果显示和 debug
1.显示验证结果
show_prop [-option]:用户可以在任何时刻检查当前验证任务的状态。
- -dot:显示某个断言建模之后的可视化状态机,帮助用户判断该断言是否被正确构造
- -eng:表示得到每一个证明目标证明结果所使用的引擎
- -time:表示每个验证目标得到验证结果所花费的 CPU 时间。
- -all:显示所有的assertions
- -only_assert:只显示assert断言
- -only_cover:只显示cover断言
- -only_summary:只显示验证成功或者失败的断言数目
- -summary:显示验证成功或者失败的断言数目+最后的汇总消息
2.验证结果分类
① Pass
- 对于 assert,Pass 表示在当前的验证设置下,AveMC 无法找到任何反例。也即是该 assert 断言永远为真,验证通过,该验证目标不存在任何 bug。
- 对于 cover,Pass 表示在当前的验证设置下,AveMC 可以找到一个场景,使得这条 cover 断言为真。
- 有一类特殊的 Pass 被称为 TrivT(Trivial True)。这类 Pass 不需要形式化验证引擎证明即可得到,通常由于常量传递导致断言永远为真。
② Fail
- 对于 assert,Fail 表示在当前的验证设置下,AveMC 找到了一个反例。也即是该 assert 断 言存在为假的情况,验证失败,该验证目标存在 bug。
- 对于 cover,Fail 表示在当前的验证设置下,AveMC 无法找到任何一个场景,使得这条 cover 断言为真,验证失败,该覆盖点无法被覆盖。
- 有一类特殊的 Fail 被称为 TrivF(Trivial False)。这类 Fail 不需要形式化验证引擎证明即可得到,通常由于常量传递导致断言永远为假。
③ Undetermined
- 最特殊的一种验证结果,也是最难处理的一种情况。Undetermined 表示,对于该验证目标,AveMC 工具无法找到 assert 的反例或者满足 cover 的场景。
- 在给定的计算资源和时间下,又无法遍历所有的验证场景,从而也无法保证 在没遍历到的场景里没有其他 bug。最后,工具只能给出一个无法判断的结果。
3.清除验证结果
reset [-option]:清除已经得到的结果验证目标得到验证结果之后,就不能再次被证明。如果修改了某些配置希望再次运行这些验证目标而又不想重头开始读入设计和验证文件,可以使用reset
- -cover:表示只清除 cover 断言的状态。
- -ids:用于指定想要清除状态的断言 id 编号
4.查看反例波形
形式化验证会对每一个 fail 的 assert 自动生成一条反例波形,以 vcd 的格式存储在结果目录中。
在交互式界面下,用户可以使用两种方式:
- ① 轻量级调试界面 cex_wave
- cex_wave <断言名>:启动轻量级的用户调试界面
- 例如:cex_wave inst_arbiter_checker.ast_RR_check
② AveTrace 调试界面
- ave_trace <断言名>:cex_wave 只能提供最简单的 debug 功能,Arcas 提供了一个功能更为齐全的 RTL-波形联合调试工具。
5.查看 wit_wave
- wit_wave <断言名称> -len N:这条命令会启动一个随机仿真引擎,仿真 N 个时钟周期,在这 N 个时钟周期内,指定的断言永远为真,其调试界面和 cex_wave 一样。