UVM验证平台-自学笔记

  • List item

1 driver组件

driver就应该派生自uvm_driver,这个派生类的new函数有两个参数,第一个是字符串类型,表示派生类的name,第二个则是其父节点的名字。如:

class my_driver extends UVM_driver;
	function new(string name = "my_driver",uvm_component parent = null);
		super.new(name,parent);
	endfunction
	extern virtual task main_phase(uvm_phase phase);
endclass

1.1 类class中的构造函数new()

类的定义:

class A;
...
endclass

类的实例化:

A a_inst;
a_inst=new();

类的实例化在于通知systemverilog的仿真器:创建一个实例A。new函数在于为a_inst分配内存空间。

1.2 类的继承

定义类:

class cat;
...
endclass

子类的继承:

class black cat extends cat;
...
endclass

1.2.1 对父类方法的调用——super

通过extends对子类进行定义,在子类中通过super对父类中方法function进行调用。

class my_driver extends UVM_driver;
	function new(string name = "my_driver",uvm_component parent = null);
		super.new(name,parent);
	endfunction
	extern virtual task main_phase(uvm_phase phase);
endclass

1.3 UVM中的phase机制

uvm利用phase机制实现了各个组件之间的同步。因为每个组件都包括一些预定义的同名phase,在没有执行完所有组件的当前phase之前绝对不会去执行所有组件的下一个phase。
uvm中每个组件包含的phase如下图所示,分为build time,run time,cleanup三个阶段,从上到下依次执行。其中,run phase和run-time phase并发执行。
在这里插入图片描述
引入phase机制,通过该机制可以将UVM仿真阶段层次化
自己对phase的总结:①phase都是用task实现;
②是整个UVM仿真中的同步机制;
③是UVM定义的一套规范,约定了各个仿真阶段的功能。

2 factory机制

factory是UVM中一个非常重要的机制,factory机制被集成在宏中:uvm_component_utils中,功能就是run_test();就可以直接创建一个类的实例并调用其函数。但是用factory机制前需要通过uvm_component_utils宏进行注册,例如:

'uvm_component_utils(my_driver);

只有经过注册的类才能使用factory机制这一功能,所有派生自uvm_component及其派生类的类都应该使用uvm_component_utils宏注册。

3 objection机制

UVM中通过objection机制来控制验证平台的关闭,在每个phase中,UVM会检查是否有objection被提起(raise_objection)仿真平台开,若有,等这个objection被撤销(drop_objection)后停止仿真仿真平台关;如果没有,马上结束当前的phase。
raise_objection必须在main_phase中第一个消耗仿真时间,即出现在@(posedge top.clk)等语句之前

task my_driver::main_phase(uvm_phase phase);
	phase.raise_objection(this);
	...
	phase.drop_objection(this);
endtask

4 virtual interface

interface来连接验证平台和DUT(verilog)的端口,interface的定义:

interface my_if(input clk,input rst_n);

logic [7:0] data;
logic valid;
endinterface

定义之后,可以在top文件中使用这个接口了(顶层文件中的实例化)。如:

my_if input_if(clk,rst_n);
my_if output_if(clk,rst_n);

在类中只能使用virtual interface声明接口。(类中的实例化)

class my_driver extends uvm_driver;

virtual my_if vif;

5. config_db 机制

由于UVM通过run_test()语句实例化了一个脱离了top_tb层次结构的实例(uvm_test_top),建立了一个新的层次结构,所以UVM引进了config_db机制,用于interface和class之间的通信。

5.1 set函数的参数

config_db机制用于在UVM验证平台间传递参数。它们通常都是成对出现的。set函数是寄信,而get函数是收信。如在某个测试用例的build_phase中,寄信方式如下:

uvm_config_db#(int)::set(null,"env.i_agt.drv","pre_num",100);

其中第一个和第二个参数联合起来组成目标路径,与此路径符合的目标才能收信。第一个参数必须是一个uvm_component实例的指针,第二个参数是相对此实例的路径。第三个参数表示一个记号,用以说明这个值是传给目标中的哪个成员的,第四个参数是要设置的值。

5.2 get函数的参数

在driver中的build_phase使用如下方式收信:

uvm_config_db#(int)::get(this,"","pre num",pre num);

第一个参数也必须是一个uvm_component实例的指针,第二个参数是相对此实例的路径。一般的,如果第一个参数被设置为this,那么第二个参数可以是一个空的字符串。第三个参数就是set函数中的第三个参数set和get函数的第三个参数必须保持一致,第四个参数则是要设置的变量。

6 transaction

可以将transaction理解为以太网中的数据包,一个transaction就是一个包,在不同的验证平台中就有不同的transaction。
在UVM中my_transaction的基类为uvm_sequence_item,只有从uvm_sequence_item派生出来的transaction才可以使用sequence机制。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值