第二章 数据类型与编程结构
2.1 数据类型
2.1.1 两态数据类型
两态数据类型:(1 , 0)默认为0
shortint , int , longint , byte , bit
4态数据类型:(1 , 0,X , Z),默认为X
reg , logic , integer
以上,其中bit , reg , logic默认为无符号数。其他默认为有符号数。
2.1.2枚举类型
1.枚举类型
用来声明一组整型的命名变量。
enum [data_type] {name1=value1 , name2=value2, name3=value3,......nameN=valueN} var_name;
枚举类型的成员的值可以设置为任意整型常量值,或者从初始值0开始递增(默认情况)。
eg:
enum {red , yellow , green} light1 , light2; //未命名的枚举类型(int型)
////默认值:red = 0 , yellow = 1 , green = 2 , 默认从0递增
enum integer {IDLE , S0 = 'b10 , S1 , S2='x } state , next
////IDLE = 0 , S0 = 2 , S1 = 3 , S2 = x
2.用户自定义数据类型
typedef关键字进行自定义类型扩展
eg:
parameter OPSIZE = 8;
typedef reg [OPSIZE-1:0] opreg_t;
opreg_t op_a , op_b;
2.1.3 数组和队列
- 静态数组
- 动态数组
- 关联数组
- 队列
1 静态数组
静态数组是定义时显性指定数组的大小。
有两种:压缩数组(packed array)和非压缩数组(unpacked array)
压缩数组:维数的定义在变量标识符之前,非压缩数组:维数的定义在变量标识符之后
eg:
bit [7:0] c1; //压缩数组,bit类型
real u [7:0]; //非压缩数组,实型
静态数组的使用方法:
静态数组的非压缩维数可以通过[Number - 1:0]或者[Number]的方式来定义:
int Array[0:7][0:31];//范围定义数组
等同于 int Array[8][32];//通过上限定义数组
压缩数组可以被指定为任何网线类型或者标量变量类型(如,reg , logic , bit)
具有预定义宽度的整数类型不能声明为压缩数组,包括byte , shortint , int , longint , integer.
非压缩数组可以被指定为任何数据类型。
eg:
integer i1;//=logic signed[31:0] i1
byte c2[4:0];//=bit signed [7:0] c2[4:0]
2.动态数组
声明:data_type array_name[ ];
定义时不分配大小,运行过程中动态分配大小,使用前必须通过调用new[ ],并在[ ]中输入长度数值来分配空间。
动态数组的内置函数:delete( )和size( ),不能用于静态数组。
eg:
int dyn1[ ],dyn2[ ]
dyn1 = new[100];//分配100个成员
dyn2 = new[200];
3.关联数组 Associative arrays
它是一种通过标号来分配空间和访问的数组,其好处就是值分配使用到的特定地址空间,当访问一个较大地址的数据时,SV值针对该地址分配空间。
4. 队列
队列是大小可变,具有相同数据类型成员的有序集合。
队列和链表相似,可以在队列的任何地方增加或删除元素,也像数组,可以用索引来访问元素。队列的声明是使用带有美元符号的下标[$]。队列元素的编号是从0到$。
data_type queue_name[ $ ];
data_type queue_name[ $:maxsize ];
data_type 是数据成员的数据类型,queue_name是定义的队列变量,$表示最后一个成员,maxsize表示队列成员最大数量。
在队列的前面或后面存取数据非常方便,无论队列有多大,这种操作所好味的时间都是一样的。在队列的中间增加或删除元素需要对已经存在的数据进行搬移一遍腾出空间,相应的操作所耗费的时间会随着队列的大小线性增加。
队列的基本操作如下:
int q[$] = { 2, 4, 8 }; //初始化队列
int p[$]; //
inte, pos;
e = q[0]; // read the first (left-most) item
e = q[$]; // read the last (right-most) item
q[0] = e; // write the first item
p = q; // read and write entire queue (copy)
q = { q, 6 }; // insert ’6’ at the end (append 6)
q = { e, q }; // insert ’e’ at the beginning (prepend e)
q = q[1:$]; // delete the first (left-most) item
队列还自带其他操作,如:
q.size;
Q.insert(i, e)is equivalent to: Q = {Q[0:i-1], e, Q[i,$]} 在第i个元素前插入一个元素
Q.delete(i)is equivalent to: Q = {Q[0:i-1], Q[i+1,$]} 删除第i个元素
e= Q.pop_front()is equivalent to: e = Q[0]; Q = Q[1,$] 提取出第一个元素,并删除
e = Q.pop_back()is equivalent to: e = Q[$]; Q = Q[0,$-1] 提取出最后一个元素,并删除
Q.push_front(e)is equivalent to: Q = {e, Q} 在队列头上插入元素e
Q.push_back(e)is equivalent to: Q = {Q, e} 在队列尾部插入元素e