定宽数组、动态数组、关联数组
定宽数组的声明
int lo_hi [0:15];
int c_style [16];
int array2 [0:7][0:3];
int array3 [8][4];
非合并数组的声明
bit [7:0] b_unpack[3];
仿真器通常使用两个或两个以上连续的字(Word)存放logic和integer等四值逻辑类型,比存放二值逻辑变量多用一倍空间。
数组初始化
int ascend[4] = '{0, 1, 2, 3};
$display("%p", ascend); // 打印数组
合并数组的声明
合并的位和数组大小必须在变量名字的前面。
bit [3:0][7:0] bytes;
bit [3:0][7:0] bytes [5];
动态数组
声明时使用空的下标[],程序运行时再指定,数组宽度不是编译时给。
int dyn[], d2[]; //声明动态数组
dyn = new[5]; //分配5个元素
d2 = dyn; //复制动态数组
dyn = new[20](dyn); //分配20个新元素并将dyn复制给开头的5个元素,释放dyn空间
dyn.delete(); //删除所有元素
系统函数$size()用于返回定宽和动态数组的宽度,.size()用于动态数组。
只要数据类型相同,例如都是int,定宽数组和动态数组之间就可以相互赋值。
元素数目相同时,可以把动态数组的值复制到定宽数组。
关联数组
关联数组采用在方括号中放置数据类型的形式进行声明。
byte assoc[byte];
int switch[string];
int power_of_2[int] = '{0:1, 1:2, 2:4};
一般建议使用foreach循环遍历该数组。
数组的方法
缩减方法把一个数组缩减成一个值。
int a;
a = arr.sum();
a = arr.product();
a = arr.and(); //所有元素的按位与操作
定位方法返回一个队列。
int q[] = '{1, 1, 3, 5, 7};
int tq[$];
tq = q.min();//{1}
tq = q.max();//{7}
tq = q.unique();
tq = q.find with (item > 3);
tq = q.find_index with(item>3);
数组排序
arr.reverse();//原数组倒排
arr.sort();//从小到大排列
arr.rsort();//从大到小排列
arr.shuffle();//随机打乱排列
关联数组不能重新排序,定宽数组、动态数组、队列可以排序。