zl程序教程

您现在的位置是:首页 >  工具

当前栏目

常用数字设计仿真工具(Questa,VCS,IUS/Xcelium,Verdi等)使用入门

工具入门 设计 常用 数字 仿真 使用
2023-09-14 09:15:00 时间

目录

1. 前言

2. QuestaSim基本使用方法

2.1 命令行编译

2.2 命令行运行

2.3 启动GUI进行仿真

2.4 从GUI中进行编译运行

2.5 dump波形

2.6 指定随机种子

2.7 命令行指定testcase名

2.8 其它常用选项

2.9 基于Tcl脚本的运行方法

2.10 其它常用命令

3. VCS基本基本使用方法

3.1 编译

3.1.1 基本编译命令

3.1.2 包含路径的指定

3.1.3 其它常用选项

3.1.4 vcs选项一览表

3.2 vcs两步仿真

3.3 vcs三步仿真        

3.4  fsdb波形输出选项

3.5 ucli常见命令

3.5 VCS与VCS_MX的区别

4. IUS/Xcelium基本使用方法

4.0 帮助查询方法

4.1 基本使用方法

4.2 seed与svseed的区别

4.3 Xcelium

5. Verdi基本使用方法

5.1 verdi直接打开代码

5.2 kdb选项

5.3 verdi直接打开波形

5.4 verdi打开指定的restore文件

6. 源文件指定方式

6.1 最基本的方式

6.2 指定多个文件

6.3. 使用filelist文件

6.4 指定整个目录中的所有指定后缀的文件

6.5 指定include文件的搜索路径

6.6 追加宏的定义

6.7 Verdi相关的选项

6.8 Vivado中的处理方式

7. fsdb波形dump

7.1 vcs环境变量设定

7.2 irun环境设定

7.3 Testbench中植入波形dump命令

7.4 仿真命令行参数指定

7.4.1 vcs仿真器

7.4.2 irun仿真器

8. 基本的Makefile例


1. 前言

        本文简要介绍一些主流的数字逻辑设计仿真器(比如说VCS, IRUN/Xcelium, ModelSim/QuestaSim等)的最基本用法。或许还会考虑一些设计验证辅助工具,比如说波形观测工具Verdi、Xilinx的Vivado等的基本使用方法。或许对入门者有些参考意义。(持续更新中)

2. QuestaSim基本使用方法

        以下实验使用版本:Questa Sim -64 10.6c(Windows10)

        基于以下代码源文件进行实验。

