VCS 工具简要说明


在使用 EDA 软件工具进行 软件仿真时,我们通常会需要将各种语言混合进行编译到一个仿真程序中,有时候需要了解点底层的原理。仿真程序的编译和普通软件的仿真编译其实并没有什么不同,都是需要经过编译和链接阶段,其中编译阶段主要是解决语法错误,而链接阶段主要是是检查是否存在未实现的函数。

编译阶段主要的问题是头文件的包含是否正确,它代表的是变量,函数是否有声明,最典型的未定义错误都是在这个阶段出现的,此时重点检查是否头文件的搜索路径是否添加正确了;

而对于链接阶段出现的经常是找不到某种符号的错误,这时候需要检查的是期望的库是否可以链接器找到。

EDA工具并不是完全自己写的,他们其实也是利用开源的工具并加上了自己的一些东西,例如经常都会使用gcc工具,其实大部分的工具选项和 gcc 是没什么区别的,这部分不熟悉的建议去看一下 EDA 工具的相关选项。

VCS

HDL仿真器编译代码的过程由编译,建模和仿真三个阶段,VCS将三个阶段独立开来,使compilation与elaboration可以通过仿真前的命令行单独执行,而simulation阶段则可以直接运行建立好的模型

因此VCS修改参数(parameter类型)需要在独立的elaboration阶段修改,类似的QuestaSim可在仿真阶段修改(后台事先会执行elaboration阶段)。

VCS常用option

编译:

    -j10                                                  //多核编译,该例为10核
    vcs +v2k  <file_name> -debug_all                      //案例:编译顶层文件 支持verilog2001标准
    -sverilog                                             //支持systemverilog
    -mhdl                                                 //实现混合HDL语言的编译和仿真
    -v <file_name>                                        //列举编译的源文件
    -y <dir_name>                                         //列举源文件需要用到的参考库
    +libext+.v+.vhd+...                                   //在参考库下寻找以.v和.vhd为扩展名的文件
    +incdir+dir1+dir2+...                                 //vcs在参考目录下寻找源代码中`include指示的文件
    -full64                                               //64位编译,生成64位simv
    -comp64                                               //64位编译,生成32位simv
    -debug_pp                                             //生成vpd文件
    -debug                                                //相对于debug_pp多了UCLI调试功能
    -debug_all                                            //有相对于debug多了单步调试功能
    +define+macro1=<value>+macro2=<value>+...             //将value传递给源文件中的宏名
    +ad=<file_name>                                       //实现混合信号的编译和仿真
    -timescale=<time_unit>/<time_precision>               //指明时间尺度
    +vcs+dumpvars                                         //代替源代码中没有参数的$dumpvars任务
    +error+<N>                                            //将编译时运行的NTB错误增加到N
    +memcbk                                               //dve中查看多维数组波形,通常也需要在testbench中加$vcdplusmemon
    -f filelist.f                                         // 当文件较多时,为避免添加失误,可使用filelist.f文件

仿真选项:

    -o simv1                                              //指定仿真文件名,产生多次不同的simv可执行文件
    -gui                                                  //用图形界面打开
    +vcs+stop+time                                        //指定仿真暂停时间
    +vcs+finish+time                                      //指定仿真结束时间
    -nospecify                                            //禁止模块路径延迟和时序检查,提高仿真速度
    +notimingcheck                                        //禁止时序检查,提高仿真速度
    +vpdfile+<file_name>                                  //产生指定名字的vpd文件
    在代码中加入系统函数$vcdpluson()或者$vcdplustraceon()     // 产生*.vcd文件
    -licwait 10                                           // 等待可用license 10minutes

ucli命令:

    读取二维数组内容
    memory -write <signal> -file <output_file>

覆盖率:

    -cm cond+tgl+lin+fsm+path                 //打开code coverage分析 :条件+翻转+行+状态机+路径
    -cm_nocasedef                             //统计覆盖率时不统计default语句
    -cm_dir    <dir_name>                     //设置覆盖率文件的路径名
    -cm_name  <file_name>                     //设置统计覆盖率文件的名字
    -cm_log      <file_name>                  //产生log文件
    autograding                               //针对性的做测试,统计每个testcase的覆盖率贡献

    //VCS coverage on                         //避免某段语句统计覆盖率
    //VCS coverage off
              
    -cm_heir <fime_name>                      //避免某模块统计覆盖率

覆盖率使用说明

VCS 在统计代码覆盖率的过程中,我们通常在编译和仿真命令上添加对应的开关选项,生成一个 .vdb 文件记录覆盖率的情况。再使用 verdi 打开该文件查看。下面介绍一些选项。
-cm :打开对应类型的覆盖率,例如 -cm cond+tgl+lin+fsm+path为统计上述所有覆盖率。可根据需要增减。
-cm_name:设置记录有覆盖率信息文件的名字。
-cm_dir:指定生成文件的目录。

