SV学习笔记—数组的方法

目录

1.遍历

1.1for和foreach循环

2.复制

3.比较

4.运算

4.1 sum

4.2 product

4.3 and,or,xor

4.4 max,min,unique

5.排序

5.1 reverse翻转

5.2 shuffle乱序

5.3 sort升序

5.4 rsort降序

6.定位

6.1 find

6.2 find_index

6.3 find_first/last_index

6.4 find_last/first


1.遍历

1.1for和foreach循环

一维数组:

program example1;
    initial begin
        bit [31:0] src[5], dst[5];//声明2个数组各自有5个32bits的元素

        for (int i=0; i<$size(src); i++)//通过for循环遍历数组,$size是系统函数,会返回数组的个数
            src[i] = i;//结果:0,1,2,3,4

        foreach (dst[j]) dst[j] = src[j] * 2;//通过foreach循环遍历数组,结果:0,2,4,6,8
    end
endprogram

多维数组:

//对于多维数组:
program example2;
    int md[2][3]=' {'{0,1,2},'{3,4,5}};

    initial begin
        $display("initial value:");
        foreach(md[i,j])    $display("md[%0d][%0d]=%0d",i,j,md[i][j]);//先遍历第0行所有列,再遍历第1行所有列
    end
endprogram
/*结果:
initial value:
0,1,2,3,4,5 */

2.复制

对于复制,可以利用赋值符号“=”直接进行数组的复制

program example3;
    bit [31:0] src[5] = '{0,1,2,3,4},dst[5];

    initial begin
        dst = src; // 数组复制,将src数组复制给dst数组
        src[0] = 5; // 只改变一个元素的值,将第0号元素改变成5
        $display(dst);//打印dst,看其是否得到了src的值,元素[0]是旧的值还是新值;
        $display(src);//打印src,看是否改变了src[0]的值
    end
endprogram

3.比较

在不使用循环的情况下,可以利用“==”或者“!=”来比较数组的内容,不过结果仅限于内容相同或者不相同

program example4;
    bit [31:0] src[5] = '{0,1,2,3,4},dst[5] = '{5,4,3,2,1};

    initial begin
        if (src==dst) $display("src == dst");//比较数组,数量和各个位置的内容都相等才行
        else $display("src != dst");

        dst = src;//数组复制
        src[0] = 5;//只改变一个元素的值

        //所有元素是否相等
        $display("src %s dst",(src==dst)?"==":"!=");//使用数组片段对第1-4个元素进行比较
        $display("src[1:4] %s dst[1:4] ",(src[1:4]==dst[1:4])?"==":"!=");
    end
endprogram

若要得到数组中的每个元素是否相等,可以用for循环遍历数组的每一个元素,并进行比较:

program example5;
    bit [31:0] src[5] = '{0,1,2,3,4},dst[5] = '{5,4,3,2,1};

    initial begin
        dst = src;//数组复制
        src[0] = 5;//只改变一个元素的值
    
        for(int i=0; i<$size(src); i++) begin
            if (dst[i]==src[i])
            $display("src[%d] == dst[%d]",i,i);
            else
            $display("src[%d] != dst[%d] ",i,i);
        end

/*也可用foreach循环来遍历
        foreach(dst[i]) begin
            if (dst[i]==src[i])
                $display("src[%d] == dst[%d]",i,i);
            else
                $display("src[%d] != dst[%d] ",i,i);
        end
*/
    end
endprogram

4.运算

4.1 sum

4.2 product

4.3 and,or,xor

4.4 max,min,unique

program example;
    int array[7]='{5,98,98,3,6,6,0};
    int summ,j,a,o,x;

    initial begin
        $write("initial array:");
        $display(array);

        summ=array.sum;//求和
        $write("sum array:");
        $display(summ);

        j=array.product;//求积
        $write("product array:");
        $display(j);

        a=array.and;//and缩减数组,以二进制按位与
        $write("and array:");
        $display(a);

        o=array.or;//or缩减数组,以二进制按位或
        $write("or array:");
        $display(o);

        x=array.xor;//xor缩减数组,以二进制按位异或
        $write("xor array:");
        $display(x);

        array.max;//数组中的最大值
        $write("max array:");
        $display(array.max);

        array.min;//数组中的最小值
        $write("min array:");
        $display(array.min);

        array.unique;//提取出数组中不重复的元素
        $write("unique array:");
        $display(array.unique);
    end
endprogram

仿真结果如下: 

这里需要重点注意的是:进行求和时,求和结果的位宽如果没有定义,则默认是加数中的最大位宽,如1'b1+1'b1+1'b1+1'b1=1'b0,若1'b1+1'b1+1'b1+1'b1+3'b0=3'b100=4。

5.排序

5.1 reverse翻转

5.2 shuffle乱序

5.3 sort升序

5.4 rsort降序

以上几种排序方法,通过以下代码示例:

program example;
    int array[5]='{5,98,3,6,1};

    initial begin
        $write("initial array:");
        $display(array);

        array.reverse;//使整个数组调个个儿
        $write("reverse array:");
        $display(array);

        array.shuffle;//乱序
        $write("shuffle array:");
        $display(array);

        array.sort;//升序
        $write("sort array:");
        $display(array);

        array.rsort;//降序
        $write("rsort array:");
        $display(array);
    end
endprogram

 运行结果:

6.定位

6.1 find

6.2 find_index

6.3 find_first/last_index

6.4 find_last/first

program example;
    int array[6]='{9,1,8,3,4,4};

    initial begin
        $display(array.find with(item>3));//找到并列出大于3的元素
        $display(array.find_index with(item>3));//找到并列出大于3的元素的位置
        $display(array.find_first_index with(item>3));//找到并列出大于3的第一个元素的位置
        $display(array.find_last_index with(item>3));//找到并列出大于3的最后一个元素的位置
        $display(array.find_first with(item>3));找到并列出大于3的第一个元素
        $display(array.find_last with(item>3));找到并列出大于3的最后一个元素
    end
endprogram

  • 5
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值