chap3 uvm基础
3.1.1 uvm
component和object类是uvm中的两大概念。uvm_object是uvm中最基本的类,所有的类都继承uvm_object,uvm_component也是派生来自uvm_object。
3.1.2 常用的uvm_object类
3.1.3常见的uvm_componbent类
3.1.4uvm_object的相关宏
与factory相关的宏
`uvm_object_utils(my_object)
`uvm_object_param_utils(my_object)
`uvm_object_utils_begin(my_object)
`uvm_object_utils_begin(my_object)
`uvm_object_param_utils_begin(my_object)
`uvm_object_param_utils_end(my_object)
//将一个参数化的类注册到factory中
class A#(int width) extends uvm_object
3.1.5与uvm_component相关的宏,
通过将这些component注册到factory中,以及变量进行域的自动化。可以1)使得component获得object的拥有的compare、print函数,2)还可以自动调用:config_db::get来得到变量的值
`uvm_component_utils(my_object)
`uvm_component_param_utils(my_object)
`uvm_component_utils_begin(my_object)
`uvm_component_utils_begin(my_object)
`uvm_component_param_utils_begin(my_object)
`uvm_component_param_utils_end(my_object)
//将一个参数化的类注册到factory中
class A#(int width) extends uvm_component
3.1.6UVM componen与object的区别
优点:uvm_componnent一是可以在实例化的时候指定parent参数形成uvm拓扑结构,二是uvm component具有phase的自动执行。
限制:uvm_component作为UVM树的结点,这一特性使得它失去了uvm_object的某些特征。clone函数无法用于uvm_component,因为新克隆出来的类,parent的参数无法确定。
但是可以使用copy函数,copy之前,目标实例已经使用new函数分配好空间指定好parent。而使用clone函数,目标实例可以只是一个空指针。clone=new+copy
3.2 uvm的树形结构
uvm树通过uvm component构成节点最后构成树,所以uvm component在实例化的时候需要指定parent。
//object
function new(string name+);
//component
function new(string name , uvm_component parent);
3.2.2UVM树的根
为什么uvm不以uvm_test派生出来的测试用例(uvm_test_top)作为树根?
因为(1)uvm_root的存在可以保证所有的而验证平台都只有一颗树。当实例化一个对象的parent=null时,那这个component在实例化时,会将他的parent设置为uvm_root.(2)个人觉得uvm-top包含了dut,当环境里要访问某个变量时,绝对路径的开始就是uvm_top。
3.2.3层次结构相关的函数
通过comp.get_parent(),可以返回comp的parent_comp
通过comp.get_child(name),name为child实例化的名字,可以返沪comp的child。(感觉没什么用,直接引用不香吗?)
3.3 field_automation机制
3.3.1field_automation机制的相关宏(如何注册)
将不同的类型进行域的自动化。就是将整数、实数、枚举类型等进行注册
3.3.2field_automation机制常用函数(注册了又有啥用)
进行了域的自动化可以直接使用的函数:copy,clone,compare……
3.3.3field_automation机制标志位的作用
通过这些标志位表示打开哪些自动化的功能,可以使用哪函数
3.3.4field_automation中宏和if的结合
if(a==0) 是否对某些变量进行域的自动化。
3.4uvm打印信息
1、冗余度阈值
由上至下越来越冗余
3.5 config_db机制
1、uvm中的路径:config_db中使用的路径是对象的路径,不是句柄的路径
2、set和get函数
使用不说了,只一点第一个参数如果=null相当于uvm_root::get()=uvm_top
3、省略get语句
1)接收的组件在工厂中注册
2)传输的变量在工厂中注册
3)调用super.build_phase(),会自动执行get语句
4、跨层次的多重设置
当有多个地方进行set,以哪个为准?
1、看发信人,set的第一个参数,谁靠近树根,谁重要
2、看时间。当发信人一致时,后发的起作用。(注意可能要根据build_phase的启动顺序判断谁后发)
5、同一层次的多重设置.
6、非直线的设置和获取
scb和drv的通信,首先这可能会面临一个还没有set,就get的风险,需要注意。
至于非直线的set路径是通过1)this.m_parent,再来设置路径2)通过绝对路径
7、conffig_db对通配符的支持
get函数
//得到某个类的唯一实例
top = uvm_root::get();
//uvm_top
//component 获取这个节点的完整层次(路径实例名,不是类名 )
//object 实例名,object不作为uvm树的节点,会有不同的返回值
get_full_name()
//uvm_test_top.env_inst.comp1_inst
//获取当前节点的实例名,不是类名(创建对象时,传入的字符串)
get_name()
//comp1_inst
//获取对象的类的名字,以string形式返回,string是在注册时产生的
get_type_name();
//my_comp