【UVM 1.2】宏uvm_field_aa_object_int的UVM_COMPARE相关代码存在问题
在源码uvm-1.2\src\macros\uvm_object_defines.svh
中Line:2392调用`M_UVM_FIELD_DATA_AA_object_int宏。如下图所示:
`M_UVM_FIELD_DATA_AA_object_int用于根据FLAG设置aa_object_int类型的field与compare,copy,print相关的操作。其中在UVM_COMPARE case部分,第3066行存在问题,如下图所示:
foreach语句遍历以int类型为key的object类型关联数组,索引_key__
从第一个存在key-value pair的索引开始,但是lhs却是lhs=ARG[key__];
该索引是key__
在3047行定义并一直保持默认初始值0
,并不是foreach语句使用的索引_key__
!!!这将导致UVM_COMPARE部分的逻辑为:被比较的关联数组的所有元素均与调用比较的关联数组的0索引位置上的值比较。下面的例子将说明上述问题:
module top;
import uvm_pkg::*;
class my_object extends uvm_object;
function new(string name = "my_object");
super.new(name);
endfunction
endclass
class my_transaction extends uvm_sequence_item;
my_object asc_array_comp [int];
`uvm_object_utils_begin(my_transaction)
`uvm_field_aa_object_int(asc_array_comp, UVM_DEFAULT)
`uvm_object_utils_end
function new(string name = "my_transaction");
super.new(name);
endfunction
endclass
class my_agent extends uvm_agent;
`uvm_component_utils(my_agent)
my_transaction tr, new_tr_1;
my_object my_obj_inst, my_obj_inst_1;
bit compare_ret;
function new(string name = "my_component", uvm_component parent = null);
super.new(name, parent);
endfunction
task main_phase(uvm_phase phase);
tr = new("tr");
new_tr_1 = new("new_tr_1");
my_obj_inst = new("my_obj_inst");
my_obj_inst_1 = new("my_obj_inst_1");
tr.asc_array_comp[0] = my_obj_inst;
tr.asc_array_comp[1] = my_obj_inst_1;
new_tr_1.asc_array_comp[0] = my_obj_inst;
new_tr_1.asc_array_comp[1] = my_obj_inst;
compare_ret = tr.compare(new_tr_1);
$display("compare return is %0b", compare_ret);
endtask
endclass
// UVM test
class test extends uvm_test;
`uvm_component_utils(test)
my_agent agent;
function new(string name = "test", uvm_component parent = null);
super.new(name, parent);
endfunction
function void build_phase(uvm_phase phase);
agent = my_agent::type_id::create("my_agent", this);
endfunction
endclass
//watchdog
initial begin
#10000;
$display("%0t: %0s", $time,"TIMEOUT, Terminate simulation!");
$display("TEST FAILED");
$finish;
end
initial begin
//run throughout test
run_test("test");
$display("test finish.");
end
endmodule
该程序的该代码段可以明显看出tr
和new_tr_1
不相同:
tr.asc_array_comp[0] = my_obj_inst;
tr.asc_array_comp[1] = my_obj_inst_1;
new_tr_1.asc_array_comp[0] = my_obj_inst;
new_tr_1.asc_array_comp[1] = my_obj_inst;
但是该程序输出的比较结果为仍为1:
compare return is 1
说明被比较的new_tr_1.asc_array_comp
的所有元素均是和调用比较的tr
的关联数组索引0位置的tr.asc_array_comp[0]
值比较。