// hello_systemverilog.sv
`timescale 1ns/1ps
module tb;
	initial begin
	    #100ns;
		$display("@%0t: Hello, welcome to SystemVerilog world!",$time());		
		$finish();
	end
	
endmodule

2.1 命令行编译

        命令行运行是指在命令行终端(windows cmd, 或windows terminal等)执行。

 >> vlog -sv hello_systemverilog.sv

        vlog是questasim的编译命令。“-sv”是指示vlog按照systemverilog语法进行编译。 编译后会生成一个库,由于以上没有指定,缺省的库名就是work。如果要显式地指定不同的库名,可以追加选项“-work libname”,初学者就不必去纠结这个了。

2.2 命令行运行

 >> vsim -c -novopt  work.tb

        其中,“-c”表示在命令行运行,即不启动GUI(图形界面)。“-novopt”表示不做优化,在调试时通常使用这个选项,这个会使得仿真速度慢一些。work就是上一节编译生成的库,tb就是其中的仿真模型顶层,对应于以上module的module name。 

        执行以上命令后,进入VSIM的命令行界面,提示符为“VSIM 1>”。

        输入命令run -all就可以完成仿真。如下图所示:

         也可以在run后面跟一个表示时间长度的参数。比如说“run 1ns”等。由以上源文件中可知,总的仿真时间为100ns,所以run后跟的时间长度参数大于等于100ns时其效果与“run -all”是相同的,都会跑完仿真并从VSIM命令行界面退出(退回到终端命令行)。如果小于100ns,则执行完命令后会继续停留在VSIM的命令行界面等待进一步的命令输入。

2.3 启动GUI进行仿真

        上一节的命令中如果去掉“-c”选项,则会启动QuestaSim的图形界面。 当然,也可以显式地加上选项“-gui”

 >> vsim -novopt  work.tb 

在弹出的QuestaSim-GUI的transcript窗口的命令行输入“run -all”,同样可以运行,如下图所示。 

        注意,在运行弹出的对话框,如果选择“是”会退出GUI,选择“否”则会继续停在GUI中等待下一步指令。

        如果停留在GUI中,并且想重新执行一遍仿真,可以执行restart命令,然后运行run -all。注意,不执行restart而运行run -all,不会有任何效果,因为以上仿真已经结束(仿真时间已经前进到100ns处,再执行run也没有什么可运行的了)。restart相当于让仿真时间复位归零。

2.4 从GUI中进行编译运行

        以上是从终端命令行执行QuestaSim编译运行命令启动QuestaSim-GUI。也可以直接先启动QuestaSim-GUI,在GUI中创建project、添加文件、编译、运行等。实际上毋宁说从GUI开始,是初学者最喜欢的方式吧。

        双击QuestaSim图标启动QuestaSim-GUI,

        从菜单栏选择File-->New-->Project:

        选择“Add Existing File”并选择上面编辑好的源代码。右键选择文件从下拉菜单选择compile-->selected file:

         在library窗口看到编译生成的库work,及其中包含的tb:

        右键选择tb并下来菜单按如下图所示选择,即可启动仿真:

        在下面的Transcript窗口会显示出等价的命令行命令“vsim -novopt work.tb”,然后停留在命令行等待指令,输入run -all执行仿真(与上面描述的相同),如下图所示: 

2.5 dump波形

        在图形界面仿真想dump信号波形观察的话,在执行run -all之前先执行以下命令即可:

VSIM 1> log -r /*

        这条命令表示对所有信号进行波形dump,对于初学者来说,所接触的设计都比较小,就全部dump即可。以上命令选项就不赘述。当设计到大型设计的话,就要考虑有选择性的进行波形dump(话说回来,大型设计的话通常就应该采用vcs或者ius等了)。 

        当然,以上例码过于简单,没有波形观测的必要,这里就暂时不演示如何在QuestaSIm-GUI中观察波形了。

2.6 指定随机种子

 >> vsim -c -novopt -sv_seed 0 work.tb

 >> vsim -c -novopt -sv_seed random work.tb

        可以用-sv_seed选项来指定随机化初始种子。 以上第一条语句是指定0作为种子,而第二条语句是指定每次运行随机生成种子。如果仿真程序中有随机因素,则第一条语句即便重复运行也会产生完全相同的结果,而第二条语句在重复运行时每次会产生不同的结果。随机化以及可控的随机化是仿真验证的一个非常重要的方面,值得仔细学习。

2.7 命令行指定testcase名

        当一个testbench中存在多个testcase时,在运行仿真时需要指定所需要运行的testcase名,命令行格式如下:

Vsim [options] +TESTNAME=[testcase]  work.tb 

For example:
vsim work.tb -sv_seed $SEED -l sim.log +TESTNAME=smoke_test

        其中smoke_test为代表一个testcase的class name。 注意,不需要双引号。

2.8 其它常用选项

# 常用
-c              # 使vsim运行在命令行模式,不启动图形界面,节省时间
-novopt     # 不采用vopt优化,常和+acc配合使用,常用于调试阶段需要跟踪观测所有代码中出现的信号时

-voptargs=acc # 采用优化编译,但是保留对所有信号可访问
-l <logfile>       # 输出仿真的log文件
-do <dofile>     # 开始仿真后运行tcl脚本(控制文件)
-L                     # 加载所需要的仿真库文件
-sv_seed [n | random] #指定随机种子
 
# 其它
-t                             # <ps or ns> 定义仿真时间精度
-g|G<name=value># 设置VHDL的generic参数值
-quiet                      # 关闭loading的信息
-coverage        # 在仿真时产生代码覆盖率数据,功能覆盖率数据默认生成,与此项无关 
-classdebug     # 更多类调试功能
-solvefaileddebug   # 使能输出随机化失败等更多调试信息 

2.9 基于Tcl脚本的运行方法

        当设计文件比较多,将所有仿真配置、命令、源文件等相关信息都写到一个Tcl文件中,能够大大提高工作效率。类似于windows中的批处理脚本、或者linux下的shell脚本或者Makefile等。以下介绍一个简单的QuestaSim仿真用Tcl脚本,在Windows和Linux下都可以使用。

set TB   "tb_top" 

set INCDIR "+incdir+../design"

set VCOMP "vlog -cover bst -timescale=1ns/1ps -l comp.log $INCDIR"

# clean the environment and remove trash files
set delfiles [glob work *.log *.ucdb sim.list]

file delete -force {*}$delfiles

# compile the design and dut with a filelist
vlib work
eval $VCOMP     ../src/designfile1.v
eval $VCOMP     ../src/designfile2.v
eval $VCOMP     ../src/designfile3.v
eval $VCOMP -sv  ./dut_pkg1.sv
eval $VCOMP -sv  ./$TB.sv

# run a test
set TEST chnl_burst_test
set SEED [expr int(rand() * 100)]
vsim work.tb -sv_seed $SEED -l sim.log +TESTNAME=$TEST
run -all

2.10 其它常用命令

vlog # 编译
vlib  # 建立一个新的工作库/逻辑库
vmap # 映射逻辑库名到制定的目录
add wave # 将信号加入波形
run [x | -all] # 执行仿真(x表示仿真时间,-all 执行到结束,不带参数表示仅启动仿真)
quit # 退出仿真

3. VCS基本基本使用方法

3.1 编译

3.1.1 基本编译命令

        verilog file编译基本命令:vcs  top.v

        需要编译多个文件时,可以将所有源文件按必要的顺序列在file.list中,然后调用命令:vcs -f file.list

        对于SystemVerilog源文件的编译,需要加上选项-sverilog:vcs -sverilog top.sv

3.1.2 包含路径的指定

        通常将一组相关联的类定义文件组成一个package,在package中include各类定义文件。比如说,Pkg.sv contains `include “file1.sv” ,`include “file2.sv.”

package pkg;

 `include “file1.sv”

 `include “file2.sv”

endpackage

        可以用以下编译命令进行编译,其中“+incdir”用于指定包含路径:

vcs -sverilog  +incdir+filespath pkg.sv

3.1.3 其它常用选项

        指定编译log文件,用“-l”选项:

vcs -sverilog -l compile.log top.sv

        用“-timescale_override”选项指定全局time scale覆盖代码文件中的timescale定义:

vcs -sverilog -timescale =1ns/1ps -l compile.log top.sv #

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

        -timescale与-timescale_override的区别?

        改变参数定义和设置:+define+LENGTH=10

vcs -sverilog  +define+LENGTH=10  -timescale =1ns/1ps -l compile.log top.sv

        对于UVM编译使用: -ntb_opts uvm-1.2

vcs -sverilog  -ntb_opts  uvm-1.2 +define+LENGTH=10  -timescale_override =1ns/1ps -l compile.log top.sv

        debug选项:-debug_all

vcs -sverilog  ntb_opts  uvm-1.2  -debug_all +define+LENGTH=10 

 -timescale_override =1ns/1ps  -l compile.log top.sv

        代码覆盖率仿真选项: -lca  -cm line+cond+fsm+tgl+assert -cm_tgl mda

vcs -sverilog  ntb_opts  uvm-1.2  -debug_all +define+LENGTH=10

-timescale_override =1ns/1ps  -lca  -cm line+cond+fsm+tgl+assert -cm_tgl mda   -l compile.log top.sv

        如果存在多个top module,可以通过-top指定top module进行仿真。在调试阶段特别方便。

vcs –sverilog design.sv –top work.tb1 

3.1.4 vcs选项一览表

        更全面的vcs选项一览表参见:[VCS]VCS常用命令詳解

3.2 vcs两步仿真

        vcs的两步仿真是指,先用vcs命令编译生成一个sim文件(对应于下面三步仿真法中的compile和elaboration两个步骤的处理合二为一),再执行这个sim文件进行仿真。

        vcs的两步仿真方式存在两个问题:

        问题一,当设计比较大的时候,每次都要全部重新编译一遍,比较浪费时间;

        问题二,当设计中存在VHDL文件时,两步法就无法使用,因为VHDL文件需要单独处理。

        解决这些问题可以采用下一节所述的三步仿真更加灵活。

3.3 vcs三步仿真        

        vcs的三步仿真是指分编译(compile)、elaboration、和执行仿真三步执行,如以下Makefile(本Makefile取自路科验证课程示例文件)所示。分别执行make comp, make elab和make run执行三步仿真法的三个步骤。

#############################
# User variables
#############################
TB       = tb1
SEED     = 1
DFILES   = ../mcdt/v1/{arbiter.v,slave_fifo.v,mcdt.v}
VFILES   = $(TB).v


#############################
# Environment variables
#############################
VCOMP                = vlogan -full64 -sverilog -timescale=1ps/1ps -nc -l comp.log 
ELAB                 = vcs -full64 -debug_all -l elab.log -sim_res=1ps -fsdb
RUN                  = $(TB).simv -l run.log -sml +ntb_random_seed=$(SEED)

comp:
    $(VCOMP) $(DFILES) $(VFILES)

elab: 
    $(ELAB) -top $(TB) -o $(TB).simv

run:
    $(RUN) 

        当然,当一切都调试完毕后,也可以直接一条命令执行完事:

make comp elab run

3.4  fsdb波形输出选项

        vcs仿真中要输出fsdb波形,需要以下两方面的代码和设置。

        (1)testbench文件中需要追加fsdb波形dump命令,示例如下:

//6. FSDB Waveform dump. 
initial
begin
    begin
        $fsdbDumpfile("./top.fsdb");
        $fsdbDumpvars(0,tb);
    end 
end

        (2) 在vcs命令行添加“-fsdb选项”,如以上Makefile中的ELAB命令所示:

ELAB                 = vcs -full64 -debug_all -l elab.log -sim_res=1ps -fsdb

        当然,这个选项也可以修改一下,改为可以在命令行指定以便于在执行make命令开启和关闭fsdb波形输出。

3.5 ucli常见命令

        VCS有命令行模式和图形模式,图形模式使用的是DVE,命令交互模式使用的是ucli。

        vcs中要调用ucli接口,执行脚本,必须在compile的时候,加入debug的权限:-debug,-debug_pp,-debug_all,-debug_access,-debug_region。在run的时候,指定vcs -ucli [run_option],需要在编译时加入参数以开启ucli,否则ucli交互时只能使用简单的 ’run’、 ‘dump’、 'quit’命令。

        推荐编译时添加参数如下:

        ‘-debug_access<+option>’ 对系统进行调试

        ‘-debug_access+classdbg’ 用于测试台调试

        ‘debug_access+all’

        ucli提供的命令:

call,调用verilog或者vhdl中的system task;

stop,设置断点;

abort (中止评估宏文件)
ace (评估模拟模拟器命令)
alias 为命令创建别名)
assertion 断言(SVA / PSL)相关命令)
call 执行Verilog系统任务/功能,Verilog PLI任务/功能或VHDL外部过程)
cbug 对C,C ++和SystemC源文件的调试支持)
checkpoint 检查点/在当前/给定时间加入仿真设计)
config 显示/设置配置变量的当前设置)
constraints 显示设计信息,禁用/启用/添加/删除/更改约束,或提取约束的测试用例)
debug
coverage 评估覆盖命令)
detach_sim 从Verdi脱离simv,然后回到UCLI)
do 评估一个TCL(宏)脚本; “源” TCL命令的超集)
drivers 获取信号/变量的驱动程序信息)
dump 创建/操作/关闭转储值更改文件信息)
finish 让工具完成,然后将控制权返回给UCLI)
force 强制或将值存入信号/变量)
fsdb 适用于VCS(-MX)的Debussy FSDB命令集)
get 获取信号/变量的值)
helpdoc 修改或扩展ucli帮助页面)
listing 显示源文本)
loaddl 在模拟器空间中加载/卸载用户的动态对象
loads 获取信号/变量的负载信息
lp_show 本机低功耗(NLP)相关命令
memory 从文件加载/写入文件的内存值,或使用给定值初始化内存
msglog 设计和测试平台静态和动态数据记录
next 推进工具逐步完成任务和功能
onbreak 指定在宏到达停止点时运行的脚本
onerror 指定在宏遇到错误时运行的脚本
onfail 指定在宏遇到故障时运行的脚本
pause 暂停执行宏文件
power 电源统计相关命令(SAIF):
release 从使用“ force”分配的值中释放变量
report_timing 将实例的计时信息报告给指定的文件或控制台
report_violations 设置各种与xprop相关的报告违规
restart 重新执行工具; UCLI将使用以前的设置返回到零时间
restore 恢复保存在文件中的模拟状态
esume 恢复执行宏文件
run xx 运行xx时间后停止,不推荐使用
run 运行仿真直到遇到$stop或者设置的断点
run -posedge xx 运行到信号xx的上升沿停止
run -change xx 运行到信号xx变化时停止
saif 交换活动交换格式相关命令
save 将模拟状态保存到文件中
scope 显示当前的顶层
scope xxx 进入xxx模块
scope -up 回到上一层
search 搜索名称与指定模式匹配的设计对象
senv 显示一个或所有synopsys :: env数组元素
sexpr 评估工具中的表达式
show 显示当前模块的信号及子模块
show xxx -value -radix hex/bin/dec 以特定形式显示信号值
stack 显示线程信息或移动调用堆栈
start 开始执行工具
start_verdi 从UCLI提示符启动Verdi
status 显示宏文件堆栈
step 推进工具一条语句
stop 显示已经设置的断点
stop -posedge xx 在信号的上升沿设置断点
stop -condition {信号表达式} 在信号表达式为真的地方设置断点
stop -delete xx 删除断点xx,xx为断点数字编号
tcheck 启用/禁用指定实例/端口的定时检查
Tcl Tcl内置命令的帮助
thread 显示线程信息或移动当前线程
unalias 删除一个或多个别名
virtual 创建,删除或显示虚拟对象
xprop 设置或查询xprop合并模式

3.5 VCS与VCS_MX的区别

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

4. IUS/Xcelium基本使用方法

4.0 帮助查询方法

irun -helpall | grep "word of interest"

        比如说要查询关于ieee1364的仿真选项,可以输入命令如下:

$ irun -helpall | grep "ieee1364"

        可以得到以下反馈信息(意思是按照IEEE1364标准报告错误):

        -ieee1364                  Report errors according to IEEE 1364 standards 

4.1 基本使用方法

irun +access+rwc helloworld.v -timescale 1ns/10ps  

irun -sv +access+rwc helloworld.sv -timescale 1ns/10ps  

irun -sv +access+rwc helloworld.sv -timescale 1ns/10ps  -seed 42

irun -sv +access+rwc helloworld.sv -timescale 1ns/10ps  -seed random

irun -sv +access+rwc helloworld.sv -timescale 1ns/10ps  -svseed 42

irun -sv +access+rwc helloworld.sv -timescale 1ns/10ps  -svseed random

...

4.2 seed与svseed的区别

        查询irun的帮助信息可以得到:

  -seed <seed>               Set the seed value for SystemVerilog and Specman
  -snseed <seed>             Pass seed value to Specman
  -svseed <seed>             Set SystemVerilog default RNG seed 

         对于systemverilog testbench,seed和svseed没有差别。都是用于指定初始随机种子。<seed>如果是数字的话,则表示用该数字作为随机种子;如果是random的话,则表示随机生成一个数作为初始随机种子。

        指定确定的随机种子使得仿真结果可以再现,为调试提供了巨大的遍历。

4.3 Xcelium


        Xcelium(xrun)是cadence最新的仿真工具,Incisive(irun)的升级版本。

        【单步仿真】
        xrun默认是单步仿真

>> xrun add.v   //自动完成comp , elab ,sim

        【三步仿真】

>> xrun -compile add.v   // compile

>> xrun -elaborate add.v //elab, 生成可执行代码

>> xrun -R                       // 自动识别snapshot并执行

5. Verdi基本使用方法

5.1 verdi直接打开代码

verdi -f filelist.f -top rtl_top

        verdi可以通过上面指令直接打开没有编译的代码,其中rtl_top表示rtl顶层模块。

5.2 kdb选项

        kdb选项是vcs选项,在进行vcs仿真时可以加入kdb选项,vcs仿真会生成verdi的库文件,通常库文件为sim.daidir,库文件里面包含相应代码信息;利用库文件verdi可以快捷打开rtl代码而不需要重新编译。verdi利用daidir打开代码办法(以下两种均可打开RTL代码):

verdi -dbdir simv.daidir &
verdi -simflow -simBin simv &

5.3 verdi直接打开波形

verdi -ssf filename.fsdb

5.4 verdi打开指定的restore文件

verdi -sswr fliename.rc

        verdi可以通过以上指令,指定波形restore文件,可以将已保存的信号恢复。

        而restore文件可以在verdi-gui中以如下方式保存:


        当然加载restore文件也可以在这个菜单下进行(“Restore Signal”)。

6. 源文件指定方式

6.1 最基本的方式

        最基本的方式就是直接在命令行指定单个源文件,比如说(这里以vcs为例,但是对于其它常见工具也基本都适用,下同):

vlogan -sverilog design1.sv

        其中vlogan是vcs的编译命令。以上命令针对一个设计文件进行编译。-sverilog表示其后跟随的文件应该按照SystemVerilog语法进行编译。不指定文件类型的话缺省为verilog。不过,在细节方面处理各种工具有所不同。比如说,vcs是用-sverilog,而QuestaSim、irun等则是用"-sv"。又比如说,有些EDA工具也会根据文件名后缀来推断其类型。除非是文件名后缀为.v,但是希望按照SystemVerilog语法来解释才需要显式地指定“-sv”选项。而vcs则不看文件名后缀,要按systemverilog语法编译必须显式地指定"-sverilog"。

6.2 指定多个文件

        指定多个文件自然就是,作为直感,在命令行跟多个文件就好了。

vlogan -sverilog design1.sv design2.sv design3.sv ...

        但是想一下,如果很多个文件(比如说十几个),而调试阶段需要反复执行编译命令,每次输入这么多文件名就会成为一件令人崩溃的事情(虽然一般来说用up/down键可以查到命令历史避免重复输入的情况)。当文件数再多一些,哪怕在命令行只需要输入一次(其后都用up/down键可以查到命令历史来复用)也是一件可怕的事情。这时候,就需要考虑用一个文件来将所有文件列入其中,参见下一节。

6.3. 使用filelist文件

        将所需要加入的源文件都列在一个文本文件中,然后命令行用“-f”选项引用该文件,这样就解决了上一节所提出来的问题。比如说:

file.lst (ASCII文件,即文本文件):

-sverilog design1.sv 

-sverilog design2.sv 

-sverilog design3.sv

....

-sverilog design100.sv

        然后在命令行只需要如下即可:

vlogan -f file.lst

        当源文件有增删(注意,不是说源文件内容有修改,而是说要添加一个文件或删除一个文件)时只需要单独修改file.lst即可。注意,“file.lst”不是一个专用文件名,你可以自行选择任意合适的文件名。

        但是,当一个大型项目有许多个源文件目录,有非常多的文件(比如说不同的模块、不同的子系统由不同的队伍分别开发,现在做系统集成),像这样一个问一个文件地列出来也是一件和费劲的事情。这时候就可以考虑以指定目录,并结合文件类型(文件后缀)指定的方式来将指定目录下的所有指定后缀类型的文件全部加入了,参见下一节。

        

6.4 指定整个目录中的所有指定后缀的文件

        “-y”用于指定目录路径

        “-libext+”用于指定文件后缀名

        比如说要将目录src1底下的所有.v和.sv后缀的文件全部加入编译列表,可以在命令行,当然更常见的是在一个文件中指定如下:

/************************************************************************
*             RTL source file
************************************************************************/
-y ../../../src/IP_LIB1
-y ../../../src/WAFE_RX
-y ../../../src/HIF
+libext+.v

+libext+.sv

6.5 指定include文件的搜索路径

        有些文件,通常是用于定义参数或者宏定义的头文件是以include的方式包含在其它源文件中,通常在“`include”语句不包含路径信息。编译器在看到“`include”语句时需要去搜索该文件在哪里。这个时候可以用“+incdir+”选项来告诉编译器应该到哪里去找被include的头文件,如下例所示:

/************************************************************************
*             RTL source file
************************************************************************/

+incdir+../../../src/header/
-y ../../../src/IP_LIB1
-y ../../../src/WAFE_RX
-y ../../../src/HIF
+libext+.v

+libext+.sv

../../../src/TOP/design1.sv

../../../src/TOP/design2.sv

        当然在以上这个file.lst文件中仍然可以另行指定单个的文件,如最后两行所示。

6.6 追加宏的定义

        有时候一个设计可以通过宏开关来控制其中的配置情况,比如说一个DMA的设计,4个通道还是8个通道,在编译时指定宏的值来决定按几个通道进行设计配置,也同样可以在命令行或者file.lst指定宏的定义,这里有两种情况。如下所示(最后两行):

/************************************************************************
*             RTL source file
************************************************************************/

+incdir+../../../src/header/
-y ../../../src/IP_LIB1
-y ../../../src/WAFE_RX
-y ../../../src/HIF
+libext+.v
+libext+.sv
../../../src/TOP/design1.sv
../../../src/TOP/design2.sv
+define+NUM_CH=8
+define+DMA_ON

        其中,

        NUM_CH对应于设计中使用到的一个参数类的宏,比如说用于指定通道数为8个。

        DMA_ON则对应于设计中使用的一个开关类的宏,比如说用于打开或关闭某一段代码。

6.7 Verdi相关的选项

        上面通过-y 指定library目录, +libext+.v指定library后缀名。 有时候还用-v 来指定library文件。但是这样直接被verdi吃进去以后不能显示hierarchy和文件。比如说,用Verdi看电路的schematic图时,无法点进去看到下一层次。

        verdi提供了解决的办法是(是否专属于verdi?待确认):   -ssy  (用来取消-y指定的library为library cell)     -ssv (用来取消-v 指定的library为library cell)

/************************************************************************
*             RTL source file
************************************************************************/
-ssy
-ssv
+incdir+../../../src/header/
-y ../../../src/IP_LIB1
-y ../../../src/WAFE_RX
-y ../../../src/HIF
+libext+.v
+libext+.sv
../../../src/TOP/design1.sv
../../../src/TOP/design2.sv
+define+NUM_CH=8
+define+DMA_ON

6.8 Vivado中的处理方式

        在Vivado的Tcl脚本中, 可以通过set_property命令来实现一部分以上选项相同的功能。

For Vivado in project mode:

For \+incdir\+:

    set_property include_dirs <directory_name> [current_fileset]

For \+define\+:

    set_property verilog_define a=b [current_fileset]

        至于,-y and \+incdir\+, Vivado Tcl脚本应该是不支持的(?)。可以考虑在GUI模式中将文件(可以整个目录)加入进去,然后再export成为Tcl脚本,这样会得到如下图所示的样子:

7. fsdb波形dump

7.1 vcs环境变量设定

        首先要把FSDB dumper库的路径添加到LD_LIBRARY_PATH环境变量, Shell命令格式如下:

setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${NOVAS_HOME}/share/PLI/VCS/LINUX64

        注意:如果使用的是32位Linux,需要把LINUX64替换成LINUX。

        然后在vcs的命令行添加 “ -fsdb ” 参数。

7.2 irun环境设定

        将verdi的PLI库路径加入环境变量LD_LIBRARY_PATH:

setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${VERDI_HOME}/share/PLI/IUS/LINUX64

        注意与vcs的路径的区别在于:VCS的是/share/PLI/VCS/LINUX64,Irun的是 /share/PLI/IUS/LINUX64。

7.3 Testbench中植入波形dump命令

        这里以fsdb格式波形的dump为例进行说明。

        首先需要在testbench的顶层植入以下代码块(这个与使用何种仿真器无关)。

initial begin
	if($test$plusargs("FSDB_ON")) begin
        //记录波形,波形名字.fsdb,也可以用字符串变量的方式设置为以testcase命名的文件名
		$fsdbDumpfile("top.fsdb");  
    		//0: 当前级及其下面所有层级,如top.A, top.A.a,所有在top下面的多维数组均会被dump
	    	//1: 仅仅dump当前组,也就是说,只dump top这一层的多维数组。

        //+all参数,dump SV中的struct结构体
		$fsdbDumpvars("+all");  

        //也可以向以下这样指定某个模块进行波形dump,对于大型系统仿真来说这个很重要
        $fsdbDumpvars(0,tb_top.u_DIGITOP.u_BB_TOP);

		$fsdbDumpSVA();   //将assertion的结果存存储到fsdb中
		$fsdbDumpMDA(0, top);  //dump memory arrays

        //以上仅为fsdbDump family的一些常见用法,其它所有各种用法可以查阅相关手册
	end
end

7.4 仿真命令行参数指定

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

7.4.1 vcs仿真器

        对应于以上代码中的参数名“FSDB_ON”,VCS仿真时在命令行以如下方式指定参数即表示开启FSDB波形dump:

vcs ... +FDDB_ON ...

7.4.2 irun仿真器

        与vcs的命令行格式略有不同,irun命令行不需要“+” 。如下所示:

irun ... FSDB_ON ...

8. 基本的Makefile例

irun例子:

TB       = tb
SEED     = 1

run: tb.v
	irun -sv +access+rwc -f rtl.f -timescale 1ns/10ps
    
.PHONY:clean
clean: 
	rm -rf ./INCA_libs *.log irun.history

vcs例子:

.PHONY:comp sim clean

OUTPUT = adder_top

VCS = vcs -sverilog +v2k -timescale=1ns/1ns                             \
	  -debug_all							\
	  -o ${OUTPUT}							\
	  -l compile.log						\

SIM = ./${OUTPUT} -l run.log

comp:
	${VCS} -f verilog_file.f

sim:
	${SIM}

clean:
	rm -rf ./csrc *.daidir *.log simv* *.key

参考文献:

[1] vcs/verdi filist - FLYMOOD - 博客园 (cnblogs.com)

[2] VCS® User Guide

[3] Questa® SIM User's Manual

[4] Support for -y +libext +incdir +define? (xilinx.com)