# [[DV筆記] Systemverilog - 數據結構](/8N4Qts9VTAOzq-7Bqp_3HA)
## **基本數據類型**
| Type | Width | State | Signed |
|:--------:|:-----:|:-----:|:--------:|
| reg | 1 | 4 | unsigned |
| wire | 1 | 4 | unsigned |
| logic | 1 | 4 | unsigned |
| bit | 1 | 2 | signed |
| byte | 8 | 2 | signed |
| shortint | 16 | 2 | signed |
| int | 32 | 2 | signed |
| longint | 64 | 2 | signed |
| time | 64 | 4 | unsigned |
Verilog 中基本的數據類型為 reg 和 wire,為 4 state的數據類型,可以為 0, 1, x, z
Systemverilog 新增 logic 數據類型,可已在驗證環境中為 reg 或是 wire,同樣也是 4 state的數據類型
使用 2 state 的數據類型可以減少 Memory 的使用
**補充一下**
wire 只能在使用在 blocking
reg 則需要在 initial 或是 alwauys block 中
基本上如果是在testbench中,可以無腦使用 logic
## **Array 陣列類型**
### Static Array
顧名思義就是一開始就固定長度的 array,又區分為 packed 和 Unpacked
寫在name前面表示為 packed -> Memory 一定會分配連續空間
寫在name後面表示為 unpacked -> Memory 不一定會分配連續空間
```static array=
bit [3:0][4:0] static_array [1:0][2:0];
```
理解方向為由左至右, unpacked dimention 先,再讀 packed dimention,所以這是一個 [1:0][2:0][3:0][4:0] 的4維array
> [這邊讀的順序一開始讀的時候真的是完全搞不懂,後來看到有文章說是逆時鐘看法比較好記憶,不過工作一陣子後還是容易忘]
針對 packed dimention 賦值:
```
bit [2:0] packed_array; //packed array "不能" 寫成 [3] packed_array
packed_array = 3'b0;
```
針對 unpacked dimention 賦值:
```
bit unpacked_array[0:2]; //也可以寫成 bit unpacked_array[3]
unpacked_array = '{3{0}};
// 可以設定 default 值的寫法:
unpacked_array = '{default:0};
```
### Dynamic Array
可以在compile之後才設定Array size,以節省 Memory 空間
```
int dynamic_array[];
//在initial block 裡才設定大小
initial begin
dynamic_array = new[5]; //用 new 去設定大小
dynamic_array.delete(); //清空整個 Array
end
```
### Queues
類似 C++ 的 deque,可以隨時插入元素,非常方便使用
> [在工作的時候也是很喜歡使用!]
```
int queues[$]; //就是使用這個 $ 符號即可
queues = {0,1,2};
//好用的 function:
queues.insert(1,3); //在 index==1 插入0 queues = {0,3,1,2}
queues.delete(2); //注意是delete index == 2, queues = {0,3,2}
queues.pop_front(); //queues = {3,2}
queues.pop_back(); //queues = {3}
queues = {queues,1,2}; //queues = {3,1,2}
queues = queues[1:$]; //queues = {1,2}, $表示到queue 的最後一個元素
queues.delete(); //清空 queue, 也可以寫 queues = {};
```
queue 非常方便使用,所以也特別整理可以直接使用的 function!
```
int q [$];
q = {0,1,1,2,3,3,4,5};
q.min(); //return 0
q.max(); //return 5
q.unique() // return 0,1,2,3,4,5 有點像是變成 C++ 的 set
//查找系列
q.find_index with (item>3); //return queue裡面 >3 的整數的 index ,也就是 6,7, 這裡的 item 是一個隱含變量,代表隊列中的當前元素。它不需要顯式地定義類型,因為它會自動匹配隊列中元素的類型。
q.find_first_index with (item==3); //return 4
q.find_last_index with (item==3); //return 5
//排序系列! 實用
q.reverse(); //q 變成 {5,4,3,3,2,1,1,0}, 不會 return
q.sort(); // 從 小到大 排序
q.rsort(); //從 大到小 排序
q.shuffle(); //亂序
```
### Associate Arrays
就是Hash,資料不連續或是需要快速查找可以使用這個!
```
int assoc [string]; // 表示 index 為 string, 存放 int 類型的數據
int var;
assoc.exists("does_it_exit"); //查找 key 是否存在
assoc.delete("delete"); //delete key
assoc.delete(); //清空accociate array
assoc.num(); //return key 數目
assoc.first(var); // return var = 第一個 key
assoc.last(var); //return var = 最後一個 key
assoc.next(var); //return var= 下一個 key
assoc.prev(var); //return var= 上一個 key
//整理的時候還意外查到一個用法:
int assoc[*]; //可以用*來表示索引可以是任何整數類型,包括 int、shortint、longint、byte 等,甚至可以是更複雜的整數表達式。 -->很方便!
```
## String
string 雖然在 verification 通常只是用來print debug message,並沒有到那麼重要,不過如果面試會考一些對 string 的操作了話,還是需要知道一些基本的 fucntion:
```
string s;
s= "abc";
s.getc(0); //return 'a'
s.toupper(); //s變成 "ABC"
s.tolower(); //s變成 "abc"
s.putc(2,"!"); //s 變成 "ab!"
s={s,"123"}; //s = "ab!123"
s.substr(2,5); // return "!123"
```
## 組合數據
### Struct
可以把多種數據結構組合成一個數據結構,雖然後來比較常用 class
```
struct st {
int id;
bit gender;
string name;
} person;
person.id = 5;
person.gender = 1;
person.name = "TOM";
```
通常 struct 會跟 typedef 搭配使用,這樣就可以用一個 struct 定義,去建構不同的數據結構!
```
typedef struct{
int id;
bit gender;
string name;
} person;
person TOM = '{0,1,"TOM"}; //可以這樣初始化
person MAY = '{1,0,"MAY"};
```
### Union
講到 struct 就要搭配 union 這個數據結構一起整理
union 用於將多個變量組合在同一個存儲空間中。這意味著在任意時間內,只有一個成員是有效的。union 提供了一種節省存儲空間的方法,特別適用於需要在不同時間存取不同類型數據的情況。
聲明和使用:聲明聯合體變量 data 並設置其成員值。注意,由於所有成員共享同一存儲空間,設置一個成員的值會影響其他成員
```
typedef union {
int int_val;
byte byte_val[4];
} data_t;
//也就是 int_val 跟 byte_val在記憶體中是相同的區域,只是名字不一樣
data_t union_data;
union_data.int_val = 32'habcdefgh;
//這邊 byte_val[4] 也同時被set 為 '{8'hgh,8'hef,8'hcd,8'hab},要注意 byte[0] = 8'hgh
```
### Enum
enum 是在描述 state machine 十分常用的數據結構,可以將 參數的值改以容易識別的名稱表示
```
typedef enum {red,green,blue} pixel_t;
pixel_t pixel;
pixel = red; //default 會照 red = 0, green = 1, blue = 2 這樣表示
```
## 結語
數據結構整理差不多到這邊啦,可能不盡詳細,不過基本上已經夠用啦!重新再整理一遍還是會回想一些已經忘記的語法,這也是想再把筆記整理好的原因