第一种方法:
此方法用于UVM环境代码编译。
想要modelsim文件或者uvm代码的可以联系我。
软件环境:win10/win7 modelsim SE-64 10.4
实测编译成功并运行。测试代码是张强大大写的《UVM实战》,第二章的代码
example_and_uvm_source_code\puvm\puvm\src\ch2\section2.5\2.5.2
在用的时候,记得将dut.sv和其他组件代码放在同一个文件夹下,modelsim工程最好也建在这个文件夹下,如果不建在这里,我暂时还没有试过会出现什么错误。
命令行的写法
第一句
将库文件编译到work中:
vlib work
第二句
设置环境变量
UVM目录,这个目录是modelsim安装的文件目录,比如你的modelsim安装在D:/modeltech64,这个就是:
set UVM_HOME D:/modeltech64/verilog_src/uvm-1.1d
这句话,set uvm环境库在uvm-1.1d里面,这个是在modelsim软件安装的时候就放在这里的,照着写就好了。我的modelsim目录比较不一样,我安装的时候写的目录是在D:\modeltech64_10.4,所以我的是:
set UVM_HOME D:/modeltech64_10.4/verilog_src/uvm-1.1d
注意这里比较坑的点是如果你直接将windows的目录字符串复制过来,”\”这个字符是不对的,它要改成”/”
第三句
设置工作目录,指的是工程文件的目录,就是你的dut.sv和top_tb.sv放在哪里了。
set WORK_HOME C:/Users/Administrator/Desktop/2.5.2
第四句
启动编译:
vlog +incdir+$UVM_HOME/src
-L mtiAvm -L mtiOvm -L mtiUvm -L mtiUPF
$UVM_HOME/src/uvm_pkg.sv $WORK_HOME/dut.sv top_tb.sv
如果前面两句都对了,这个肯定也是可以的,如果这里提示file can not ……in read mode
那么一般是文件路径错了,再细心检查一下。
第五句
启动仿真:
vsim -novopt -c -sv_lib
D:/modeltech64_10.4/uvm-1.1d/win64/uvm_dpi
work.top_tb +UVM_TESTNAME=my_case0
这里第二个单词 -novopt是不优化dut.sv的意思。
然后,D:/modeltech64_10.4/uvm-1.1d/win64/uvm_dpi这个是uvm_dpi的库路径。
一般人的modelsim目录是D:/modeltech64,所以可以改成
vsim -novopt -c -sv_lib
D:/modeltech64/uvm-1.1d/win64/uvm_dpi
work.top_tb +UVM_TESTNAME=my_case0
work.top_tb是工程工作文件名。
work.top_tb +UVM_TESTNAME=my_case0就是把我的my_case0加入到仿真。
所以我的所有命令行就是
vlib work
set UVM_HOME D:/modeltech64_10.4/verilog_src/uvm-1.1d
set WORK_HOME C:/Users/Administrator/Desktop/2.5.2
vlog +incdir+$UVM_HOME/src -L mtiAvm -L mtiOvm -L mtiUvm -L mtiUPF $UVM_HOME/src/uvm_pkg.sv $WORK_HOME/dut.sv top_tb.sv
vsim -novopt -c -sv_lib D:/modeltech64_10.4/uvm-1.1d/win64/uvm_dpi work.top_tb +UVM_TESTNAME=my_case0
vsim -novopt -c -sv_lib D:/modeltech64_10.4/uvm-1.1d/win64/uvm_dpi work.top_tb +UVM_TESTNAME=my_case1
注意1:
在写这些命令行的时候,直接写完一行,不要换行,否则可能会出现错误。
按照下面这样写可能会出错。
注意2:如果,在你的top_tb.sv中, 写的是
run_test(“my_case0”);
这样的句子,那么最后一句使用
vsim -novopt -c -sv_lib
D:/modeltech64_10.4/uvm-1.1d/win64/uvm_dpi work.top_tb
这样命令行就可以进入仿真。
但是如果是用
run_test();
这样的句子,需要修改进入仿真的语句。
原语句:
vsim -novopt -c -sv_lib
D:/modeltech64_10.4/uvm-1.1d/win64/uvm_dpi work.top_tb
改成:
vsim -novopt -c -sv_lib
D:/modeltech64_10.4/uvm-1.1d/win64/uvm_dpi
work.top_tb +UVM_TESTNAME=my_case0
这里是只有一个case0的情况,如果有另外一个case文件,文件名是my_case1,则将最后的名字改为my_case1即可,张强这里的例子应该是后者。
注:有人说这里run_test();可能是不对的,可以改成run_test(“”);试试,我这里run_test();是可以的。
接下来的操作是在modelsim里面建立工程:
注意,下面这个操作不用管。
接下来在命令行复制粘贴命令就可以了
可以直接复制粘贴5个句子进去,然后按下回车。
进入仿真界面,按下
跑完了。
第一种方法到此结束,后面是第二种方法。第二种方法虽然操作简单,但是有一定的局限性,
所以我推荐使用第一种方法。
第二种方法的局限性是:
这种方法在编译的时候,如果将uvm代码分开写在不同文件里面,就会出现编译错误。
比如我在top_tb.sv里面有包含了一些库文件
`include "uvm_macros.svh"
import uvm_pkg::*;
然后在top_tb.sv里面写
`include “1.sv”
这样写完之后,如果我想在1.sv文件里面,用uvm_macros.svh这些库文件的内容。
会发现用不了。
如果想要解决这个问题,我需要把包含库文件的语句也加入到1.sv里面,这样重复性的包含文件很麻烦。
第二种方法:
1 新建工程
2 加文件
3 hello world
module Hello_World;
initial
begin
$display("Hello World! SystemVerilog");
end
endmodule
4 编译
编译成功下方transcript会有提示,如果错误按照提示修改
work里面出现对应的编译后文件,如果没有出现该文件,尝试改一下程序里面的模块名,我改动了一下module名后就能编译出来了。
5 仿真及运行
然后有几种方法可以运行程序
第一种
第二种 在命令行输入run或者run -all
第三种
运行的结果
注意:如果要重新运行,我是这么操作的。
结束仿真
注:
如果想在modelsim中查看覆盖率,需要添加下面红色字体的语句
vlib work
set UVM_HOME D:/modeltech64_10.4/verilog_src/uvm-1.1d
set WORK_HOME C:/Users/Shadow/Desktop/section7.2_spi_dut
vlog +incdir+$UVM_HOME/src -cover sbce3 -L mtiAvm -L mtiOvm -L mtiUvm -L mtiUPF $UVM_HOME/src/uvm_pkg.sv $WORK_HOME/dut.sv top_tb.sv
vsim -coverage -novopt -c -sv_lib D:/modeltech64_10.4/uvm-1.1d/win64/uvm_dpi work.top_tb +UVM_TESTNAME=my_case0