UVM Field机制详解一:宏和用法介绍

目录

一   简要       

二   field机制的使用方法

三   field机制的注册宏

3.1 flag

3.2 注册宏

        1.基础类

        2.定宽数组

        3. 动态数组

        4. 队列

        5. 关联数组


一   简要       

        UVM Field机制,就是在环境中继承于object的类中定义一些变量,然后使用UVM自带的宏来注册这些变量,最后可以针对这些类使用内置方法,比如copy,print,compare等。在UVM中是非常常见的使用方法。

二   field机制的使用方法

typedef enum{
        BLUE=0,
        RED =1
        }color_e;

//UVM中绝大部分类均继承于uvm_object,故继承于UVM内置类的子类均可调用uvm_field宏
class test_class extends uvm_transaction;
   int    aaa_int;
   string bbb_string;
   color_e color_enum;
   `uvm_object_utils_begin(test_class)
      `uvm_object_int(aaa_int            ,UVM_ALL_ON)
      `uvm_object_string(bbb_string      ,UVM_ALL_ON)
      `uvm_object_enum(color_e,color_enum,UVM_ALL_ON | UVM_NOPRINT)
   `uvm_object_utils_end
endclass

class test2_class;
  test_class test1;
  test_class test2;
  test1 = new();
  test2 = new();
  test1.print();
  test1.compare(test2);
  test1.copy(test2);
endclass

        可以看到,在代码中定义了三种类型的变量,分别调用了不同的宏去注册。而在test2_class中,例化了这个类,然后通过test.print()等去调用这些方法,print是其中的一种方法,实际效果是将注册进去的类用一种格式打印出来。下面是uvm中内置的filed机制的所有方法和使用说明。

UVM field机制方法
方法名使用方法介绍(其中成员均指注册的成员)
copytr1.copy(tr2);将tr2中的成员变量值复制到tr1中,两个对象均需要实例化
clone$cast(tr1,tr2.clone());将tr2中的成员变量值复制到tr1中,其中tr2需要实例化,tr1不需要实例化,clone不能直接使用=赋值,必须使用cast,具体原因可看后续copy章节。
comparetr1.compare(tr2);将tr1中的成员与tr2中的成员进行比较,两个对象均需要实例化
printtr1.print();将tr1中的成员按照标准格式打印出来,打印内容包括类型,名字,值等。
packtr1.pack(pack_out);将tr1中的所有成员,按bit打包成bit数组,其中pack_out是bit类型的动态数组。

pack_bytes

tr1.pack_bytes(pack_out);将tr1中的所有成员,按bit打包成byte数组,其中pack_out是无符号byte类型的动态数组。
pack_inttr1.pack_ints(pack_out);将tr1中的所有成员,按bit打包成int数组,其中pack_out是无符号int类型的动态数组。
unpacktr1.unpack(pack_in);将bit类型的动态数组还原乘tr1中的所有成员,其中pack_in是bit类型的定宽数组(或new之后的动态数组)。

unpack_bytes

tr1.unpack_bytes(pack_in);将byte类型的动态数组还原乘tr1中的所有成员,其中pack_in是无符号byte类型的定宽数组(或new之后的动态数组)。
unpack_inttr1.unpack_ints(pack_in);将int类型的动态数组还原乘tr1中的所有成员,其中pack_in是无符号int类型的定宽数组(或new之后的动态数组)。
record

tr1.tr_handle=1;

tr1.record();

将tr1中的所有成员按照格式打印到文件中。和其他方法不同,在使用record的时候不能注册之后直接使用,必须先将tr_handle参数置一,具体原因可看后续record章节。

三   field机制的注册宏

        在成员的注册时,使用的宏一般需要传入两个参数,一个是成员的名字,另一个是注册的flag。flag表示对应成员的功能启动与否,是一种简单的对于方法的控制手段。先介绍一下flag。

3.1  flag

uvm-1.1/base/uvm_object_globals.svh  

        由源码可以看出,flag是一个15bit(或者更大)的数,每一个bit表示一个状态,有三个parameter在该版本可以表示所有功能均开启,即UVM_DEFAULT, UVM_ALL_ON, UVM_FLAGS_ON。比较常用的是UVM_ALL_ON, UVM_DEFAULT比其他parameter多一个bit,是为了后续功能增加的预留项。现在的版本,用UVM_ALL_ON是足够的。        

        实际上,在FLAG中真正生效的是1,3,5...bit,也就是UVM_NO*的parameter。置1为有效,即关闭相关功能。所以输入0和输入UVM_ALL_ON的效果是一致的。不过为了避免产生歧义,还是建议使用UVM_ALL_ON。 

        由于flag是一个常数,所以在需要关闭某些功能的时候,可以在调用宏时,传入下面这样的参数即可。UVM_ALL_ON | UVM_NORECORD ,若是要关闭更多功能,可以在后面或上更多位。

3.2 注册宏

        1.基础类

注册类别注册宏
整形`uvm_field_int(ARG,FLAG)
浮点`uvm_field_real(ARG,FLAG)
object(uvm_object的子类)`uvm_field_object(ARG,FLAG)
事件`uvm_field_event(ARG,FLAG)
字符串`uvm_field_string(ARG,FLAG)
枚举`uvm_field_enum(T,ARG,FLAG)

        基础类包括int,real,oject,event,string类型,传入的参数都是两个,第一个ARG是变量的名字,第二个则是前面说的flag。

        还有一个是枚举类型,在类中定义枚举类型时,若需要注册,则必须先使用typedef定义一个枚举类型的变量类型。然后在类中使用该枚举类型去定义一个变量。而在注册时,需要将该枚举类型作为参数传入,即宏中的T。

        2.定宽数组

注册类别注册宏
int类型的定宽数组`uvm_field_sarray_int(ARG,FLAG)
object类型的定宽数组`uvm_field_sarray_object(ARG,FLAG)
string类型的定宽数组`uvm_field_sarray_string(ARG,FLAG)
enum类型的定宽数组`uvm_field_sarray_enum(T,ARG,FLAG)

        定宽数组的参数类别比基础类要少一些,但是传入的参数和基础类的一致,另外值得一说的是,enum类型的定宽数组也必须传入三个参数。在白皮书中写的是与其他定宽数组一样的两个参数,这是错误的。

注:白皮书上写错的原因是,源码中在写在前面的枚举数组宏确实只传入了两个参数,但是该部分的宏是不做使用的,用一个UVM_EMPTY_MACROS控制关闭了,若是不定义该宏,实际使用的是在后面的宏定义,该部分只是对所有注册宏做一个列举。具体可以看源码中的uvm_object_defines.svh文件。

        3. 动态数组

注册类别注册宏
int类型的动态数组`uvm_field_array_int(ARG,FLAG)
object类型的动态数组`uvm_field_array_object(ARG,FLAG)
string类型的动态数组`uvm_field_array_string(ARG,FLAG)
enum类型的动态数组`uvm_field_array_enum(T,ARG,FLAG)

        该部分与定宽数组一致,故不做说明,只做列举。

        4. 队列

注册类别注册宏
int类型的队列`uvm_field_queue_int(ARG,FLAG)
object类型的队列`uvm_field_queue_object(ARG,FLAG)
string类型的队列`uvm_field_queue_string(ARG,FLAG)
enum类型的队列`uvm_field_queue_enum(T,ARG,FLAG)

        该部分与定宽数组一致,故不做说明,只做列举。

        5. 关联数组

注册类别注册宏
int类型,key为string`uvm_field_aa_int_string(ARG,FLAG)
int类型,key为int(有符号或无符号)`uvm_field_aa_int_int(_unsigned)
int类型,key为integer(有符号或无符号)`uvm_field_aa_int_int_integer(_unsigned)
int类型,key为byte(有符号或无符号)`uvm_field_aa_int_byte(_unsigned)
int类型,key为shortint(有符号或无符号)`uvm_field_aa_int_shortint(_unsigned)
int类型,key为longint(有符号或无符号)`uvm_field_aa_int_longint(_unsigned)
字符串类型,key为int`uvm_field_aa_string_int
object类型,key为int`uvm_field_aa_object_int
int类型,key可选`uvm_field_aa_int_key(KEY,ARG,FLAG)

        由于关联数组由两个数据类型组成,一个数据类型是索引(key),另一个则是实际的变量类型。所以注册的宏相对较多,但是主要还是以int类型为索引的类型,以及int类型的变量。

        `uvm_field_aa_int_key(KEY,ARG,FLAG),传入三个参数,第一个参数是类型,也就是索引的类型,该宏可以注册所有int类型的关联数组。而其他列举出来的int类型的关联数组,实际上也是用这个宏注册的。

uvm-1.1/macro/uvm_object_defines.svh  

         后续章节会详细介绍,注册的实际行为,内置函数是如何实现的以及针对这些函数的高级修改方法。

  • 29
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值