IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> UVM实战 卷I学习笔记4——创建测试用例 -> 正文阅读

[游戏开发]UVM实战 卷I学习笔记4——创建测试用例

创建测试用例

1、加入base_test
UVM使用的是一种树形结构,书中最初这棵树的树根是my_driver,后来由于要放置其他component,树根变成
了my_env。但在实际应用的UVM验证平台中my_env并不是树根,通常树根是一个基于uvm_test派生的类。先讲述base_test,真正的测试用例都是基于base_test派生的一个类

class base_test extends uvm_test; //派生自uvm_test
	my_env env;
	function new(string name = "base_test", uvm_component parent = null);
		super.new(name, parent);
	endfunction
	extern virtual function void buil_phase(uvm_phase phase);
	extern virtual function void repor_phase(uvm_phase phase);
	`uvm_component_utils(base_test) //component类
endclass
function void base_test::build_phase(uvm_phase phase);
	super.build_phase(phase);
	env = my_env::type_id::create("env", this);
	uvm_config_db#(uvm_object_wrapper)::set(this, "env.i_agt.sqr.main_phase",
											"default_sequence", my_sequence::type_id::get());
		//设置sequencer的default_sequence,此处设置了以后其他地方不需要再设置default_sequence
endfunction
function void base_test::report_phase(uvm_phase phase); //在main_phase结束后执行
	uvm_report_server server;
	int err_num;
	super.report_phase(phase);
	server = get_report_server();
	err_num = server.get_serverity_count(UVM_ERROR);
	if(err_num != 0) begin //根据UVM_ERROR的数量打印不同信息
		$display("TEST CASE FAILED");
	end
	else begin
		$display("TEST CASE PASSED");
	end
endfunction
  • 通常在base_test中做如下事情:第一,设置整个验证平台的超时退出时间;第二,通过config_db设置验证平台中某些参数的值。 这些根据不同的验证平台及不同的公司而不同,没有统一的答案。
  • 在把my_env放入base_test中之后,UVM树的层次结构如图所示::
  • top_tb中run_test的参数从my_env变成了base_test,并且config_db中设置virtual interface的路径参数要做如下改变:
initial begin
	run_test("base_test");
end
intial begin
	uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.i_agt.drv", "vif", input_if);
	uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.i_agt.mon", "vif", input_if);
	uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.o_agt.mon", "vif", output_if);
end

2、UVM中测试用例的启动

  • 测试DUT是否按照预期工作,需要对其施加不同的激励,这些激励称为测试向量或pattern。一种激励作为一个测试用例,不同激励就是不同的测试用例。测试用例的数量是衡量验证人员工作成果的最直接目标。
  • 伴随着验证的进行,测试用例的数量一直在增加,在增加的过程中重要的是保证后加的测试用例不影响已建的测试用例。前面通过设置default_sequence的形式启动my_sequence。假如存在my_sequence2,如何在不影响my_sequence的前提下将其启动:最理想的办法是在命令行中指定参数来启动不同的测试用例
  • 无论是在my_env中设置default_sequence,还是在base_test中或top_tb中设置,都必须修改相关的设置代码才能启动my_sequence2。为了解决这个问题,先看两个不同的测试用例。my_case0的定义如下:
class case0_sequence extends uvm_sequence #(my_transaction);
	my_transaction m_trans;
	...
	virtual task body();
		if(starting_phase != null)
			starting_phase.raise_objection(this);
		repeat(10) begin
			`uvm_do(m_trans)
		end
		#100;
		if(starting_phase != null)
			starting_phase.drop_objection(this);
		endtask
		...
endclass
class my_case0 extends base_test;
	function new(string name = "my_case0", uvm_componet parent = null);
		super.new(name, parent);
	endfunction
	extern virtual function void build_phase(uvm_phase phase);
	`uvm_component_utils(my_case0)
endclass
function void my_case0::build_phase(uvm_phase phase);
	super.build_phase(phase);
	uvm_config_db#(uvm_object_wrapper)::set(this, "env.i_agt.sqr.main_phase",
										"default_sequence", case0_sequence::type_id::get());
endfunction		

my_case1的定义如下:

class case1_sequence extends uvm_sequence #(my_transaction);
	my_transaction m_trans;
	...
	virtual task body();
		if(starting_phase != null)
			starting_phase.raise_objection(this);
		repeat(10) begin
			`uvm_do_with(m_trans, {m_trans.pload.size() == 60;}) 
			//uvm_do系列宏的一个,随机化时提供对某些字段的约束
		end
		#100;
		if(starting_phase != null)
			starting_phase.drop_objection(this);
	endtask
	...
endclass
class my_case1 extends base_test;
	function new(string name = "my_case1", uvm_component parent = null);
		super.new(name, parent);
	endfunction
	extern virtual function void build_phase(uvm_phase phase);
	`uvm_component_utils(my_cas1)
endclass
function void my_case1::build_phase(uvm_phase phase);
	super.build_phase(phase);
	uvm_config_db#(uvm_object_wrapper)::set(this, "env.i_agt_sqr.main_phase", 
										"default_sequence", case1_sequence::type_id::get());
endfunction
  • 要启动my_case0,需要在top_tb中更改run_test的参数:(启动my_case1也同理)
initial begin
	run_test("my_case0");
end

当my_case0运行的时候需要修改代码,重新编译后才能运行;当my_case1运行时也需如此,这相当不方便。UVM也提供对不加参数的run_test的支持:

initial begin
	run_test();
end

在这种情况下,UVM会利用UVM_TEST_NAME从命令行中寻找测试用例的名字,创建它的实例并运行。下面代码可以启动my_case0:

<sim command>+UVM_TEST_NAME=my_case1

整个启动及执行的流程如图所示:
在这里插入图片描述
启动后,整棵UVM树的结构如图所示:与前面UVM树结构的唯一区别在于树根的类型从base_teset变成了my_casen。(书中应该打印错误,这里应该是my_case0)
在这里插入图片描述

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-09-29 10:39:01  更:2021-09-29 10:40:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 3:44:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码