本节书摘来自华章社区《uvm实战》一书中的第3章,第3.3节field automation机制,作者 张 强,更多章节内容可以访问云栖社区“华章社区”公众号查看
3.3 field automation机制
3.3.1 field automation机制相关的宏
在第2章介绍filed_automation机制时出现了uvm_field系列宏,这里系统地把它们介绍一下。最简单的uvm_field系列宏有如下几种:
代码清单 3-25
来源:uvm源代码
这里一共出现了15种。联合数组有两大识别标志,一是索引的类型,二是存储数据的类型。在这一系列uvm_field系列宏中,出现的第一个类型是存储数据类型,第二个类型是索引类型,如uvm_field_aa_int_string用于声明那些存储的数据是int,而其索引是string类型的联合数组。
3.3.2 field automation机制的常用函数
field automation功能非常强大,它主要提供了如下函数。
copy函数用于实例的复制,其原型为:
代码清单 3-31
它的使用方式可以参考3.1.6节。
除了上述函数之外,field automation机制还提供自动得到使用config_db::set设置的参数的功能,这点请参照3.5.3节。
3.3.3 field automation机制中标志位的使用
考虑实现这样一种功能:给dut施加一种crc错误的异常激励。实现这个功能的一种方法是在my_transaction中添加一个crc_err的标志位:
代码清单 3-40
在这个17bit的数字中,bit0表示copy,bit1表示no_copy,bit2表示compare,bit3表示no_compare,bit4表示print,bit5表示no_print,bit6表示record,bit7表示no_record,bit8表示pack,bit9表示no_pack。剩余的7bit则另有它用,这里不做讨论。uvm_all_on的值是'b000000101010101,表示打开copy、compare、print、record、pack功能。record功能是uvm提供的另外一个功能,但是其应用并不多,所以在上节中并没有介绍。uvm_all_on | uvm_nopack的结果就是'b000001101010101。这样uvm在执行pack操作时,首先检查bit9,发现其为1,直接忽略bit8所代表的uvm_pack。
除了uvm_nopack之后,还有uvm_nocompare、uvm_noprint、uvm_norecord、uvm_nocopy等选项,分别对应compare、print、record、copy等功能。
3.3.4 field automation中宏与if的结合
在以太网中,有一种帧是vlan帧,这种帧是在普通以太网帧基础上扩展而来的。而且并不是所有的以太网帧都是vlan帧,如果一个帧是vlan帧,那么其中就会有vlan_id等字段(具体可以详见以太网的相关协议),否则不会有这些字段。类似vlan_id等字段是属于帧结构的一部分,但是这个字段可能有,也可能没有。由于读者已经习惯了使用uvm_field系列宏来进行pack和unpack操作,那么很直观的想法是使用动态数组的形式来实现:
代码清单 3-44
使用这种方式的vlan帧,在执行print操作时,4个字段的信息将会非常明显;在调用compare函数时,如果两个transaction不同,将会更加明确地指明是哪个字段不一样。