Verilog中Wire 和 Reg 的區別

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;

end

Reg在聲明時候不賦初值。未賦值的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。

 

小結

這篇文章從功能,變量狀態,賦值方式,使用方式等角度討論了wire和reg變量類型的區別。並且給出了一個在verilog中常見的使用錯誤及解決方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章