目录
二、UVM结构
2.1UVM组件
UVM的组件(uvm_component类)继承于UVM的核心基类中一个核心分支,均可构成验证环境,这是因为它们都从uvm_component类继承了phase机制(必须在build_phase中实例化),都会经历各个phase阶段。主要介绍构成环境的常见组件类:uvm_driver、uvm_monitor、uvm_sequencer、uvm_agent、uvm_scoreboard、uvm_env和uvm_test等。
图 5uvm_component类和子类
2.1.1uvm_driver
所有driver派生自uvm_driver。Driver的功能主要就是向sequencer索要sequence_item(transaction),并通过虚拟接口把sequence_item里的信息驱动到DUT的接口上。相当于完成了transaction级别到DUT能够接受的端口级别信息的转变。
drive使用工厂机制注册类通常需要三步:声明,注册,调用new()函数。
class my_driver extends uvm_driver#(my_transaction); //my_transaction是sequence item类型
virtual my_if vif; //virtual interface
`uvm_component_utils(my_driver) //在factory中注册my_driver
function new(string name = "my_driver", uvm_component parent = null);
super.new(name, parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
if(!uvm_config_db#(virtual my_if)::get(this, "", "vif", vif))
`uvm_fatal("my_driver", "virtual interface must be set for vif!!!")
endfunction
extern task main_phase(uvm_phase phase);
extern task drive_one_pkt(my_transaction tr);
endclass
uvm_driver在uvm_component基础上没有扩展新的函数/任务,而只是扩展了一些用来通信的端口seq_item_port和rsp_port。在构建环境组件时,派生uvm_driver和uvm_sequencer的类,可以直接使用这些成员变量。
如果不想使用自带的成员变量,想加入改动,也可以由uvm_component来派生Driver等组件,然后自行定义uvm_seq_item_pull_port #(REQ, RSP)等类型的变量,名字可以不再是seq_item_port等(源码见附录一)。
注:uvm_driver和子类都是参数化类,定义新driver类时,应声明获取的事务参数REQ类型(事务参数)。
2.1.2uvm_monitor
monitor通过虚拟接口收集总线信息,并将数据转换成transation级别的sequence_item,再通过端口将数据发送至其他验证组件。收集的数据可用于简单的功能和时序检查。
所有用户自定义数据监测行为的monitor都继承自uvm_monitor,uvm_monitor继承自uvm_component,从源代码来看并没有增添新的成员和方法,但将monitor类都继承于uvm_monitor有助于实现父类monitor的方法和特性。(源码见附录一)
monitor使用工厂机制注册类通常也需要三步:声明uvm_monitor,向工厂注册并调用new()函数。
class my_monitor extends uvm_monitor;
virtual my_if vif;
uvm_analysis_