【SystemVerilog】数据类型(3)数组的方法

   

目录

一、数组缩减方法

二、数组定位方法

三、数组排序方法


             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

随机排序

注:

  1. 数组定位方法是新建了一个队列来保存结果,而排序方法则是改变了原数组。
  2. shuffle、reverse方法不能带with条件语句,作用范围是整个数组。
  3. 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 :书上内容也不能尽信啊!实践出真理!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子墨祭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值