提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
在Verilog中可以声明一个数组类型,reg和线网类型还可以具有一个向量宽度。在一个对象名前面声明的尺寸表示向量的宽度,在一个对象名后面声明的尺寸表示数组的深度。在此基础上,SystemVerilog使用不同的术语表示数组:使用“压缩数组(packed array)”这一术语表示在对象名前声明尺寸的数组;使用“非压缩数组(unpacked array)”这一术语表示在对象名后面声明尺寸的数组。压缩数组可以由下面的数据类型组成:bit、logic、reg、wire以及其它的线网类型。无论是压缩数组还是非压缩数组都可以声明成多维的尺寸。
一、定宽数组
定宽数组即宽度固定的数组。如,
int ascend[4];
ascend = '{0,1,2,3};
int array[2][3];
array = '{'{0,1,2},'{3,4,5}};
1.1 Packed array(合并数组)
连续存储,元素为一位数据类型或枚举类型。如,
bit[2:0] [7:0] array5;
1.2 Unpacked array(非合并数组)
有间隙存储,任意类型组成。如,
bit[7:0] array4[2:0] 或 bit[7:0] array4[3]
二、动态数组
在仿真时分配空间或调整数组宽度,使用最小的存储量。如,
int dyn[], d2[];
dyn = new[5];
基本数据类型相同,定宽数组和动态数组之间可相互赋值。
元素个数相同的情况下,可以把动态数组的值复制到定宽数组;
当把定宽数组复制给动态数组时,SystemVerilog会自动调用构造函数new[ ]来分配空间并复制数值。
使用之前分配和初始化内存。
三、队列
队列与链表相似,可以增加或删除元素
bit queue_1[$];
int queue_2[$];
byte queue_3[$:255];
string queue_4[$];
插入元素/队列
q2.insert(1,j);
q2.insert(3,q);
q.push_front(6);
q.push_back(8);
删除元素
q2.delete(1);
j = q.pop_front;
j = q.pop_back;
四、关联数组
对一个较大的地址范围的一小部分进行访问,关联数组用来保存稀疏矩阵元素,只对写入的元素分配地址空间。
data_type array_name[index_type];
int a_array1[*] ;
bit [31:0] a_array2[string];
ev_array [myClass];
将内容存储在稀疏矩阵;
关联数组只有在使用时才分配存储空间;
关联数组为数组元素分配一个查找表,其中索引作为键。