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

其执行结果如下所示:
在这里插入图片描述如果只是简单使用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

其执行结果如下:
在这里插入图片描述
此外如果对数组元素有要求,只需要设置相应的约束就可以了。比如如下的例子中,调用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

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

猜你喜欢

转载自blog.csdn.net/weixin_45614076/article/details/126518096