第二章 數據類型與編程結構
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