动态数组的系统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()函数的主要内容,如果未能解决你的问题,请参考以下文章