1. 非组合型unpacked
- 对于Verilog,数组经常会被用来做数据存储,例如reg[15:0] RAM [0:4095]
- SV 将Verilog这种声明数组的方式称为非组合型声明,即数组中的成员之间存储数据都是互相独立的
- Verilog也不会指定软件去如何存储数组中的成员wire[7:0] table[3:0]
- SV保留了非组合型的数组声明方式,并且扩展了允许的类型,包括event,logic,bit,byte,int,longint,shortreal和real类型
- SV也保留了Verilog索引非组合型数组或者数组片段的能力
- 声明数组的方式,以下两种皆可
logic [31:0] data[1024];
logic[31:0] data[0:1023];
2.组合型packed
- SV将Verilog的向量作为组合型数组声明方式
wire[3:0] select;//4比特的组合型数组
reg[63:0] data;//64比特的组合型数组 - SV也可以声明多维数组
logic [3:0[7:0] data;//2维组合数组 - 组合型packed除了可以运用的数组声明,也可以用来定义结构体的存储方式
typedef struct packed {
logic [7:0] crc;
logic [63:0] data;
}data_word;
data_workd [7:0] darray;//1位组合型数组,元素也为组合型结构体
- 组合型数组和其数组片段也可以灵活选择,用来拷贝和赋值
3.初始化
- 组合型packed 数组初始化时,同向量初始化一致
logic [3:0[7:0] a = 32’h0;//向量赋值 - 非组合型unpacked数组初始化时,则需要通过’{} 来对数组的每一个维度进行赋值
int d [0:1][0:3] = ‘{’ {7,3,0,5}, '{2,0,1,6};
4. 赋值
- 非组合型数组在初始化时,也可以类似结构体初始化,通过’{}和default关键词可以完成
int a1 [0:7][0:1023] = ’ {default:8’ h55}; - 非组合型数组的数据成员或者数组本身均可以为其赋值
byte a[0:3][0:3];
a[1][0] = 8’ h5;//为单个元素赋值
5. 拷贝
- 对于组合型数组,由于数组会被视为向量,因此当赋值左右两侧操作数的大小和维度不相同时,也可以做赋值
- 如果当尺寸不相同时,则会通过截取或者扩展右侧操作数的方式来对左侧操作数赋值
- 对于非组合型数组,在发生数组间拷贝时,则要求左右两侧操作数的维度和大小必须严格一致
- 非组合型数组无法直接赋值给组合型数组,同样地,组合型数组也无法直接赋值给非组合型数组
6. foreach循环结构
- SV添加了foreach循环来对一维或者多维数组进行循环索引,而不需要指定该数组的维度大小
- foreach循环结构中的变量无需声明
- foreach循环结构中的变量是只读的,其作用域只在此循环结构中
7.系统函数
- $dimensions(array_name) 用来返回数组的维度
- $left(array_name,dimension)返回指定维度的最左索引值msb
- 与(right,low,high}(array_name,dimension)
- $size(array_name,dimension)可以返回指定维度的尺寸大小
- $increment(array_name,dimension),如果指定维度最左索引值大于或等于最右索引值,那么返回1,否则返回-1
- $bits(expression)可以用来返回数组存储的比特数目