随机化数组
当数组的维度固定时,我们可以在声明数组时加上random修饰,就能和普通变量一样随机化元素。其实数组实质上是多个变量的集合,对数据随机化,就是多随机化。
class fs_array;
rand bit [3:0] array1[4];
rand bit [7:0] array2[6];
function void display();
$display("array1 = %p", array1);
$display("array2 = %p", array2);
endfunction
endclass
program fixedsize_array_randomization;
fs_array pkt;
initial begin
pkt = new();
pkt.randomize();
pkt.display();
end
endprogram
其执行结果如下所示:
如果只是简单使用rand可能会出现重复元素,如果要让数组元素不同,可以增加约束,让数组的值等于索引,然后通过shuffle的方法让数据元素值乱序。
class fs_array;
rand bit [7:0] array1[6];
constraint array_c {
foreach(array1[i])
array1[i] == i;
}
function void post_randomize();
array1.shuffle();
endfunction
function void display();
$display("array1 = %p", array1);
endfunction
endclass
module fixedsize_array_randomization;
fs_array pkt;
initial begin
pkt = new();
pkt.randomize();
pkt.display();
end
endmodule
其执行结果如下:
此外如果对数组元素有要求,只需要设置相应的约束就可以了。比如如下的例子中,调用sum的方法,使数组里面的所有的元素和是30.
class fs_array;
rand bit [7:0] array1[6];
constraint array_c {
array1.sum() == 30;}
function void display();
$display("array1 = %p", array1);
endfunction
endclass
module fixedsize_array_randomization;
fs_array pkt;
initial begin
pkt = new();
pkt.randomize();
pkt.display();
end
endmodule
执行结果如下,可以看出数组元素的和是30.
如果对数据元素也有要求,可以使用foreach,如下例约束array_c_e,通过foreach访问所有数组元素,令其大于2.
对于二维数组,对每一个元素的约束也可以通过foreach,只不过要增加一个迭代变量。
更复杂些,还可以对动态数组做随机化。同样的,在声明动态数组时增加rand修饰,然后添加对数组大小的约束,否则编译器无法知道该分配多少内存给数组。下例通过size方法获取数组大小,通过inside给出数组大小范围。
当然,我们还可以通过蕴涵操作符,利用一个变量控制随机化数组的大小,下例中随机化枚举变量burst_type,根据约束的双向性,burst_type和data.size是绑定的关系
需要指出的是,动态数组和固定大小的数组一样,可以通过来控制数组元素的和以及每个数组元素的值,通俗的理解就是增加了size约束的数组。
下例将关联数组索引设为枚举变量,通过foreach约束每个元素值,通过num约束数组元素和
队列和数组一样,也需要添加额外的约束。