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

问题描述 投票:1回答:2

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

memory-management verilog system-verilog
2个回答
3
投票

就像你已经说过的那样,new()不会分配内存。调用randomize()会在动态数组上分配内存;多少取决于约束。


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