System Verilog (4) 数组 Arrays


(3)Arrays

SV的数组类型: 合并数组,非合并数组,动态数组,联合数组,队列

根据数组大小是否固定,可分为固定数组(静态数组)和动态数组

1. 合并数组 packed arrays

存储方式是连续的,中间没有闲置空间

例如,32bit的寄存器,可以看成是4个8bit的数据,或者也可以看成是1个32bit的数据。

表示方法: 数组大小和位,必须在变量名前指定,数组大小必须是【msb:lsb】(从大到小)

  • bit [7:0] array1;
  • bit [3:0] [7:0] array2;

查看代码

module array_declaration;
bit [7:0] array1;
bit [3:0][7:0] array2;	
initial begin
$display("default size array1=%0d array2=%0d", $size(array1),$size(array2));
array1=8'ha2;

for(int i=0; i<$size(array1); i++) begin
$display("array1[%0d]=%b", i , array1[i]);
end
end
initial begin
for(int j=0; j<$size(array2); j++) begin
$display("array2[%0d]=%b", j , array2[j]);
end
end
endmodule

编译结果

# Loading sv_std.std
# Loading work.array(fast)
# 
# vsim -voptargs=+acc=npr
# run -all
# array1 size is 8 array2 size is 4
# array1[7]=0
# array1[6]=1
# array1[5]=0
# array1[4]=0
# array1[3]=1
# array1[2]=0
# array1[1]=1
# array1[0]=0
# array2[3]=11111010
# array2[2]=11001110
# array2[1]=10111100
# array2[0]=11011010
# exit
# End time: 04:03:49 on Mar 30,2022, Elapsed time: 0:00:00
# Errors: 0, Warnings: 0
Done

2. 非合并数组 unpacked arrays

一般仿真器存放数组元素时使用32bit的字边界,byte、shortint、int都放在一个字中。

非合并数组:字的低位存放变量,高位不用。

表示方法:数组大小和位,必须在变量名后指定,数组大小【msb:lsb】【lsb: msb】都可以

  • bit  unpacked_array [7:0] ; 
  • bit unpacked [0:7] [0:3] ;

二维数组和合并数组识别:

合并数组:  bit [3:0] [7:0] arrys;   大小在变量名前面放得,且降序

二维数组:  int arrays[0:7] [0:3] ;  大小在变量名后面放得,可降序可升序

位宽在变量名前面,用于识别合并和非合并数组,位宽在后面,用于识别数组中元素个数。

3)非合并数组

      4)合并数组和非合并数组的选择

       (1)当需要以字节或字为单位对存储单元操作。

       (2)当需要等待数组中变化的,则必须使用合并数组。例如测试平台需要通过存储器数据的变化来唤醒,需要用到@,@只能用于标量或者合并数组。

     Bit[3:0] [7:0] barray[3]  ; 表示合并数组,合并数组中有3个元素,每个元素时8bit,4个元素可以组成合并数组

    可以使用barry[0]作敏感信号。

l      动态数组

随机事物不确定大小。

使用方法:数组在开始是空的,同时使用new[]来分配空间,在new[n]指定元素的个数。

Int dyn[];

  Dyn = new[5];    //分配5个元素空间

         Dyn.delete() ;    //释放空间

l      队列

在队列中增加或删除元素比较方便。

l      关联数组

当你需要建立一个超大容量的数组。关联数组,存放稀疏矩阵中的值。

表示方法:

采用在方括号中放置数据类型的形式声明:

Bit[63:0] assoc[bit[63:0]];

l      常量:

1)Verilog 推荐使用文本宏。

好处:全局作用范围,且可以用于位段或类型定义

缺点:当需要局部常量时,可能引起冲突。

2)Parameter

  作用范围仅限于单个module

3)Systemverilog:

  参数可以在多个模块里共同使用,可以用typedef 代替单调乏味的宏。

相关