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下進行。觸發條件可以是時鐘信號上升沿。賦值語句可以是=或者
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中常見的使用錯誤及解決方法。
-
寄存器
+關注
關注
31文章
5363瀏覽量
121027 -
Verilog
+關注
關注
28文章
1351瀏覽量
110310 -
編程語言
+關注
關注
10文章
1950瀏覽量
34931
發布評論請先 登錄
相關推薦
評論