# 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)