以上三个选项编译仿真过程都要加上。下面的选项在编译过程加上。
-cm_log + filename.log:.log文件记录仿真过程中统计覆盖率的信息。用的比较少。
-cm_nocasedef: 在统计case语句的条件覆盖率时,不考虑default条件未达到的情况。
-cm_hier vcs_cov.cfg:通过.cfg文件(名字随便取)选择要查看覆盖率的模块/文件。

编译时加上下面选项:

$ +VCS_UVMC_OPTS+= -cm cond+tgl+line+fsm+path -cm_name sram_tag -cm_dir ./sram_tag.vdb -cm_log cm_cover.log -cm_hier vcs_cov.cfg -debug_pp

仿真时:

$ VCS_SIMV+= -cm cond+tgl+line+fsm+path -cm_name sram_tag -cm_dir ./sram_tag.vdb

查看覆盖率

$ verdi -cov -covdir sram_tag.vdb

覆盖率示例1:单个覆盖率

$> vcs -Mupdate -cm line -cm_dir my_cov  source.v
$> simv -cm line -cm_dir int_dat_files
$> vcs -cm_pp -cm line -cm_dir my_cov -cm_dir int_dat_files

第一条命令是把source.v文件进行编译, 把编译结果放入 my_cov 文件夹中. 选项 -cm line 表示在编译时, 要加入 line 覆盖率分析.

第二条命令运行仿真,同样选项 -cm line 选项表示仿真是加入 line 覆盖率分析, 并把结果存入 ini_data_files 目录中

第三条进行覆盖率分析, 分析文件从 my_cov 和 int_dat_files 这两个目录中读取, 进行 line 覆盖率的分析。

覆盖率示例2:N个testbench中N个testcase的情况

cmView会将各自的仿真的中间文件合并,因此可以使用同一个testbench,编译一次,但多次仿真,就可以得到多次仿真的覆盖报告

  1. 编译一次,运行N次,每次运行前更改$readmemb任务的文本文件,就等同于更改了输入,得到多个test文件(test1,test2…)

    simv -cm line -cm_name test1
    simv -cm line -cm_name test2

    vcs -cm_pp -cm merge_name //运行cmViem,会在reports目录下写入一个混合的报告,或者运行dve直接观察

  2. 编译一次,运行N次,每次更改 t e s t test testplusargs认为的参数,因为每个该任务的参数对应不同$readmemb的输入文件,等于更改了输入

    simv -cm_name test1 -cm mac1
    simv -cm_name test2 -cm mac2

    dve -covdir *vdb //运行dve观察

  3. 编译多次,建立多个simv,运行多次,每次用的testbench不同

    vcs -o simv1 -cm…
    vcs -o simv2 -cm… //多次simv,最后执行cmView
    vcs -cm_pp line -cm_dir ./simv1.vdb -cm_dir ./simv.vdb <merge_name> //也可运行dve

vcs联合编译v/sv/c++代码

  • 简单编译

假设有三个文件: top.sv,dpi.h,dpi.cc,可以直接使用 vcs -sverilog top.sv dpi.cc -R 。但是当c代码或者sv代码都很多时,这样的操作就不合适了。

  • 文件列表的方式编译
$ vcs -sverilog -f filelist -R
$ cat filelist
top.sv
dpi.h
dpi.cc

这样会出错,因为vcs的文件列表,不支持c代码。可以使用下面这种方式

vcs -sverilog -f filelist dpi.cc -R
$cat filelist
top.sv
  • 单独编译 sv 和 c再链接

先编译c代码成共享库,再编译sv/v代码并且链接动态共享库

$ g++ -Wall -m64 -g -fPIC your_cpp1.cpp your_cpp2.cpp -shared -o your_gen.so
$ vcs -debug_all -full64 -sverilog -R +define+your_define rtl_file.sv your_gen.so

vcs 产生波形

  1. 在 tb 中加入波形产生的文件:
$fsdbDumpfile(“xxxx.fsdb”);
$fsdbDumpvars(0);
  1. 编译时要加入以下选项,fsdb 是 synopsys verdi 自定义的波形文件格式,需要链接它的库才能实现
设置VERDI_HOME
VERDI_HOME=/nfs/tools/synopsys/verdi/S-2021.09-SP1

-P /nfs/tools/synopsys/verdi/S-2021.09-SP1/share/PLI/VCS/LINUX64/novas.tab /nfs/tools/synopsys/verdi/S-2021.09-SP1/share/PLI/VCS/LINUX64/pli.a -fsdb -debug_all

-P: 指定使用的PLI,这里指定verdi下的PLI,因为verdi是需要fsdb文件来显示波形的,而fsdb文件的生成需要系统函数(fsdbDumpfile, fsdbDumpvars), 而这些系统函数vcs是没有的,但是在verdi的PLI中存在的,所以这里需要指定一下

-fsdb: 产生 fsdb 波形

-debug_all: 对于看fsdb波形信号,debug_all选项是必须加的
  1. 运行仿真程序之后打开波形文件
$ verdi -sv -f file_list.f -ssf sram_tag.fsdb

-sv: 表示 Verdi 软件 要支持systemverilog 
-f filelist:  源代码的文件列表 
-ssf test.fsdb:  指定fsdb文件 
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值