- typedef class
- 函数new
- 变量use_uvm_seeding
- 成员变量和局部变量的区别
- set_name get_name get_full_name
- 上述函数有一些是virtual function还有一些是静态函数
- 上述函数有一些是与uvm_object_wraper有关属于factory的范畴暂时搞不懂后面再说
- 还有很多函数packprintcopyclonerecord之类的先看uvm class reference文档再结合代码理解
typedef class
typedef class uvm_component;
表示uvm_object
会使用到uvm_component
类,但是uvm_component
类还没有定义。
不过,在uvm_object,暂时没发现使用。所以,个人理解,这一句删掉也没关系。
函数new
相关源代码:
static protected int m_inst_count; //m是member,成员的意思吧。类实例化的个数。
local int m_inst_id; //类实例化的id。跟类实例化个数有关系,比如类实例化3个,则类实例化的id为1,2,3
local string m_leaf_name; //类的实例化名称,是uvm树形层次结构的一个枝叶。
function uvm_object::new (string name="");
m_inst_id = m_inst_count++;
m_leaf_name = name;
endfunction
function int uvm_object::get_inst_count();
return m_inst_count;
endfunction
function int uvm_object::get_inst_id();
return m_inst_id;
endfunction
注意:
如果基类构造函数new()有参数,那么扩展类,必须有一个构造函数,并在构造函数的第一行调用基类的构造函数。
Class basel
Function new(input int var);
this.var = var;//利用this关键词,把new函数的参数,传递给类成员变量。
endfunction
endclass
class extended extends basel
function new(input int var);
super.new(var);
endfunction
endclass
变量use_uvm_seeding
相关源代码:
static bit use_uvm_seeding = 1; //静态变量,所以systemverilog全部对象,都可以访问它,可写可读。
function void uvm_object::reseed ();
if(use_uvm_seeding)
this.srandom(uvm_create_random_seed(get_type_name(), get_full_name())); //类的方法,如果使用成员函数和成员变量的话,需要this关键词定位为当前类。理解这个,需要了解成员变量和局部变量的区别。见下面介绍。//这里的意思,个人理解,是重新产生一个uvm_object类的随机种子,默认随机种子是与process进程有关。
endfunction
参考:
类声明中的静态方法,类的全范围内可以调用,也可以无创建对象的方式被访问,不可以访问非静态的成员(属性和其他方法);
不能声明为virtual,声明中不能使用this句柄;
this指针,涉及类的属性、变量参数、对象本地的变量参数或方法,应用在非静态方法中。
成员变量和局部变量的区别
1、成员变量和局部变更的类型可以是systemverilog中的任何一种数据类型.变量定义部分所定义的变更被称为类的成员变量(类里的变量),在方法体中定义的变量和方法的参数被称为局部变量(方法里的变量)。
2、成员变量在整个类内都有效,局部变量只在定义它的方法内有效。
3、成员变量又分为实例成员变量(实例变量)和类变量(静态变量)。、
4、如果局部变量的名字和成员变量的名字相同,则成员变量被隐藏,即这个成员变量在这个方法内暂时失效。
5、如果局部变量的名字和成员变量的名字相同,则成员变量被隐藏。这时如果想在该方法内使用成员变量,必须使用关键字this.【如果是静态成员变量,就不需要了。】
set_name get_name get_full_name
// get_name
// --------
function string uvm_object::get_name ();
return m_leaf_name; //返回值是类的实例名称
endfunction
// get_full_name
// -------------
function string uvm_object::get_full_name ();//本意是全层次结构下的实例名称。这里看来就是枝叶的实例名称,没有结构层次。应该是因为uvm_object没有树形结构吧(uvm_component才有树形结构)。
return get_name();
endfunction
// set_name
// --------
function void uvm_object::set_name (string name);
m_leaf_name = name;//设置类的实例名称,跟new设置实例名称是一样的作用。
endfunction
上述函数有一些是virtual function,还有一些是静态函数。
- virtual function,这样扩展类中才可以重新定义。扩展类中函数,和基类中函数名一样时,通过supper.函数名,调用基类中函数。Systemverilog中不允许supper.supper.new方式经行多层调用。
- pure virtual function,在子类里定义这个函数。该类里,只声明。
- static function,函数内的变量,都是静态变量。定义静态函数,意义是为了访问一大堆静态变量。
上述函数,有一些是与uvm_object_wraper有关,属于factory的范畴,暂时搞不懂。后面再说。
function | description |
get_type | Returns the type-proxy (wrapper) for this object. |
get_object_type | Returns the type-proxy (wrapper) for this object. |
get_type_name | This function returns the type name of the object, which is typically the type identifier enclosed in quotes. |
还有很多函数,pack、print、copy、clone、record之类的,先看uvm class reference文档再结合代码理解。
有需要的时候,再看吧。