factory机制有对域的自动化的声明,声明之后对于pkg中的一些函数无需定义即可直接使用,包括copy(),compare(),print(),增加代码的可重用性。
typedef enum {WRITE, READ, IDLE} op_t; //枚举类型声明
class trans extends uvm_object;
bit[31:0] addr;
bit[31:0] data;
op_t op;
string name;
`uvm_object_utils_begin(trans)
//域的自动化的声明
`uvm_field_int(addr, UVM_ALL_ON)//包含变量名称和对数据的操作
`uvm_field_int(data, UVM_DEFAULT)
`uvm_field_enum(op_t, op, UVM_ALL_ON)
`uvm_field_string(name, UVM_ALL_ON)
`uvm_object_utils_end
function new(string name = "trans");
super.new(name);
`uvm_info("CREATE", $sformatf("trans type [%s] created", name), UVM_LOW)
endfunction
function bit do_compare(uvm_object rhs, uvm_comparer comparer);//回调函数,自定义想要比较的类型
trans t;
do_compare = 1;
void'($cast(t, rhs));
if(addr != t.addr) begin
do_compare = 0;
`uvm_warning("CMPERR", $sformatf("addr %8x != %8x", addr, t.addr))
end
endfunction
endclass
下图为打印的信息,回调函数在compare进行之前调用打印。

t1.copy(t2);
t1.print();
t2.print();
`uvm_info("CMP", "Compare t1 and t2", UVM_LOW)
调用copy和print函数
打印信息示例
对域的自动化的声明可以定义多种操作 ,新手可默认UVM_DEFAULT或者UVM_ALL_ON,默认可进行全部操作,不过经常进行拷贝操作时,对某些变量声明为NO_COPY类型,防止数据被覆盖。
本文介绍了UVM中如何利用factory机制自动化声明域,以实现copy、compare和print函数的便捷使用,提升代码的可重用性。通过示例展示了这些函数在仿真过程中的应用,强调了在compare操作前的回调函数打印信息。同时,讨论了如何根据需求选择不同的操作级别,如UVM_DEFAULT和UVM_ALL_ON,并指出在频繁拷贝场景下,可以通过NO_COPY类型防止数据被覆盖。
1381

被折叠的 条评论
为什么被折叠?



