linux VCS+verdi运行UVM实战(第二章)中的例子

目录

前言

介绍

建立工程

运行代码

查看波形

总结


前言

用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://download.csdn.net/download/qq_37708525/87337876?spm=1001.2014.3001.5503icon-default.png?t=N658https://download.csdn.net/download/qq_37708525/87337876?spm=1001.2014.3001.5503

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

垮掉一代

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值