- List item
UVM验证平台
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机制。