2.6 链表
SystemVerilog提供了链表数据结构,但是应该避免使用它,因为SystemVerilog提供的队列更加高效易用。
2.7 数组的方法
2.7.1 数组的缩减方法
基本的数组缩减方法就是把一个数组缩减成一个值。最常用的方法就是求和sum,除此之外还有product(乘)and(与)or(或)xor(异或)等。
在进行数组压缩的时候,应该特别重要的一点需要注意,那就是位宽的问题。
例2.23 数组求和
module test_enum();
bit on[10]; //单比特数组
int total;
initial begin
foreach(on[i])
on[i]=i; //on[i]的值为0或1
$display("on.sum=%0d",on.sum); //on.sum是单比特无符号的数 打印出单比特和 on.sum=1
$display("on.sum=%0d",on.sum+32'd0); //on.sum是32比特数 打印出32比特和 on.sum=5
//由于total是32比特变量,所以数组的和也是32比特变量
total=on.sum;
$display ("total=%0d",total); //total=5
//将数组和一个32比特数进行比较
if (on.sum>=32'd5) //条件成立
$display ("sum has 5 or more 1's'');
//使用带32比特有符号运算的with表达式
$display("int sum=%0d",on.sum with (int'(item))); //利用with来限定on.sum的数据类型,这是一种比较好用的方式
end
endmodule
SystemVerilog中,对定宽数组、队列、动态数组和关联数组可以使用 $urandom_range( $size(array)-1)来选取随机一个元素,而对于队列和动态数组还可以使用 $urandom_range(array.size()-1)。
2.7.2 数组定位方法
例2.25 数组定位方法min、max、unique、find
module test_enum();
int f[6]={1,6,2,6,8,6},
d[]='{2,4,6,8,10},
q[$ ]={1,3,5,7},
tq[$];
initial
begin
tq=q.min(); //求最小值{1}
foreach(tq[i])
$display("min:tq[%0d]=%0d",i,tq[i]);
tq=q.max(); //求最大值{7}
foreach(tq[i])
$display("max:tq[%0d]=%0d",i,tq[i]);
tq=f.unique();