field_automation机制1-field automation的功能及使用(该篇不涉及UVM源码)

资料来源

(1) UVM实战-张强;

1.field automation机制常见宏(与常见变量/动态数组/静态数组/队列/关联数组相关宏)

1.1与常见变量相关的uvm_field系列宏

注1:该处的FLAG为UVM_ALL_ON等FLAG;

注2:上述宏分别用于要注册的字段是整数,实数,枚举类型,直接或间接派生自uvm_object的类型,事件以及字符串;

注3:枚举类型需要三个参数,分别为枚举类型,变量,以及FLAG,如下图所示;

1.2与动态数组有关的uvm_field系列宏

 注1:与动态数组相关的uvm_field系列宏不包含event类型与real类型,并且枚举类型的数组里只有两个参数;

1.3与静态数组有关的uvm_field系列宏

1.4与队列有关的uvm_field系列宏

1.5与关联数组有关的uvm_field系列宏

 注1:宏中第一个类型是存储数据的类型,第二个类型是索引类型,如`uvm_filed_aa_int_string用于声明存储的数据是int类型,而其索引是string类型的关联数组;

2.该机制的功能?

2.1 提供copy,clone,compare,print,pack_bytes等函数,而不需user定义(详见《UVM实战》3.3.2)

(1) copy:用于实例的复制;

注1:如果要把某个A实例复制到B实例中,应该使用B.copy(A);在使用此函数前,B实例必须已经使用new函数分配好了内存空间;

(2) clone:用于分配一块内存空间,并把另一个实例复制到这块新的内存空间中;

注1:uvm_object中有clone和copy函数,二者的区别在于在使用copy前,目标实例必须已经使用new函数分配好了内存空间,而使用clone函数时,目标实例可以只是一个空指针. clone=new+copy(需要看源码);

注2: clone函数无法用于uvm_component中,因为一旦使用后,新clone出的类,其parent参数无法指定;虽然uvm_component无法使用clone函数,但是可以使用copy函数,因为在调用copy函数之前,目标实例已经完成了例化,其parent参数已经指定;

(3) compare:用于比较两个实例是否一样;

注1:可以使用A.compare(B),也可以使用B.compare(A);当两者一致时,返回1,否则为0;

(4) pack_bytes(打包):将所有字段打包成byte流;

注1:上图中调用pack_bytes将tr中所有字段变成byte流放入到动态数组data_q中;

注2:在把所有的字段变成byte流放入data_q中时,字段按照uvm_field系列宏书写的顺序排列;

(5) unpack_bytes(解包):将一个byte流逐一恢复到某个类的实例中;

注1:上图中使用unpack_bytes函数将data_q中的byte流转换成tr中的各个字段;

注2:unpack_bytes函数的输入参数必须是一个动态数组,所以需要先把收集到的、放在data_q中的数据复制到一个动态数组中;

注3:tr中的pload是一个动态数组,在使用前需要指定其大小;

(6) pack:将所有字段打包成bit流;

(7) unpack:将一个bit流逐一恢复到某个类的实例中;

(8) print:用于打印所有的字段;

2.2 提供自动得到使用config_db::set设置的参数的功能.

(1) uvm_config_db::set与uvm_config_db::get函数一般都是成对出现,但是在某些情况下,可以只有set而没有get语句,即省略get语句.

(2)所谓的特定情况指的是变量使用uvm_field_int注册,在build_phase中调用super.build_phase(),并且set函数的第三个参数必须要与get函数中变量的名字一致.这种情况下可以省略掉uvm_config_db::get;

2.2.1 uvm_component build_phase(与自动get config相关???需要加深理解)

3.该机制的使用?

3.1 field_automation机制能独立使用吗?

(1) field_automation机制的实现不能单独使用;

(2) `uvm_field_*宏,必须要依赖于factory机制的宏(比如uvm_object_utils_begin, uvm_object_utils_end).

3.2 field_automation中宏与if的结合

 

3.3 uvm_field_*的使用有顺序吗?

由于pack函数与unpack函数对于字段的位置比较敏感,所以在使用时需要注意顺序保持一致.

4.该机制中FLAG的灵活使用?

4.1 FLAG的种类

UVM_ALL_ON, UVM_COPY, UVM_NOCOPY...

4.2 什么情况下使用FLAG?

(1)比如transaction中的某些标志位不会被driver发送给DUT,但可以在验证平台之间流动,验证平台可以根据这些标志位做判断以节省时间.对于这些标志位,当然需要使用uvm_field_int进行注册,这样在print的时候,可以看到其值;但是由于不需要发送给driver, 可以通过使用FLAG, 不让其在调用pack与unpack函数时出现,如下所示.

 

(2)示例

注1:在sequence中可以使用`uvm_do_with(tr,{tr.crc_err==1;})产生CRC错误的激励; 

注2:crc_err不需要在pack和unpack操作中出现,但是需要在print操作中出现;

 

posted on 2021-11-16 10:16  知北游。。  阅读(1566)  评论(0编辑  收藏  举报

导航