UVM 基础入门
一、框架
框架一
构成环境的组件都从uvm_component类继承而来,这是因为它们都从uvm_component类继承了phase机制,都会经历各个phase阶段。常见组件如下:
-
uvm_sequencer
:所有的sequencer都要派生自uvm_sequencer。
sequencer功能:组织管理sequence,driver申请数据时,它就把sequence生成的sequence_item发给driver。 -
uvm_driver
:所有的driver都要派生自uvm_driver。
driver功能:向sequencer申请sequence_item(数据包),并将包里的信息按照总线协议规定驱动到DUT的端口上。//uvm_driver定义 class uvm_driver #(type REQ=uvm_sequence_item,type RSP=REQ) extends uvm_component;
-
uvm_monitor
:所有的的monitor都要派生自uvm_monitor。
monitor功能:为了检测接口数据,从DUT接收数据,并将其转成transaction级别的sequence_item,发送给scoreboard,供其比较。 -
uvm_agent
:所有的agent要派生自uvm_agent。
agent功能:将sequencer、driver和monitor封装在一起,agent模块的使用提高了代码的可重用性。
(UVM_ACTIVE/UVM_PASSIVE、两种模式) -
uvm_scoreboard
:一般的scoreboard都要派生自uvm_scoreboard。
scoreboard功能:比较reference model和monitor分别发送来的数据,根据比较结果判断DUT是否正确工作。 -
uvm_env
:所有的env要派生自uvm_env。
env功能:将平台上的component组件封装在一起,实现一个环境多个用例。运行不同用例时,在其中实例化env即可。可以看做一个结构化的容器。 -
uvm_test
:所有的测试用例要派生自uvm_test或其派生类
。
任何一个派生的测试用例中,都要实例化env。这样,当用例运行时,才能把数据发给DUT,并接收DUT的数据。 -
reference model
:UVM中并没有针对reference model定义一个类。通常,reference model直接派生自uvm_component。
作用就是模仿DUT,完成与DUT相同的功能。DUT是用Verilog写成的时序电路,而reference model则可以直接使用SystemVerilog高级语言的特性,同时还可以通过DPI等接口调用其他语言来完成与DUT相同的功能。
框架二
框架三
二、各组建关系
component与object是UVM中最基本的两个概念。
uvm_object是UVM中最基本的类,几乎全部的类都是由uvm_object类派生出来,其中包含uvm_component。
uvm_object 提供的核心方法主要提供与数据操作的相关服务,Copy
、Clone
、Compara
、Print
、pack/unpack
uvm_component有两大特性是uvm_object所不具备的。
- **一
是通过在new的时候必须要指定parent参数来产生一种树形的组织结构
; - 二
是具有phase的自动执行特点
。所有的UVM树的结点都是由uvm_component构成的,只有基于uvm_component派生出的类才有可能是UVM树的结点。UVM中一些常见类的继承关系如图3所示。
三、uvm_object类
类的预定义
预定义uvm_object的相关扩展类,以便在uvm_object的相关方法中调用:
typedef class uvm_report_object;
typedef class uvm_object_wrapper;
typedef class uvm_objection; // uvm_object类中未使用
typedef class uvm_component; // uvm_object类中未使用
typedef class uvm_status_container;
类的方法
类的声明
virtual class uvm_object extends uvm_void;
endclass
变量声明
// 静态变量,决定是否使能UVM中的播种机制,影响全局的reseed()方法;
static bit use_uvm_seeding = 1;
// 局部变量,通过new函数将类的实例化名传递给该变量,变量对子类及外部不可见;
local string m_leaf_name;
// 局部变量,使用new()函数实例化类时,m_inst_count自动加1并传递给该局部变量,用于返回实例化id,变量对子类及外部不可见;
local int m_inst_id;
// 静态局部变量,用于返回实例化次数,该局部变量对子类可见,对外部不可见;
static protected int m_inst_count;
static uvm_status_container __m_uvm_status_container = new;
// 查找表,用于copy()函数的实现;
local static uvm_object uvm_global_copy_map[uvm_object];
方法声明
virtual function void copy(uvm_object rhs); // **默认进行深复制**
//相比于copy函数,print(), compare(), pack()等函数需要对数据操作做出额外的配置,声明如下:
virtual function void print(uvm_printer printer=null);
virtual function void sprint(uvm_printer printer=null);
virtual function bit compare(uvm_object rhs, uvm_comparer comparer=null);
virtual function int pack(ref bit bitstream[], input uvm_packer packer=null);
virtual function int unpack(ref bit bitstream[