我已经看过用于随机化整数值队列的技术,但是我遇到了对象队列的困难。示例代码:
class int_queue_class;
rand int x[$];
function void print;
$display($sformatf("Size: %0d", x.size()));
foreach(x[i])
$display($sformatf("x[%0d] = %0d", i, x[i]));
endfunction : print
endclass : int_queue_class
class obj;
rand int value;
endclass : obj
class obj_queue_class;
rand obj x[$];
function void print;
$display($sformatf("Size: %0d", x.size()));
foreach(x[i])
$display($sformatf("x[%0d] = %0d", i, x[i].value));
endfunction : print
endclass : obj_queue_class
program top();
initial
begin
int_queue_class iqc;
obj_queue_class oqc;
iqc = new();
iqc.randomize() with {x.size() == 5; x[2] == 5;};
iqc.print();
oqc = new();
oqc.randomize() with {x.size() == 5; x[2].value == 5;};
oqc.print();
end
endprogram : top
对于对象,似乎不能使用相同的方法。有没有办法随机化这样的队列,同时保持同时约束队列大小和单个元素字段的能力?我提出的使用前/后随机化方法的想法都至少松开了这两个选项中的一个。
答案 0 :(得分:1)
随机化不会创建新对象。随机化队列大小时,它将创建包含默认值的新条目,类类型为null
。
您唯一能做的就是在队列中预先分配对象,以备不时之需。您无法随机化更多的对象而不是最初创建的对象,因此这限制了队列大小的值:
class obj_queue_class;
rand obj x[$];
local const max_size;
constraint legal_size {
x.size() <= max_size;
}
function void pre_randomize();
x = new[max_size];
foreach (x[i])
x[i] = new();
endfunction
function void print();
$display($sformatf("Size: %0d", x.size()));
foreach(x[i])
$display($sformatf("x[%0d] = %0d", i, x[i].value));
endfunction
endclass
我已将max_size
设为局部常量值,但它可以是您可以从外部设置的内容,包参数等。
在pre_randomize()
中,您实例化max_size
个对象。由于x.size()
始终小于或等于max_size
,因此随机化的任何值都将导致包含对象实例且不为null的队列。当队列缩小时,其余的对象将被抛弃。