Memory management 系统verilog中动态数组的内存分配-new()/randomize()函数
我有一个带有动态数组的类包。我想知道class对象的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 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; }
被声明为8位宽。随机化器为len
变量计算0到255的8位范围内的随机值,然后随机化数据数组的第一个len
元素。当通过“随机化”调整动态数组的大小时,将使用原始数组初始化调整大小的数组(参见7.5.1)len
如果动态数组的大小不受约束,则不应调整数组的大小,且应随机化所有数组元素
- 还可以约束声明为rand或randc的动态数组或队列的大小。在这种情况下,应根据大小约束调整阵列大小,然后将所有阵列元素随机化。数组大小约束是使用size方法声明的。例如:
变量rand bit [7:0] len; rand integer data[]; constraint db { data.size == len; }
被声明为8位宽。随机化器为len
变量计算0到255的8位范围内的随机值,然后随机化数据数组的第一个len
元素。当通过“随机化”调整动态数组的大小时,将使用原始数组初始化调整大小的数组(参见7.5.1)len
如果动态数组的大小不受约束,则不应调整数组的大小,且应随机化所有数组元素
谢谢我很惊讶randomize()能够分配内存,但看起来SystemVerilog是这样工作的!!谢谢我很惊讶randomize()能够分配内存,但看起来SystemVerilog是这样工作的!!