随机句柄数组的功能是在调用其所在的随机函数时,随机函数会随机化数组中的每一个句柄所指向的对象。因此随机句柄数组的声明一定要添加rand来表明其随机化的属性,同时在调用随机函数之前要保证句柄数组的每一个句柄元素都非悬空,这要保证在随机化之前为每一个句柄元素构建对象。
如果要产生多个随即对象,则需要建立随机句柄数组。和整数数组不同,随机句柄数组需要在随机化之前分配所有的句柄元素,因为求解器是不会创建对象的。使用动态数组可以按照需要分配最大数量的元素,再使用约束减小数组的大小。在随机化时,动态句柄数组的大小可以保持不变和减小,但不能增加。
出自绿皮书
parameter max_size=10;//数组元素最大数目
class randstuff;//声明一个类,里面的元素都是随机数类型
rand int value;
endclass
class randarray;//声明一个随机化的动态句柄数组
rand randstuff array[];//声明一个随机化的存放随机数类的元素的句柄数组
constraint c {array.size() inside{[1:max_size]};}//对数组的大小做约束,不大于最大参数值
function new();//对动态数组做例化,并保证产生10个句柄,每个句柄指向一个对象,确保句柄非悬空。
array=new(max_size);//分配最大的空间
foreach(array[i]) array[i]=new();//分别指向十个对象
endfunction
endclass
randarray ra;//例化动态数组
initial begin
ra=new();//ra例化有10个句柄,所以例化出10个句柄,分别指向十个对象
assert (ra.randomize());//对数组做随机化,随机的对象是ra数组,随机产生几个句柄
//并随机化指向的对象,前提是对象也必须为rand类型
foreach(ra.array[i]) $display(ra.array[i].value);
end
上例的含义主要是讲述随机化句柄数组应该注意的几个过程:
-
随机化的句柄数组指向的对象必须是rand型的,否则即使随机化句柄数组成功,指向的对象也只是初始化的value
-
动态句柄数组要在随机化之前对数组数目做约束,有一个最大值。但是在例化数组时,需要分配最大容量,例化最大数目的句柄数目,保证分配10个空间,存放10个句柄,随后做例化指向不同的对象,这样可以保证句柄非空,均指向相应的对象。
-
ra在做randomize时,随机化的是句柄的数量和对指向的对象进行随机