linux环境下vcs+verdi的使用

2023-11-06 10:59
文章标签 linux 使用 环境 vcs verdi

本文主要是介绍linux环境下vcs+verdi的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、vcs编译过程
  • 二、vcs常用指令
    • 1、常用
      • (1)编译文件
      • (2)debug选项
      • (3)目录
      • (4)使用verdi时需要在vcs里面添加的编译选项
      • (5)仿真选项(加在sim里面)
      • (6)其他
      • (7)完整版本
    • 2、覆盖率相关
    • 3、波形相关
    • 4、仿真命令和仿真环境之间传递参数
      • 4.1 宏定义
      • 4.2 条件编译函数 \$test$plusargs
      • 4.3 参数传递函数 \$value$plusargs
  • 三、verdi相关
  • 四、面试问题


前言

今日感想:学习只能慢慢搭积木,想一步登天可不行啊


在vcs仿真时调用$dump函数dump出fsdb文件,随后verdi load filelist和fsdb文件来进行debug

一、vcs编译过程

1、vcs两步仿真:先编译文件,生成simv可执行文件;后进行仿真(compilation and simulation)
VCS:Verilog Compiler Simulator
问题一:当设计比较大的时候,每次都要全部重新编译一遍,比较浪费时间;
问题二:当设计中存在VHDL文件时,两步法就无法使用,因为VHDL文件需要单独处理。

在这里插入图片描述

2、vcs三步仿真:编译(compilation)、elaboration、和执行仿真(simulation)三步执行
elaboration:把各种资源进行整合链接,有些文章或书上说是建立层次关系,意思差不多,类似于c语言的link
适合于文件中存在多种语言,例如sv和vhdl同时存在

英文解释:Elaboration is the process of binding together the components of the design. Elaboration includes among other things creating instantiations, computing parameter values, resolving hierarchical names and connecting nets. Often when referring to the compilation and elaboration phases they are not distinguished but are generally referred to as compilation.

3、CLI and GUI界面
(1)VCS有命令行模式图形模式
图形模式使用的是DVE,命令交互模式使用的是Unified Command-line Interface (UCLI)
(2)vcs中要调用ucli接口,执行脚本,必须在compile的时候,加入debug的权限:-debug,-debug_pp,-debug_all,-debug_access,-debug_region。在run的时候,指定vcs -ucli [run_option],需要在编译时加入参数以开启ucli,否则ucli交互时只能使用简单的 ’run’、 ‘dump’、 'quit’命令。

4、带-号的,一般是编译时用的,编译工具自带的。(编译选项)
+号的,一般是插件,环境,验证语言等加的,可扩展、自定义的。

5、VCS和VCS_MX区别
VCS_MX为mixed hdl仿真器,支持vhdl+verilog+sv的混合仿真。VCS只支持verilog, sv。在feature上唯一的区别在于对vhdl的支持。如果没有vhdl的设计的话或许VCS好些,速度快些。

二、vcs常用指令

区分编译步骤和仿真步骤中加上的选项,添加错了位置选项就不起作用了

1、常用

which vcs  //查看vcs的安装路径
vcs -help  //查看vcs的编译选项

(1)编译文件

vlogan:vcs的编译指令,支持sv、v文件
vhdlan:vcs的编译指令,支持vhdl文件
-sverilog:支持SystemVerilog的语法

-f <filename>:指定源文件的路径名列表,文件中可包括源代码文件的路径名称,和编译选项参数
-l <filename>:指定vcs编译信息的存储文件
-ntb_opts uvm-1.2:表示要引入UVM1.2的包,当然也可以选择使用1.0或1.1版本的,但是要注意这个选项不可缺少
-full64:在64bit模式下编译、仿真,用于64位操作系统
-Mupdate :源文件有修改时,只重新编译有改动的.v文件,节约编译时间。
-top:设置顶层模块
+v2k:支持Verilog-2001标准
-gui:打开仿真的图形化界面
-o <name>:指定编译后产生的可执行文件名,默认编译后的文件名为simv
+incdir <directory>:指定包含include文件的文件夹,以方便后续编译文件时不用逐个写出所有文件的路径,只需将其在pkg中include一下即可。可以指定多个目录,用+字符分隔每个路径名称
在这里插入图片描述

vcs top.v              //编译verilog文件
vcs -sverilog top.sv   //编译system verilog文件,要加选项
vcs -f file.list       //按照顺序把源文件放到file.list里面,然后全部编译
vcs -sverilog  +incdir+filespath pkg.sv  //把相关的类定义放到一个package里面,pkg里面include源文件
vcs -l compile.log -sverilog top.sv   //指定编译信息存储到log文件
vcs –sverilog design.sv –top work.tb1  //设置顶层模块

