我有一个关联数组:
rand uvm_reg_field array_assoc[string];
该数组包含DUT中寄存器的UVM寄存器字段的句柄,并由字符串索引(字符串是字段的名称)。 假设我有2个注册字段,其名称为" reg_field_1"和" reg_field_2"。
如上所述,
array_assoc["reg_field_1"]= handle of field 1;
array_assoc["reg_field_2"]= handle of field 2;
我只需要随机化其中一个字段,因此,我有选择地关闭其中一个字段的rand_mode,比如" reg_field_1":
array_assoc["reg_field_1"].rand_mode(0);
现在,如果我随机化关联数组,则两个寄存器字段都会随机化。
更令人惊讶的是,如果我用整数索引声明普通数组,那么:
rand uvm_reg_field array_normal[2];
array_normal[0]= handle of field 1;
array_normal[1]= handle of field 2;
然后关闭字段1的rand_mode:
array_normal[0].rand_mode(0);
它工作正常,字段1不是随机的。
问题是:为什么注册字段" reg_field_1"即使在关联数组的情况下将rand_mode设置为0,也会随机化?
答案 0 :(得分:3)
在关联数组的各个元素上设置rand_mode()的能力似乎有零星的支持。以下在Questa和另一个模拟器中为我工作;给了我一个"还不支持"在另一个,你在另一个看到的结果。所以我会联系你的工具供应商。
module top;
class B;
rand byte m;
endclass
class A;
rand B a1[2];
rand B a2[string];
function void run;
a2["0"] = new;
a2["1"] = new;
a1[0] = new;
a1[1] = new;
a1[0].rand_mode(0);
a2["0"].rand_mode(0);
void'(randomize());
$display(a1[0].m, a1[1].m,,a2["0"].m,a2["1"].m);
endfunction
endclass
A a = new();
initial repeat(3) a.run();
endmodule