1. 基础知识
- 运行机理
HDL仿真器编译代码的过程由编译,建模和仿真三个阶段(详情见该文第4大点:IC设计——Verilog HDL学习笔记_KGback的博客-CSDN博客),VCS将三个阶段独立开来,使compilation与elaboration可以通过仿真前的命令行单独执行,而simulation阶段则可以直接运行建立好的模型
因此VCS修改参数(parameter类型)需要在独立的elaboration阶段修改,类似的QuestaSim可在仿真阶段修改(后台事先会执行elaboration阶段)。
2. VCS常用option
可参考链接:[VCS]VCS常用命令詳解 - it610.com
- analyze
- -j10 //多核编译,该例为10核
- compile
- vcs +v2k <file_name> -debug_all //案例:编译顶层文件 支持verilog2001标准
- -sverilog //支持systemverilog
vcs联合编译v/sv/c++代码:vcs联合编译v/sv/c++代码_sxlwzl的专栏-CSDN博客_vcs编译c - -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文件
- simulation
- -o simv1 //指定仿真文件名,产生多次不同的simv可执行文件
- -gui //用图形界面打开
- +vcs+stop+time //指定仿真暂停时间
- +vcs+finish+time //指定仿真结束时间
- -nospecify //禁止模块路径延迟和时序检查,提高仿真速度
- +notimingcheck //禁止时序检查,提高仿真速度
- +vpdfile+<file_name> //产生指定名字的vpd文件
- 产生*.vcd文件
在代码中加入系统函数$vcdpluson()或者$vcdplustraceon()
- debug
- dve -full64 //等同于simv -gui 或vcs -gui -R
- dve -full64 -vpd <vpd_file> -session <session_file> //打开波形
可参考链接:dve的启动 - yuanpin318的日志 - EETOP 创芯网论坛
ucli命令
- 读取二维数组内容
memory -write <signal> -file <output_file>
3. 与Verdi联调
- UFE工作流程
在database准备阶段,可以使用UFE工作流可以简化设计流程
- 在vcs编译时添加-kdb选项来开启UFE工作流
- 编译后加载波形和设计,两种方法:
一种是加载没有FSDB的设计,即运行:
verdi -dbdir <path>/sim.daidir
另一种是加载有FSDB的设计,即运行:
verdi -ssf <my>.fsdb
- pre-load工作流
在大型设计的仿真调试时,可以使用pre-load工作流来实现较快的打开速度和较少的内存花销
- vcs编译时加-kdb=shell选项
- 运行后可以先读取配置文件,再加载波形和数据,注意需要设置环境变量VERDI_SHELLDB,例如:
verdi -dbdir simv.daidir -preload <preloadFile>、
- 使用TFV自动trace信号
Temporal Flow View可以通过图形的方式将电路结构和信号时序表现出来,从而追寻引发触变的源信号。
基于TFV,可以使用TraceX组件,可以追寻信号被置为X的原因。
- 电路图debug
主要debug功能有:
- trace fanin/fanout
- 可以图形化地展现FSM
- 波形比较
verdi通过nCompare来比较两个fsdb文件,同时可以载入规则文件来设置比较的触发条件、误差的容忍值等,例如:
nCompare -rule <rule_file> -fsdb <a.fsdb> -fsdb <b.fsdb> -report <report_file>
4. code coverage
- 基本命令
- -cm cond+tgl+lin+fsm+path //打开code coverage分析 :条件+翻转+行+状态机+路径
- -cm_nocasedef //统计覆盖率时不统计default语句
- -cm_dir <dir_name> //设置覆盖率文件的路径名
- -cm_name <file_name> //设置统计覆盖率文件的名字
- 产生*.vdb文件
统计覆盖率的文件 - -cm_log <file_name> //产生log文件
- autograding //针对性的做测试,统计每个testcase的覆盖率贡献
- //VCS coverage on //避免某段语句统计覆盖率
//VCS coverage off - -cm_heir <fime_name> //避免某模块统计覆盖率
该命令详情见链接:vcs产生code coverage与function coverage | 骏的世界
- 命令分析
$> 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覆盖率的分析。现在一般用dve图形界面观察覆盖率报告。
- N个testbench中N个testcase的情况
cmView会将各自的仿真的中间文件合并,因此可以使用同一个testbench,编译一次,但多次仿真,就可以得到多次仿真的覆盖报告
- 编译一次,运行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直接观察 - 编译一次,运行N次,每次更改$test$plusargs认为的参数,因为每个该任务的参数对应不同$readmemb的输入文件,等于更改了输入
simv -cm_name test1 -cm mac1
simv -cm_name test2 -cm mac2
dve -covdir *vdb //运行dve观察 - *编译多次,建立多个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 initreg选项的使用_kevindas的博客-CSDN博客
5. error和warning
- 同名module编译问题
vcs编译解决 module名重复的冲突问题_cy413026的博客-CSDN博客_vcs两步法和三步法区别
- error
Error-[ITSFM] Illegal `timescale for module
Module "top" has `timescale but previous module(s)/package(s) do not.
编译时,要将带有`timescale或者宏定义的文件列在前面。Error-[SV-IDOCBO] Illegally driving clocking block output
Clocking block output rtr_io.cb.reset_n is illegally driven by a blocking assignment.
interface里的clocking block里应使用非阻塞赋值 <=Error-[...]找不到某些文件
这个时候先要确认该文件确实已经添加到VCS可遍历的目录里去,若源文件已添加仍找不到,可使用+incdir+选项将源文件所在目录添加进去;
其次观察一下编译的log文件,检查是否编译命令是否正确,经常会出现列举编译文件格式不规范,少加号、换行符的情况。