1. 程式人生 > >verilog語言中,reg型與wire型的區別

verilog語言中,reg型與wire型的區別

對於初學者來說,首先一個大問題就是在讀程式時候,變數型別reg型wire型的區分。

最近做了點模擬工作,對兩種型別的變數有一些自己的見解,寫一寫,交流學習。

自己的理解:

wire型相當於是一根連線

reg型相當於是儲存器

在wire型相當於連線的基礎上我們很容易就可以理解,當連線的來源端發生改變時,wire變數立即隨之發生改變。

由此:wire型變數存在於begin...end語句之外。只能用assign語句進行賦值。(assign語句和時鐘無關,只要等號右側變數改變,左側變數就會隨之發生改變)

reg型相當於儲存器的基礎上,可以看做是一個一個的暫存器,當觸發條件達成時,暫存器的內容才發生改變,否則一直保持上一個狀態。

由此:reg型變數存在於begin...end語句之中。一般在always,initial語句中。

如果變數型別使用錯誤或者位置錯誤,vivado會提示錯誤,所以也不用擔心。

接下來是我在模擬中遇到的一點總結:

模組的輸入埠可以由wire/reg型驅動,但是輸入埠只能是wire型。

模組的輸出埠只能驅動wire型,輸出埠可以是wire/reg型。

在設計中,輸入訊號一般來說你是不知道上一級是暫存器輸出還是組合邏輯輸出,那麼對於本級來說就是一根導線,也就是wire型。而輸出訊號則由你自己來決定是暫存器輸出還是組合邏輯輸出,wire型、reg型都可以。但一般的,整個設計的外部輸出(即最頂層模組的輸出),要求是暫存器輸出,較穩定、扇出能力也較好。

手機打字,就不貼圖了。大家可以自己嘗試一下。

//========================================================//

另,通過看相關的帖子,還有在綜合上的考慮。

從綜合的角度來說,HDL語言面對的是綜合器(如DC等),要從電路的角度來考慮。 這時: 1、wire型的變數綜合出來一般是一根導線; 2、reg變數在always塊中有兩種情況: (1)、always後的敏感表中是(a or b or c)形式的,也就是不帶時鐘邊沿的,綜合出來還是組合邏輯 (2)、always後的敏感表中是(posedge clk)形式的,也就是帶邊沿的,綜合出來一般是時序邏輯,會包含觸發器(Flip-Flop)