1 内建数据类型
1.1 逻辑(logic)类型
logic类型是四状态数据类型,不能有多个结构性的驱动,即只能有一个驱动。
1.2 状态数据类型
bit b; //双状态,单比特
bit [31:0] b32; //双状态,32比特无符号整数
int unsigned ui; //双状态,32比特无符号整数
int i; //双状态,32比特有符号整数
byte b8; //双状态,8比特有符号整数
shortint s; //双状态,16比特有符号整数
longint l; //双状态,64比特有符号整数
integer i4; //四状态,32比特有符号整数
time t; //四状态,64比特无符号整数
real r; //双状态,双精度浮点数
2 定宽数组
2.1 定宽数组的声明和初始化
定宽数组的声明有两种方法,可以采用数组上下界的方式(完整的声明),也可以采用指定维度的方式(紧凑的声明)。
//定宽数组的声明
int lo_hi[0:15]; //16个整数[0]……[15]
int c_style[16]; //16个整数[0]……[15]
//声明并使用多维数组
int array2[0:7][0:3]; //完整的声明
int array3[8][4]; //紧凑的声明
array2[7][3]=1; //设置最后一个元素
如果代码从越界的地址中读取数据,将会返回数组元素类型的缺省值,四状态类型返回X,双状态类型返回0;线网在没有驱动的时候输出是高阻态Z。
2.2 常量数组
使用单引号加大括号来初始化数组:
//初始化一个数组
int ascend[4]='{0,1,2,3}; //对4个元素进行初始化
int descend[5];
descend='{4,3,2,1,0}; //为5个元素赋值
descend[0:2]='{5,6,7}; //为前3个元素赋值
ascend='{4{8}}; //四个值全部为8
descend='{9,8,default:1}; //{9,8,1,1,1}
2.3 for和foreach
在foreach循环中,只需要指定数组名并在其后面的方括号中给出索引变量,便会自动遍历数组中的元素;索引变量自动声明,并只在循环内有效;多维数组使用时,采用[i,j]
的方式。
//for循环的使用
for(int i=0;i<$size(src);i++)
//foreach循环的使用
foreach(md[i,j])
foreach循环会遍历原始声明中的数组范围:
//数组f[5] == f[0:4]
foreach(f[i]) //等同于下式
for(int i;i<=4;i++)
//数组rev[6:2]
foreach(rev[i]) //等同于下式
for(int i=6;i>=2;i--)
2.4 数组操作——复制和比较
聚合比较和复制,其中比较只限于等于比较和不等于比较。
2.5 同时使用位下标和数组下标
这里要了解$display
、$displayb
、$displayh
、$displayo
的使用。
2.6 合并数组
合并数组既可以用作数组,也可以当成单独的数据,它的存放方式是连续的比特集合,中间没有任何闲置的空间。
2.7 合并数组的例子
声明合并数组时,合并的位和数组大小作为数据类型的一部分必须在变量名前面指定。数组大小定义的格式必须是[msb:lsb]
,而不是[size]
。
合并和非合并数组可以混合使用。
3 动态数组
定宽数组的宽度在编译时就确定了,可以会造成存储空间的浪费;动态数组可以在仿真时分配空间或调整宽度,可以使用最小的存储量。
动态数组在声明时使用空的下标[]
,其宽度不在编译时给出,而在程序运行时再指定。
数组在最开始时是空的,所以要调用new[]
操作符来分配空间,同时在方括号中传递数组宽度。
可以把数组名传给new[]
构造符,并把已有数组的值复制到新数组里。
4 队列
队列的声明是使用带有美元符号的下标:[$]
。队列元素的编号从0到$。注意队列的常量只有大括号而没有数组常量中开头的单引号;不要对队列使用构造函数new[]
。
q.insert(i,j); //在队列q的i位置处插入j
q.delete(i); //删除队列q的第i个元素
q.delete(); //删除整个队列q
j=q.pop_back; //取出队列q最后一个元素并赋值给j
q.push_back(j); //在队列q的最后插入一个元素j
j=q.pop_front; //取出队列q的第一个元素并赋值给j
q.push_front(j); //在队列q的前面插入一个元素j
把$
放在一个范围表达式的左边,那么$
将代表最小值,例如[$:2]
就代表[0:2]
。如果$
放在一个范围表达式的右边,则代表最大值。
5 关联数组
关联数组采用在方括号中放置数据类型的形式进行声明。
6 链表
应该避免使用链表。
7 数组的方法
7.1 数组缩减方法
sum、product、and、or、xor……
7.2 数组定位方法
min()、max()、unique()、find with……
7.3 数组的排序
reverse()、sort()、rsort()、shuffle()……
8 选择存储类型
根据灵活性、储存器用量、速度、排序来选择最优的数据结构。