目录
SV提供了很多数组的方法,可用于任何一种非合并的数组类型,包括定宽数组、动态数组、队列和关联数组。这些方法有繁有简,简单的如求当前数组的大小,复杂的如对数组排序。如果不带参数,则方法中的圆括号可以省略。
一、数组缩减方法
数组的缩减方法是将一个数组缩减为一个值。
方法名 | 描述 |
sum | 数组求和 |
product | 积 |
and | 与 |
or | 或 |
xor | 异或 |
最常用的是sum,对数组所有元素求和,但是必须注意的是SV对位宽的处理。如果是单比特数组求和,那么其和也是单比特的,但是如果使用该“求和”参与32bit的表达式运算,那么SV在数组求和的过程中使用32bit位宽。(此处为绿皮书的描述,经博主仿真验证,此处有误,运行结果仍为单比特数据。)
举个栗子:
bit aa[10];
int total;
initial begin
foreach(aa[j])
aa[j] = j;
foreach(bb[j])
bb[j] = j;
$display("1:aa.sum=%0d",aa.sum);
$display("2:aa.sum=%0d",aa.sum+32'd0);
total = aa.sum;
$display("3:total=%0d",total);
$display("4:bb.sum=%0d",bb.sum);
total = bb.sum;
$display("5:total=%0d",total);
运行结果如下:
可知,数组缩减方法的结果与数组具有相同的位宽。所以在使用缩减方法的时候要注意这一点。
二、数组定位方法
使用数组定位方法可以快速找到数组中的某个元素,但是需要注意的是:数组定位方法返回的是一个队列,而不是标量。
方法名 | 描述 |
max | 找出最大值 |
min | 找出最小值 |
unique | 找出唯一值的元素 |
find find有多种使用方式 如:find (x) with ( x == 4) | find_index with(item > 4) 找出数组元素大于4的索引号 |
find_first_index with(item == 4) 找出第一个数组元素等于4的索引号 | |
find_last with | |
find_last_index with | |
... |
举个栗子:
int f[6] = '{1,3,4,6,7,9};
int d[] = '{2,3,5,8,12};
int q[$] = {1,3,5,7};
int tq[$];
tq = q.min();
$display("1:tq=%0p",tq); //{1}
tq = d.max();
$display("2:tq=%0p",tq); //{12}
tq = f.unique();
$display("3:tq=%0p",tq); //{1,3,4,6,7,9}
tq = d.find_index with(item == 8);
$display("4:tq=%0p",tq); //{3}
tq = d.find with(item > 2);
$display("5:tq=%0p",tq); //{3,5,8,12}
运行结果如下:
在with语句中,item被称为重复参数,它代表了数组中的一个单独元素。item是缺省的名字,也可以使用其他的名字,只要在数组的参数列表中列出来即可,如下所示,几条语句是等效的:
右侧4个条件语句是等同的 | tq = d.find_first with(item == 4); |
tq = d.find_first() with(item == 4); | |
tq = d.find_first(item) with(item == 4); | |
tq = d.find_first(x) with(x == 4); |
数组定位方法与条件语句with结合使用又是怎样的呢?
如:
total = d.sum with (item >7);
绿皮书说的是返回条件表达式为真的次数,即元素大于7的个数,为什么运行结果跟其描述又不一致,醉了醉了。先挖个坑。
三、数组排序方法
SV有几个可以改变数组中元素顺序的方法,如下所示:
方法名 | 描述 |
reverse | 倒序 |
sort | 从小到大排序 |
rsort | 从大到小排序 |
shuffle | 随机排序 |
注:
- 数组定位方法是新建了一个队列来保存结果,而排序方法则是改变了原数组。
- shuffle、reverse方法不能带with条件语句,作用范围是整个数组。
- sort、rsort方法可以带with条件语句,进行范围内排序。
举个栗子:
int d[] = '{2,3,5,8,7,7,12};
d.reverse();
$display("1:d[]=%0p",d);
d.sort();
$display("2:d[]=%0p",d);
d.rsort();
$display("3:d[]=%0p",d);
d.shuffle();
$display("4:d[]=%0p",d);
运行结果如下:
PS :书上内容也不能尽信啊!实践出真理!