SystemVerilog数组操作

时间:2022-07-22
本文章向大家介绍SystemVerilog数组操作,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1.非组合型数组

2.组合型数组

3.初始化

4.赋值

5.拷贝

6.foreach循环结构

7.系统函数

1.非组合型数组

reg [15:0] RAM [0:4095]  //存储数组
  • SV将verilog这种声明数组的方式称为非组合型声明,即数组中的成员之间存储数据都是相互独立的;

(优点:易于查找元素; 缺点:消耗更多存储空间)

  • SV保留了非组合型的数组声明方式,并扩展了允许的类型:event、logic、bit、byte、int、longint、shortint和real;
  • SV保留了verilog索引非组合型数组或者数组片段的能力,这种方式为数组以及数组片段的拷贝带来了方便;
int a1[7:0] [1023:0] //非组合型数组
int a2[1:8] [1:1024] //非组合型数组
a2=a1; //拷贝整个数组;
a2[3]=a1[0];  //拷贝某个元素或者一个数组片段
  • 声明数组的方式,以下两种都可:
logic [31:0]  data [1024];
logic [31:0]  data [0:1024];

可以指定其内部元素个数或者元素索引值的范围;

2.组合型数组

  • SV将Verilog的向量作为组合型数组声明方式;
reg [63:0] data;// 64bit组合型数组
  • SV允许多维组合型数组的声明;
logic [3:0] [7:0] data;//2维组合数组  32bit字

组合型数组更节省空间

  • 组合型还可以用来定义结构体的存储方式:
typedef struct packWire [3:0] select;//4bit组合型数组
ed  {
  logic [7:0] crc;
  logic [63:0] data;
}data_word;
data_word [7:0] darray;//1位组合型数组,元素也为组合型结构体
  • 组合型数组中的元素和片段也可以单独拷贝和赋值;
logic [3:0] [7:0] data;//2维组合型数组
wire [31:0] out=data;  //整个数组赋值
wire sign=data[3] [7]; //单个bit
wire [3:0] nib=data[0] [3:0]; //数组片段
byte high_byte;
assign high_byte=data[3] ;//8bit数组片段
logic [15:0] word;
assign word=data[1:0]; //2个数组片段、

3.初始化

  • 组合型数组初始化,可以对其所有元素统一赋值;
logic [3:0] [7:0] a=32’h0; //向量赋值
logic [3:0] [7:0] b={16’hz,16’h0};  //连接运算符
logic [3:0] [7:0] c={16{2’b01}}; //复制运算符
  • 非组合型数组初始化,需要通过‘{}来对每一个维度的元素分别赋值;
Int d [0:1] [0:3] =’{‘{7,3,0,5},’{2,0,1,6}};  //2*4的2维数组
//d[0] [0]=7
//d[0] [1]=3
//d[0] [2]=0
//d[0] [3]=5
//d[1] [0]=2
//d[1] [1]=0
//d[1] [2]=1
//d[1] [3]=6

4.赋值

  • 非组合型数组在初始化时,可以通过‘{}和default关键词对所有元素进行默认赋值;
int a1 [0:7] [0:1023] =’{default:8’h55};
  • 非组合型数组的数组成员或者数组本身均可以对其赋值;
byte a[0:3] [0:3];
a[1][0] =8’h5;  //为单个元素赋值
a[3]=’{‘hF,’hA,’hC,’hE};  //为数组片段中的所有元素赋值

5.拷贝

  • 组合型数组,如果两个数组大小不一样,则会通过截取或者扩展右侧操作数来对左侧操作数赋值;
bit [1:0][15;0] a;  //32位2值逻辑向量
logic [3:0] [7:0] b;// 32位4值逻辑向量
logic [15:0] c;  //16位4值逻辑向量
logic [39:0] d;  //40位4值逻辑向量

b=a; //32位数组赋值给32位数组
c=a;  //高16位被截断
d=a;  //高8位填充0
  • 非组合型数组,数组间拷贝时必须要求左右两侧操作数的维度和大小一致;
logic [31:0] a [2:0] [9:0];
logic [0:31] b [1:3] [1:10];
a=b;//非组合型数组赋值于非合型数组
  • 非组合型数组无法直接赋值给组合型数组;组合型数组也无法直接赋值给非组合数组;

6.foreach循环结构

  • SV添加foreach循环来对一维或者多维数组进行循环索引,不需要指定该数组的维度大小;
int sum [1:8] [1:3] ;
foreach (sum[i,j])  sum[i][j] =i+j;  //数组初始化
  • Foreach 循环结构中的变量无需声明;
  • Foreach 循环结构中的变量是只读的,作用域只在此循环结构中;

7.系统函数

  • $dimensions(array_name) 用来返回数组的维度;
  • $left(array_name,dimension)返回指定维度的最左索引值;
logic [1:2] [7:0] word [0:3][4:1];
$left(word,1) will return 0
$left(word,2 will return 4
$left(word,3 will return 1
$left(word,4 will return 7
  • left()类似,还有{right,low,high} (array_name,dimension);
  • $size (array_name,dimension)可以返回指定维度的尺寸大小;
  • $increment(array_name,dimension),判断指定维度的最左索引值大于或者等于最右索引值,大于返回1,否则返回-1;
  • $bits(expression) 用来返回数组存储的bit数目;
wire [3:0] [7:0] a [0:15]  ;  //$bits(a) 返回512
struct packed {byte tag; logic [31:0] addr;} b; //$bits(b) 返回40

END