# Data Types
此篇先介紹電路中會遇到的四種 value,再來則著重於介紹 wire 與 reg type 之間差異。
## Value Set
Verilog HDL 中會碰到的 value 只有下列這四種:
* 0: 代表 logic 0 與 False condition。
* 1: 代表 logic 1 與 True condition。
* x: 代表 unknown logic value,無法確定目前 signal 到底是 0 還是 1。
* z: 代表 high-impedance state,高阻抗狀態,當電路沒有接 input 時,值就會為 high z 狀態。
---
## Data Representation
宣告 data type 的格式,如下圖所示。第一個中括號 [] 填入想要的 data type,第二個中括號則填入所需的 bit 數,最後則是賦予 signal 一個簡單易懂的名字。
![](https://i.imgur.com/48LjkPc.png)
---
## Number Representation
在邏輯設計中,描述的數值最後都會以 bit 形式呈現。
格式:<size>’<base><value>
| | 說明 |
| --- | --- |
| size | number of bits. |
| base | b(binary) |
| | o(otcal) |
| | d(decimal) |
| | h(hexadecimal) |
| value | possible values for value are dependent on the base. |
>說明:( **`_`** 可用來隔開數字,對於程式執行不會有任何影響,使數字表示更為清楚。)
>
>建議運用底線,可以清楚知道自己是否有多打或少打 bit,也方便自己尋找。
>
>32’d1024: 代表用 32 bits 表示 1024 (十進制的數字)。
>
>12’d0: 代表用 12 bits 表示 0 (十進制的數字)。
>
>8’b1010_0111:代表用 8 bits 表示 10100111 (二進制的數字)。
>
>8'h3B: 等同於 8'b0011_1011,也就是用 8 bits 表示 3B(十六進制的數字)。
---
## Parameters
若想更改原先元件的 bit 數,A, B signal 從 1 bit 變為 3 bits,這樣都要重新撰寫程式嗎?
:::success
Comparator_1-bit
```verilog=
module Comparator(A, B, gt, lt, eq);
input A, B;
output gt, lt, eq;
...
endmodule
```
:::
:::success
Comparator_3-bit
```verilog=
module Comparator(A, B, gt, lt, eq);
input [2:0] A, B; //3 bits signal
output gt, lt, eq;
...
endmodule
```
:::
在此可以設定 Parameter,使修改參數更為方便,以下為程式碼與對應圖例。
:::success
```verilog=
//Port 宣告 舊版語法
module Comparator(A, B, gt, lt, eq);
parameter width = 3;
input [width-1:0] A, B; //3 bits signal
output gt;
output lt;
output eq;
...
endmodule
//Port 宣告 新版語法
module Comparator#(parameter width = 3)(
input [width-1:0] A;
input [width-1:0] B;
output gt;
output lt;
output eq;
);
...
endmodule
```
:::
![](https://i.imgur.com/tnCVvEc.png=250x)
---
## Data type
Data type 分為兩種,Wire 與 Register type,兩者差別在於**是否能描述記憶性元件**。
說明:何謂記憶性元件?
* Circuit 可分為以下這兩種:
* Combinational circuit
* **無記憶性**。
* 由多個 logic gate 組成電路。
* input 輸入後,經過電路後,直接得出 output。
![](https://i.imgur.com/lTyUcgE.png)
* Sequential circuit(在之後課程中將會提到)
* 包含有記憶性元件,如 D Flip Flop,電路內含 state 概念。
* output 與 state 有密切關係。
* 在此先以生活例子進行舉例:
* 天氣狀態簡單分為晴天與雨天,input 代表是否有帶雨傘,output 則代表是否會淋到雨,從這看出會不會淋雨與目前天氣狀態有相關。
### Wire type
此種 type **不能描述記憶性元件**。
* 宣告 wire type。(下方為程式碼範例)
:::success
```verilog=
parameter width = 4;
// 1 bit A signal
wire A;
// 2-bit B signal
wire [1:0]B;
// width-bit C signal
wire [width-1:0]C;
```
:::
* 可用於描述 Combinational circuit。
* **wire type** 一定是搭配 **assign statement**,以描述 Combinational circuit。(下方為程式碼範例)
:::success
```verilog=
parameter width = 4;
// width-bit C signal
wire [width-1:0]C;
assign C = 4'b1001;
```
:::
* 宣告 input / output port、wire 型態以及 bit數時,可以同時宣告或分開宣告,另外,在宣告 input/output 時,default 的資料型態為 wire,以 Comparator 為例:(程式碼與對應圖例)
:::success
```verilog=
//Port 宣告舊版語法
module Comparator(A, B, gt, lt, eq);
input A, B;
//寫法1 default 為 wire type
output gt, lt, eq;
/*
//寫法2 分開宣告
output gt, lt, eq;
wire gt, lt, eq;
*/
/*
//寫法3 同時宣告
output wire gt;
output wire lt;
output wire eq;
*/
...
endmodule
```
:::
![](https://i.imgur.com/bHEWVJc.png=350x)
### Register type
此種 type **能用於描述記憶性元件**,這部分著重於介紹 reg type。
* Register type 又分為以下四種:
* **reg**: unsigned,可自行設計 width。
* integer: 2’s complement,width 固定為 32-bit,大都用於 Testbench。
* time: unsigned,width 固定為 64-bit,大都用於 Testbench。
* real: real number,大都用於 Testbench。
* 宣告 reg type。(下方為程式碼範例)
:::success
```verilog=
parameter width = 4;
// 1 bit A signal
reg A;
// 2-bit B signal
reg [1:0]B;
// width-bit C signal
reg [width-1:0]C;
```
:::
* 可用來描述 Combinational 與 Sequential circuit 。
* **reg type** 一定是包在 **always block**裡,以描述 circuit。
---
## 總結
以上為介紹從 Verilog 中主要的 data type,**請同學們一定記住 wire type 搭配 assign,reg type 則搭配 always blocks。**
# [Home Page:hatched_chick: ](https://hackmd.io/s/BkYeCF5Og)