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

相关文章

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版