• systemverilog学习 随机化数组


    随机化数组

    当数组的维度固定时,我们可以在声明数组时加上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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    其执行结果如下所示:
    在这里插入图片描述如果只是简单使用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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    其执行结果如下:
    在这里插入图片描述
    此外如果对数组元素有要求,只需要设置相应的约束就可以了。比如如下的例子中,调用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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    执行结果如下,可以看出数组元素的和是30.
    在这里插入图片描述
    如果对数据元素也有要求,可以使用foreach,如下例约束array_c_e,通过foreach访问所有数组元素,令其大于2.
    在这里插入图片描述
    对于二维数组,对每一个元素的约束也可以通过foreach,只不过要增加一个迭代变量。
    在这里插入图片描述
    更复杂些,还可以对动态数组做随机化。同样的,在声明动态数组时增加rand修饰,然后添加对数组大小的约束,否则编译器无法知道该分配多少内存给数组。下例通过size方法获取数组大小,通过inside给出数组大小范围。
    在这里插入图片描述
    当然,我们还可以通过蕴涵操作符,利用一个变量控制随机化数组的大小,下例中随机化枚举变量burst_type,根据约束的双向性,burst_type和data.size是绑定的关系
    在这里插入图片描述
    需要指出的是,动态数组和固定大小的数组一样,可以通过来控制数组元素的和以及每个数组元素的值,通俗的理解就是增加了size约束的数组。
    在这里插入图片描述
    下例将关联数组索引设为枚举变量,通过foreach约束每个元素值,通过num约束数组元素和
    在这里插入图片描述
    队列和数组一样,也需要添加额外的约束。
    在这里插入图片描述

  • 相关阅读:
    刷题记录:牛客NC25088Corn Fields
    Mysql的JDBC知识点
    ubuntu20.04安装webots仿真
    java并发编程之基础与原理1
    【SQL报错注入】简介、相关函数、利用方法
    JL100-P100防护型拉线式位移编码器
    第三十章 管理许可(三)
    开源分布式存储系统(HDFS、Ceph)架构分析
    docker下快速部署openldap与self-service-password
    1012 数字分类【PAT (Basic Level) Practice (中文)】
  • 原文地址:https://blog.csdn.net/weixin_45614076/article/details/126518096