問題起因:最初學習數字邏輯設計理論的時候還沒有注意到,在實驗課上寫程式碼的時候發現了一個問題:
對於原始碼模組的變數定義,何時定義為reg、何時定義為wire?它們各自又有什麼特性和物理意義?
1. wire
wire是網路資料型別的關鍵字。
網路資料型別表示結構實體(例如門)之間的物理連線(線)。網路型別的變數不能儲存值。
語言特性
wire型資料常用來表示用於
-
結構化定義
-
assign為代表的連續賦值描述
也叫資料流描述方式、RTL級描述方式
指定的組合邏輯訊號。
程式模組中,輸入輸出訊號型別預設時,自動定義為wire型。
wire型訊號可以用作任何表示式的輸入,也可以用作“assign”語句或例項元件的輸出。
示例:
1 wire a; 2 //定義了一個一位的wire型資料 3 wire [7:0] b; 4 //定義了一個八位的wire型資料 5 wire [4:1] c, d; 6 //定義了兩個四位的wire型資料 7 //注意是兩個
物理意義
表示線。
上面的
wire [7:0] b;
就表示一組編號從7到0的八條線。
從這個層次可以理解為什麼
1 wire [0:7] b; 2 3 wire [1:8] b; 4 5 wire [8:1] b;
都是符合定義不會報錯的;
也可以理解其可以作為任何表示式的輸入和輸出。
2. reg
reg是暫存器資料型別的關鍵字。而暫存器是資料儲存單元的抽象。
語言特性
reg型資料常用來表示用於always模組內的指定訊號,常代表觸發器。即常用在行為描述語句中。
在always塊內被賦值的每一個訊號都必須定義成reg型。
示例:
1 reg rega; 2 //定義了一個一位的名為rega的reg型資料 3 reg [3:0] regb; 4 //定義了一個四位的名為regb的reg型資料 5 reg [4:1] regc, regd; 6 //定義了兩個四位的名為regc和regd的reg型資料
reg型資料可以賦正值,也可以賦負值。
物理意義
表示類暫存器(registor)的儲存單元。
聯絡上面的語言特性,賦值語句的作用就是改變一組觸發器儲存的值。
另外強調一點:
reg型只表示被定義的訊號將用在always塊內,理解這一點很重要。並不是說reg型訊號一定是暫存器或觸發器的輸出。雖然reg訊號常常是暫存器、觸發器的輸出。