數字邏輯實踐5->Verilog語法 | wire 與 reg 的選擇與特性

問題起因:最初學習數字邏輯設計理論的時候還沒有注意到,在實驗課上寫程式碼的時候發現了一個問題:

對於源碼模組的變數定義,何時定義為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訊號常常是暫存器、觸發器的輸出。