1.数组
1.1定宽组数
数组声明
int a[0:15]; // 一维数组,定以16个
int a[16]; //同上int b[0:7] [0:3] ;//二维数组
int b[8][4] ; //同上,二维数组最后一个数据赋值, b[7][3]=1;初始化赋值
int c[5]=`{0,1,2,3,4}; //对5个元素初始化 ,使用单引号加大括号,默认从低到高
int d[6];
d=`{0,1,2,3,4,5};//为6个元素赋值
d=`{7,8,9};//为前3个元素赋值
c=`{5{7}}; //5个值都为7
d=`{7,8,default:-1};//{7,8,-1,-1,-1,-1}
存储空间考量
bit [3][7:0] a_1; //合并性数组 所有的维度都在左边 占据一个word 连续 类似[3][7:0] 高纬度在左边
bit [7:0]a_2 [3]; //非合并性数组 只要一个维度写到了右边,高纬度永远在右边 占据3个word 非连续logic [3][7:0] a_3;//logic 是4值,要用2位存储,24*2=48,所以就是 2word
logic [7:0] a_4[3];//3word基本数组操作 for和foreach循环
initial begin
bit [31:0] src[5],dst[5];
for (int i=0; i<$size(src);i++)
src[i]=i;foreach(dst[j]) //j自动创建
dst[j]=src[j]*2; //dst的值是src的2倍
end赋值和比较
赋值,使用"="
比较,“==”或“!=”
bit [31:0] a[2]=`{1,2};bit [31:0] b[2]=`{2,1};
if(a==b) $display(“a=b”); //比较数组
else $display(“a!=b”);
a=b; //赋值
a[1]=2; //修改一个值1.2动态组数
特点:可以在仿真运行时灵活调节数组的大小即存储量
动态数组一开始用[]来声明,此时数组是空的。后续用new[]来分配空间,在方括号中传递数组的宽度。数组声明
int a [],b[]; //声明动态数组 int默认值0 integer默认值x
initial begin
a =new[5] ; //分配5个元素
foreach (a[j])
a[j]=j; //对元素初始化 {0,1,2,3,4}
b=a; //复制一个动态数组 {0,1,2,3,4}
b[0]=5; //{5,1,2,3,4}
$display(a[0],b[0]); //a[0]=0;b[0]=5;
a=new[20] (a); // a={0,1,2,3,4,0,…,0} 旧值存在
a=new[100]; //a={0,0,…,0} 旧值不存在
a.delete();//删除元素 a=new[0], a=`{};
end
1.3队列
队列结合了链表和数组的优点,可以在它的任何地方添加或删除元素,并且通过索引实现对任一元素的访问。
队列的声明是使用带有美元符号的下标[$],其中队列一个简单使用即是通过其自带方法push_back()和pop_front()的结合来实现FIFO的用法。push是存,pop是取,front是队列头,back是队列尾。
int j=1 ,q2[$]={3,4},q[$]={0,2,5}; //队列赋值不使用`
0 1 2 3
q.insert(1,j); //{0,1,2,5} 在2前插1 (a,b)a表示在哪里插入值 ,b表示插入的数值
q.insert(3,q2); //在q中插入队列q2 {0,1,2,3,4,5}
q.delete(1); //{0,2,3,4,5} 删除一个元素 q.delete() 删除所有的元素
q.push_front(6); //{6,0,2,3,4,5} 从队列头插入
j=q.pop_back(); //{6,0,2,3,4} 从队列尾取出 j=5
q.push_back(8); //{6,0,2,3,4,8} 从队列尾插入
j=q.pop_front(); //{0,2,3,4,8} 从队列头取出 j=6
foreach(q[i])
$display(q[i]); //打印整个队列
q.delete();
end
1.4关联数组
如果创建一个大容量的数组,那么动态数组就可以满足,但是如果创建一个超大容量的数组呢?动态数组的限制在于存储空间在一开始创建时即被固定下来,大容量数组中有相当多的数据不会被存储和访问。
关联数组可以用来保存稀疏矩阵的元素。当你对一个非常大的地址空间寻址时,该数组只为实际写入的元素分配空间,这种实现方法所需要的空间比定宽或动态数组占用的空间要小得很多。
bit [63:0] assoc [int] ,idx=1; //idx也是64 位
repeat(64) begin //对稀疏矩阵得元素进行初始化
assoc[idx] =idx;
idx=idx<<1;
endforeach(assoc[i]) //使用foreach 遍历数组
$display(‘’ assoc[%h]= = %h’’ , i, assoc[i] );//使用函数遍历数组
if(assoc.first (idx) ) begin // 返回第一个索引值,如果为0,表示该关联数组为空
do
$display(‘’ assoc[%h] = %h ‘’ , idx , assoc[idx] );
while(assoc.next(idx) ); //得到下一个索引值
end
//找到并删除第一个元素
assoc.first(idx);
assoc.delete(idx);