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
  • system verilog数组赋值_数字验证(right,low,high}(array_name,dimension)
  • $size(array_name,dimension)可以返回指定维度的尺寸大小
  • $increment(array_name,dimension),如果指定维度最左索引值大于或等于最右索引值,那么返回1,否则返回-1
  • $bits(expression)可以用来返回数组存储的比特数目