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 代替单调乏味的宏。