-R:编译后立即进行仿真,如果不加这个会生成可执行文件后就退出了

-s:在simulation仿真刚开始时立即停止,并进入交互模式。一般与-R和+cli配合使用

vcs cpu.v +cli+3 -R -s

-ucli:在linux终端使用TCL控制仿真进程(统一命令行界面模式)
+vcs+lic+wait:一直等待licese
+licwait 100:设置等待license的仿真超时时间
+memcbk:查看多维数组
-error <number>:编译器遇到n个错误之后就停止

(2)debug选项

-debug_all:支持所有调试
-debug_pp:同上,更加节约资源,可以dump fsdb和vpd,使能DVE、VERDI波形调试和UCLI命令行调试
-debug:使能dve、verdi波形调试和UCLI命令行调试
-debug_accessvcs -debug_access时,不需要再手动配置PLI的tab file verdi.tab 和静态库 pli.a,只需设置VERDI_HOME环境变量,vcs会自动查找所需文件,$fsdbDumpfile可以直接使用。
-debug_access+all 并不包含library(-v -y指定)和cell(celldefine编译原语标记的module,是cell module),无法PLI访问(如uvm_hdl_write)和波形dump。加上-debug_region=cell+lib才可以正常访问。而-debug_all则是默认包含library和cell。(一般library和cell为标准单元,特别是在后仿,RTL综合成stdcell,被celldefine标记,而且PR也加入很多buf和inv, 降低仿真速度,增加波形文件size,如果不需要可以加上+nocelldefinepli+2,只dump module instance上的port波形)

-debug_access是新推出来的选项,更好地控制仿真过程中的调试性能
也就是说,debug_all和配置PLI,或者-debug_access+all和-debug_region选项

现在前仿过程中不涉及工艺库那些信息,所以就可以直接使用-debug_acc+all!!!就可以了!

这个链接讲的很详细

配置PLI的方法

VERDI_PATH = /home/xxx/synopsys/verdi-2016.06-1/share/PLI/VCS/linux64
VERDI_ARGS = ${VERDI_PATH}/novas.tab \${VERDI_PATH}/pli.a编译选项加上-P ${VERDI_ARGS}

(3)目录

这里涉及到的这三个是个库文件相关的
-v <filename>:设置搜索设计的文件,这两个参数和工艺库相关
-y <dir_pathname>:指定目录路径,定义verilog的库
+libext+<extension>:让VCS在verilog库路径下搜索指定的扩展名文件,与-y配合

一般使用:

  • 把所有文件相对于makefile的文件路径都写在filelist里面,然后使用-f xxx.filelist
  • 使用+incdir指定include文件所在的文件夹

(4)使用verdi时需要在vcs里面添加的编译选项

-lca:(Limited Customer Availability)表示使用vcs“用户限制使用”功能,即vcs提供的一些功能,但该功能还未经过充分验证。
-kdb:是lca下的一个feature,其作用是在vcs two-step flow和three-step flow中生成kdb databas,是vcs支持verdi很重要的选项

这两个命令加在一起
vcs编译完后生成simv.daidir库文件,其中包含kdb.elab++文件
可以让verdi直接打开VCS编译之后的sim.daidir, 这样verdi可以直接trace代码
simv.daidir:仿真生成的verdi的库文件,包含代码信息;verdi可以打开rtl代码而不需要重新编译

-debug_access -lca -kdb  //vcs编译时加上这个选项,为了后面使用verdi//使用kdb的几种方法
verdi -elab ./simv.daidir/kdb  
verdi -dbdir simv.daidir
verdi -simBin simv
verdi -ssf top.fsdb   //加载kdb的同时加载波形,一般用这种方式

(5)仿真选项(加在sim里面)

+nospecify:不进行时序检查
+notimingcheck:不进行时序检查,前仿为了加快仿真速度暂时不需要,两个选项一般一起用
+delay_mode_unit:延时模型,都是在前仿用不到的一些参数
+vcs+flush+all:dump vpd的波形需要的选项
+define+< macro_name>=< value>:定义一个文本宏,与源文件中的 ifdef配合

//top文件有如下定义
initial begin`ifdef dumpon$dumpfile("results.vcd");$dumpvars;`endif
end
vcs -sverilog  +define+dumpon -l compile.log top.sv  //改变参数的定义
//需要修改的时候,又要重新编译,比较麻烦

+fsdb+dumpon+500ns :vcs编译选项,仿真从500ns开始时dump波形
+ntb_random_seed=3:添加随机种子

