动态数组的系统verilog中的内存分配 - new()/ randomize()函数

时间:2014-03-16 17:50:26

标签: memory-management verilog system-verilog

我有一个带有动态数组的类包。我想知道类对象的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]; "在动态数组上。谢谢你的时间。

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)。 ...
      如果动态数组的大小不受约束,则不应调整数组的大小,并且所有数组元素都应随机化。
  •   
  • ...
  •