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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态数组的系统verilog中的内存分配 - new()/ randomize()函数相关的知识,希望对你有一定的参考价值。

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

答案

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

另一答案

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

以上是关于动态数组的系统verilog中的内存分配 - new()/ randomize()函数的主要内容,如果未能解决你的问题,请参考以下文章

动态内存分配

数组及其在内存中的分配

58 动态内存分配

编译动态内存模块时 Icarus Verilog 崩溃

在 C++ 中的 2D 动态内存分配数组中释放分配的内存

C++ 动态内存分配与结构中的数组