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

Memory management 系统verilog中动态数组的内存分配-new()/randomize()函数,memory-management,verilog,system-verilog,Memory Management,Verilog,System Verilog,我有一个带有动态数组的类包。我想知道class对象的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) begi

我有一个带有动态数组的类包。我想知道class对象的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()会在动态数组上分配内存;多少取决于约束。

正如您所说,new()不分配内存。调用randomize()会在动态数组上分配内存;多少取决于约束条件。

它是约束条件的一部分。见§18.4随机变量

  • 还可以约束声明为rand或randc的动态数组或队列的大小。在这种情况下,应根据大小约束调整阵列大小,然后将所有阵列元素随机化。数组大小约束是使用size方法声明的。例如:
    
    rand bit [7:0] len;
    rand integer data[];
    constraint db { data.size == len; }
    变量
    len
    被声明为8位宽。随机化器为
    len
    变量计算0到255的8位范围内的随机值,然后随机化数据数组的第一个
    len
    元素。当通过“随机化”调整动态数组的大小时,将使用原始数组初始化调整大小的数组(参见7.5.1)
    如果动态数组的大小不受约束,则不应调整数组的大小,且应随机化所有数组元素
这是我们的一部分。见§18.4随机变量

  • 还可以约束声明为rand或randc的动态数组或队列的大小。在这种情况下,应根据大小约束调整阵列大小,然后将所有阵列元素随机化。数组大小约束是使用size方法声明的。例如:
    
    rand bit [7:0] len;
    rand integer data[];
    constraint db { data.size == len; }
    变量
    len
    被声明为8位宽。随机化器为
    len
    变量计算0到255的8位范围内的随机值,然后随机化数据数组的第一个
    len
    元素。当通过“随机化”调整动态数组的大小时,将使用原始数组初始化调整大小的数组(参见7.5.1)
    如果动态数组的大小不受约束,则不应调整数组的大小,且应随机化所有数组元素

谢谢我很惊讶randomize()能够分配内存,但看起来SystemVerilog是这样工作的!!谢谢我很惊讶randomize()能够分配内存,但看起来SystemVerilog是这样工作的!!