Verilog中Wire 和 Reg 的區別

2021-10-05 11:37:38 字數 1628 閱讀 3233

wire 和reg是verilog程式裡的常見的兩種變數型別,他們都是構成verilog程式邏輯最基本的元素。正確掌握兩者的使用方法是寫好verilog程式的前提。但同時,因為他們在大多數程式語言中不存在,很多新接觸verilog語言的人並不能很清楚的區別兩種變數的不同之處。這裡簡單對他們做乙個比較,方便在程式設計時區別使用。

功能和狀態

wire主要起訊號間連線作用,用以構成訊號的傳遞或者形成組合邏輯。因為沒有時序限定,wire的賦值語句通常和其他block語句並行執行。

wire不儲存狀態,它的值可以隨時改變,不受時鐘訊號限制。

除了可以在module內宣告,所有module的input 和output預設都是wire型的。

reg是暫存器的抽象表達,作用類似通常程式語言中的變數,可以儲存數值,作為參與表示式的運算,通常負責時序邏輯,以序列方式執行。

reg可以儲存輸出狀態。狀態改變通常在下乙個時鐘訊號邊沿翻轉時進行。

賦值方式

wire有兩種賦值方式

1.     在定義變數時賦初值,方式是用=。如果之後沒有再做賦值,初值會一直保留,(是否可以給邏輯?)

wire wire_a = 1』b0;

2.     用assign語句賦值,等式右邊可以是wire,reg,乙個常量或者是邏輯運算

wire wire_a;

wire wire_b;

wire wire_c;

reg reg_a;

assign wire_b = wire_a;

assign wire_c =reg_a;

assign wire_d =wire_b & wire_c;

如果不賦值,wire的預設狀態是高阻態,即z。

對reg的使用通常需要有觸發條件,在always的block下進行。觸發條件可以是時鐘訊號上公升沿。賦值語句可以是=或者 <=。如果是從reg到reg,則形成組合邏輯,如果是從reg到reg,則構成乙個暫存器,形成時序邏輯。

wire wire_a;

wire wire_b;

reg reg_a;

reg reg_b;

always @( posedge clk)

begin

reg_b =reg_a;

reg_c  = wire_a | wire_b;

endreg在宣告時候不賦初值。未賦值的reg變數處於不定態,即x。

使用方式

在引用乙個module時,輸入埠可以是wire型,也可以reg型。這裡可以把對input的賦值看作乙個assign語句,使用的變數相當於等號右邊的變數,所以兩者都可以。

而對於輸出埠,必須使用reg型,而不能是wire型。同樣用assign的角度考慮,module的輸出在等號右邊,而使用的變數成了等號左邊,assign語句等號左邊只能是wire型。

位寬這是個使用注意事項。所有的wire和reg在宣告時如果不做特殊宣告,只有1位。這個對於熟悉其他程式語言的人是乙個容易犯錯的地方。

執行wire wire_a = 4』he;

語句最後得到的wire_a是0x1,而不是0xe。因為wire_a只取了0xe的最低位的值而省略掉了其他值。所以正確的語句應該是

wire[3:0] wire_a = 4』he;

這樣wire_a輸出的結果才是乙個0xe。

小結

Verilog中wire和reg的區別

wire為無邏輯線,本身只做連線,不帶邏輯,輸入什麼就是什麼。用always語句對wire語句賦值,綜合就會報錯。1 assign 語句 例如 reg a,b wire and result assign and result a b 2 原件例化必須用wire 例如 wire dout ram u...

verilog中wire和reg型別的區別

一 基本概念 wire型資料常用來表示以assign關鍵字指定的組合邏輯訊號,模組的輸入輸出埠型別都預設為wire型,wire相當於物理連線,預設初始值是z。reg型表示的暫存器型別,用於always模組內被賦值的訊號,且必須定義為reg型,代表觸發器,常用於時序邏輯電路,reg相當於儲存單元,預設...

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

對於初學者來說,首先乙個大問題就是在讀程式時候,變數型別reg型與wire型的區分。最近做了點 工作,對兩種型別的變數有一些自己的見解,寫一寫,交流學習。自己的理解 wire型相當於是一根連線。reg型相當於是儲存器。在wire型相當於連線的基礎上我們很容易就可以理解,當連線的 端發生改變時,wir...