我是靠谱客的博主 积极枫叶,最近开发中收集的这篇文章主要介绍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包起来了。

最后,直接运行代码即可。

最后

以上就是积极枫叶为你收集整理的linux VCS+verdi运行UVM实战(第二章)中的例子介绍建立工程运行代码查看波形总结的全部内容,希望文章能够帮你解决linux VCS+verdi运行UVM实战(第二章)中的例子介绍建立工程运行代码查看波形总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(96)

评论列表共有 0 条评论

立即
投稿
返回
顶部