目录
前言
介绍
建立工程
运行代码
查看波形
总结
前言
用VCS+verdi运行了下UVM实战中的例子(第二章)。
介绍
在某宝上花了几十块,买了个虚拟机(已经安装好VCS+verdi)。直接用UVM实战中,现成的uvm代码跑了下。
建立工程
UVM实战源码下载地址:UVM实战源码下载
书中DUT的功能:通过rxd接收数据,再通过txd发送出去。其中rx_dv是接收的数据有效指示,tx_en是发送的数据有效指示。具体代码如下所示:
module dut(clk,rst_n,rxd,rx_dv,txd,tx_en);
input clk;
input rst_n;
input [7:0]rxd;
input rx_dv;
output [7:0]txd;
output tx_en;
reg[7:0] txd;
reg tx_en;
always @(posedge clk) begin
if (!rst_n) begin
txd <= 8'b0;
tx_en <= 1'b0;
end
else begin
txd <= rxd;
tx_en <= rx_dv;
end
end
endmodule
具体的代码说明和UVM环境如何构建,书中有详细的描述,按着书中所讲的一步一步的敲代码就可以把环境构建起来。
本文主要是将这个UVM工程给运行起来,我们采用VCS+verdi的方式。工程如下所示:
将UVM环境的代码复制到各个文件中,如下图所示:
如果第一次接触UVM,建议对着实战源码一句一句的敲。然后去编译,看哪里有问题,可以学习一些经验。
写一个简单的makefile,如下所示:
simulate ?= vcs
FILELIST = ./../tb/top.f
tc ?= test_case
DUMP_EN ?= 1
LOG_DIR = ${shell mkdir -p ./log}
WAVE_DIR = ${shell mkdir -p ./wave}
ifeq ($(DUMP_EN), 1)
WAVE = +define+WAVE_DUMP -fsdb
else
WAVE =
endif
comp:
vcs \
-f $(FILELIST) \
-kdb -lca \
-full64 \
-sverilog -v2k \
-ntb_opts uvm-1.1 \
-debug_access+all -debug_region+cell+encrypt \
+lint=TFIPC-L +warn=all -error=IWNF \
-top top_tb \
-Mupdate \
+memcbk \
+libext+.v+.V+.sv+.vp \
+systemverilogext+.sv+.SV+ \
+nospecify +notimingcheck \
-timescale=1ns/100ps \
$(LOG_DIR) \
$(WAVE_DIR) \
$(WAVE) \
+tc_name=$(tc) \
-l ./log/$(tc)_compile.log
sim:
./simv \
-l ./log/$(tc)_sim.log \
-ucli -i do.ucli \
+UVM_MAX_QUIT_COUNT=6,NO \
+UVM_VERBOSITY=UVM_LOW \
+UVM_TESTCASE=${tc} \
+UVM_TESTNAME=${tc} \
+TC_NAME=$(tc) \
+vpdfileswitchsize=300
run: comp sim
verdi:
verdi \
-f $(FILELIST) \
-sverilog -v2k -sv \
-ntb_opts uvm-1.1 \
+libext+.v+.V+.sv+.vp \
+nospecify +notimingcheck \
-timescale=1ns/100ps \
-ssf ./wave/$(tc)_wave.vf
clean:
rm -f ./wave/* \
rm -f *.log \
rm -rf simv* \
rm -rf simv.daidir
在top_tb中,增加一个dump波形的代码。
initial begin:WAVE_GEN
string tc_name;
if ($value$plusargs("TC_NAME=%s", tc_name)) begin
$display("tc_name=%s", tc_name);
end
`ifdef WAVE_DUMP
`define DUMP_SCOPE top_tb
$display("start dump wave");
$fsdbAutoSwitchDumpfile(300, $sformatf("./wave/%s_wave.fsdb", tc_name), 100);
$fsdbDumpvars(0, `DUMP_SCOPE, "+all");
`endif
end
增加filelist文件,将dut文件和验证环境的文件添加到filelist中。
-f $UVM_TEST_PATH/my_test/tb/dut.f
-f $UVM_TEST_PATH/my_test/tb/env.f
-f $UVM_TEST_PATH/my_test/tc/tc.f
-f $UVM_TEST_PATH/my_test/tb/tb.f
$UVM_TEST_PATH/my_test/tb/top_tb.sv
将UVM源码放到位置linux中(位置自己定),并在为其添加环境变量。
export UVM_HOME="$SNPSYS_HOME/uvm-1.1"
UVM源码下载地址:UVM源码下载
运行代码
编译仿真代码。
直接在terminal输入:make run tc=XXXX(XXXX是testcase的名字)
make run tc=my_case0
查看波形
仿真完之后,运行make verdi,打开FSDB波形文件。
make verdi tc=my_case0
总结
直接复制UVM实战的源码,也可以自己对着源码敲。
将dut代码,agent代码,env代码以及reference model代码,直接进行文件分类,用package包起来了。
最后,直接运行代码即可。文章来源:https://www.toymoban.com/news/detail-402473.html
代码链接,直接下载:https://download.csdn.net/download/qq_37708525/87337876?spm=1001.2014.3001.5503https://download.csdn.net/download/qq_37708525/87337876?spm=1001.2014.3001.5503文章来源地址https://www.toymoban.com/news/detail-402473.html
到了这里,关于linux VCS+verdi运行UVM实战(第二章)中的例子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!