《UVM白皮书》关于transaction的介绍
transaction是UVM中信息交互的基本单元。可以理解为信息包,信息帧。
举例:物理协议中的数据交换都是以帧或者数据包为单位的,在帧/数据包中定义好了各项信息参数。在UVM验证中transaction就是在模拟这个帧/数据包。
一、 transaction举例
class my_transaction extends uvm_sequence_item;
rand bit[47:0] dmac;
rand byte pload[];
rand bit[31:0] crc;
`uvm_object_utils(my_transaction)//factory机制,注意这里是object不是component
constraint pload_cons{
pload.size >= 46;
pload.size <= 1500;
} //约束pload的大小在46~1500byte pload_cons是约束的名字,自定义
function void post_randomize();
crc = 0;//随便写的,不必在意
endfunction
function new (string name = "my_transaction");
super.new(name); //写作super.new();也是可以的
endfunction
endclass
在上边的transaction举例中,
- UVM中所有的transaction都是派生自uvm_sequence_item,后续transaction才能使用UVMsequence机制。
- 根据UVM类的继承关系(可见UVM常用类及树形结构_uvm树-CSDN博客),uvm_transaction继承自uvm_object,对于继承自uvm_object的类,其factory机制都是使用`uvm_object_utils()注册。
- post_randomize()是Systemverilog中提供的一个函数,在class被实例化之后调用其randomize函数,post_randomize会紧随其后无条件地被调用。
二、传递transaction的driver举例
那么现在在my_driver里基于transaction实现驱动:
task my_driver::main_phase(uvm_phase phase);
my_transaction tr;
...
tr=new("tr");
...
endtask