(6)其他

-simprofile:可以记录vcs各模块仿真时间
-override_timescale=< unit>/< preciision>:让源文件统一使用指定的timescale
-timescale=<time_unit/time_precision>:为在前面编译且没有`timescale的源文件指定timescale。time_unit采用就近原则,例如顶层文件定义timescale后,中间文件再次定义timescale后,则其后的文件按照中间文件定义的timescale执行

vcs -sverilog -timescale=1ns/1ps -l compile.log top.sv 
vcs -sverilog -timescale_override=1ns/1ps -l compile.log top.sv //覆盖源代码中的仿真时间单位和精度,不推荐使用,会把模型的时间单位覆盖,可能导致模型功能错误

(7)完整版本

vcs -sverilog -full64 -fsdb -ntb_opts uvm-1.2 \-debug_access+all -lca -kdb -f flist.f \-timescale=1ns/1ps -cm line+tgl+cond+branch+assert+fsm \-assert -LDFLAGS '-Wl,--no-as-needed' -l com.log

2、覆盖率相关

(这部分请查看另一篇博客,单独来讲解)
覆盖率传送门

3、波形相关

-gui:开启GUI界面,否则就在linux终端显示transcript的内容
-fsdb:调用Verdi PLI 库,支持fsdb 波形
-i <filename>.tcl: 启动DVE后,在UCLI要启动的TCL命令。或者其他的文件,这样就可以不重新编译,直接进行输出波形等的调整,节约仿真资源
在这里插入图片描述
在这里可以执行一些tcl命令

scope: 显示当前的顶层模块
scope u1: 就表示进入到当前顶层模块中的u1模块,同时将u1模块设置为顶层模块
scope -up: 回到目前顶层模块的上一层。
show: 显示当前顶层模块的信号以及子模块
show -value 信号 -radix hex/bin/dec:显示信号的值 以特定的进制显示。
run:运行仿真run 一直运行,直到遇到$stop或者设置的断点
run time: 运行多少时间停止(不推荐)
run -posedge: 信号 运行到信号的上升沿停止
run -negedge: 信号 运行到信号的下降沿停止
run -change: 信号 信号有变化时停止
stop: 设置断点stop 显示断点
stop -posedge: 信号 在信号的上升沿设置断点
stop -negedge: 信号 在信号的下降沿设置断点
stop -condition {信号表达式}: 信号表达式为真的地方设置断点
stop -delete 断点值: 删除断点值的断点
restart: 重新开启ucli调试模式
call {系统任务}:调用verilog系统任务,
finish:结束仿真
force:信号强制赋值
release:解除信号强制赋值
get:获取信号数值
step:单步执行
do *.do:可将很多这些UCLI命令整合到一个*.do文件内,然后以打包运行
命令 –h:显示命令的帮助

-vcd <filename>:将输出VCD文件名设置为指定文件。默认文件名为verilog.dump。Verilog源代码中的$dumpfile系统任务将覆盖此选项;
-verdi:使用verdi图形界面
+vcdfile+<filename>:指定想要用于后期处理的VCD文件;
-vpd_file <filename>:在运行时,定义VCS写入的VPD文件的替代名称,而不是缺省名称vcdplus.vpd;
+define+VCS:定义全局的VCS,编译器在编译时如果源文件有类似ifdef VCS等字样,那么会执行定义之后的代码。
+vcs+vcdpluson:编译选项,加入后会使能产生vpd文件,默认文件名vcdplus.vpd
-vpd <filename>:打开仿真波形,一般在末尾加&,表示在后台运行

4、仿真命令和仿真环境之间传递参数

4.1 宏定义

前面介绍仿真选项的有

4.2 条件编译函数 $test$plusargs

if($test$plusargs("FSDB_ON")):表示从命令行读取参数并判断是否开启波形dump处理。如果去掉这个if判断,就表示无条件的波形dump。当然,正式项目开发中通常会加上条件判断,将开关控制权留到实际做仿真时去。因为回归验证由于要做大量的仿真,通常是不会dump波形,只有单个testcase的调试时才会进行仿真验证。

仿真代码:

initialbeginif($test$plusargs("test1")$readmemh("test1.dat",mem1);if($test$plusargs("test2")$readmemh("test2.dat",mem2);end

仿真命令:
只需要加上即可

.... +test1 +test2

4.3 参数传递函数 $value$plusargs

通过仿真命令向仿真环境传递参数

仿真代码:

if($value$plusargs("finish=%d", finish))
beginrepeat(finish); $display("finish=%d", finish);$finish;
end

仿真指令:

.... +finish=3 +freq=50

三、verdi相关

输出波形
verdi需要在testbench中添加如下代码

initialbegin$fsdbDumpfile("./top.fsdb");  //指定输出波形名称$fsdbDumpvars(0,tb);   //输出信号层级,0表示所有,1表示第一层,依次类推;//tb表示例化的顶层模块名称$fsdbDumpvars("+all");   //+all参数,dump SV中的struct结构体$fsdbDumpSVA();         //将assertion的结果存存储到fsdb中$fsdbDumpMDA(0, top);  //dump memory arraysend

verdi:分析过程,跟踪信号,比vcs自带的dve功能更强
-ssf filename.fsdb:打开波形文件
-f filelist.f -top adder:打开rtl代码,顶层模块名为adder
-nologo:不显示verdi的启动log信息
常用的如下:

verdi -ssf test.fsdb -f filelist.f -top tb_top -ntb_opts uvm-1.2 -nologo

4.1 verdi使用方法
上面的界面:nTrace
下面的波形:nWave
在这里插入图片描述

(1)点击dut里面的信号,右键添加到波形图中,或者crtl+w
也可以点击红色图标,打开对话框去选要添加的信号
在这里插入图片描述

(2)快捷命令:
波形图左击选中部分波形:可以放大波形
按f键:全屏显示所有的波形
shift+滚轮:左右移动波形
ctrl+滚轮:放大或者缩小波形
保存添加到窗口的波形:save,保留成rc文件,方便查看
追踪信号:选中信号,点左上面一排的绿色的向右向左的图标
信号分组:选中信号,按照滚轮移动信号到别的分组,或者一开始的时候就进行分组
统计时钟上下升沿个数
在这里插入图片描述

切换data的进制
在这里插入图片描述

数字/模拟信号切换
在这里插入图片描述

data有很多位,包含地址和数据,可以进行分开查看edit bus
在这里插入图片描述

在这里插入图片描述

查看数值logical operation:选中信号,右键,最下面的选项
然后再去统计个数,就可以知道该信号这个数值有多少次
在这里插入图片描述

查找信号Find Scope:crtl+S

四、面试问题

1、define和 t e s t test testplusargs的区别

define:需要在编译之前完成变量的定义,如果需要修改的话,要重新编译,比较麻烦
$test$plusargs:不需要重新编译,是从命令行传递参数进去
$value$plusargs:它既可以实现testplusargs的要求,它是能传递参数同时对内部信号进行赋值

vcs +define+dumpon -sverilogsim +test1
sim +test1=123

这篇关于linux环境下vcs+verdi的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/356196

相关文章

mybatis-plus QueryWrapper中or,and的使用及说明

《mybatis-plusQueryWrapper中or,and的使用及说明》使用MyBatisPlusQueryWrapper时,因同时添加角色权限固定条件和多字段模糊查询导致数据异常展示,排查发... 目录QueryWrapper中or,and使用列表中还要同时模糊查询多个字段经过排查这就导致只要whe

linux批量替换文件内容的实现方式

《linux批量替换文件内容的实现方式》本文总结了Linux中批量替换文件内容的几种方法,包括使用sed替换文件夹内所有文件、单个文件内容及逐行字符串,强调使用反引号和绝对路径,并分享个人经验供参考... 目录一、linux批量替换文件内容 二、替换文件内所有匹配的字符串 三、替换每一行中全部str1为st

Python使用openpyxl读取Excel的操作详解

《Python使用openpyxl读取Excel的操作详解》本文介绍了使用Python的openpyxl库进行Excel文件的创建、读写、数据操作、工作簿与工作表管理,包括创建工作簿、加载工作簿、操作... 目录1 概述1.1 图示1.2 安装第三方库2 工作簿 workbook2.1 创建:Workboo

使用Go实现文件复制的完整流程

《使用Go实现文件复制的完整流程》本案例将实现一个实用的文件操作工具:将一个文件的内容完整复制到另一个文件中,这是文件处理中的常见任务,比如配置文件备份、日志迁移、用户上传文件转存等,文中通过代码示例... 目录案例说明涉及China编程知识点示例代码代码解析示例运行练习扩展小结案例说明我们将通过标准库 os

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

Python 字典 (Dictionary)使用详解

《Python字典(Dictionary)使用详解》字典是python中最重要,最常用的数据结构之一,它提供了高效的键值对存储和查找能力,:本文主要介绍Python字典(Dictionary)... 目录字典1.基本特性2.创建字典3.访问元素4.修改字典5.删除元素6.字典遍历7.字典的高级特性默认字典

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处