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操作中出现;