我有一个带有动态数组的类包。我想知道类对象的new / randomize函数是否可以为动态数组分配内存。
class packet;
rand int data[];
constraint c_data_size { data.size == 2; };
endclass : packet
program test;
packet pk1;
pk1 = new();
$display(" data.size = %d", data.size);
if(pk1.randomize) begin
$display(" data.size = %d", data.size);
data[0] = 23;
data[1] = 23432;
end
endprogram
Output
data.size = 0
data.size = 2
从这个示例代码中,我理解new()函数不为动态数组数据[]分配内存,但可以随机分配数据[]的内存,因为我没有调用" data = new [2]; "在动态数组上。谢谢你的时间。
答案 0 :(得分:3)
就像你已经说过的那样,new()不会分配内存。调用randomize()会在动态数组上分配内存;多少取决于约束。
答案 1 :(得分:2)
它是LRM的一部分。请参阅IEEE Std 1800-2012§18.4随机变量
- ...
- 也可以约束声明为rand或randc的动态数组或队列的大小。在这种情况下,应根据大小约束调整数组大小,然后所有数组元素应随机化。使用size方法声明数组大小约束。例如:
变量rand bit [7:0] len; rand integer data[]; constraint db { data.size == len; }
len
被声明为8位宽。随机数发生器计算0到255的8位范围内len
变量的随机值,然后随机化数据数组的第一个len
元素。通过randomize调整动态数组的大小时,将使用原始数组初始化已调整大小的数组(请参阅7.5.1)。 ...
如果动态数组的大小不受约束,则不应调整数组的大小,并且所有数组元素都应随机化。- ...