wire 和reg是Verilog程序里的常見(jiàn)的兩種變量類型,他們都是構(gòu)成verilog程序邏輯最基本的元素。正確掌握兩者的使用方法是寫好verilog程序的前提。但同時(shí),因?yàn)樗麄冊(cè)诖蠖鄶?shù)編程語(yǔ)言中不存在,很多新接觸verilog語(yǔ)言的人并不能很清楚的區(qū)別兩種變量的不同之處。這里簡(jiǎn)單對(duì)他們做一個(gè)比較,方便在編程時(shí)區(qū)別使用。
功能和狀態(tài)
Wire主要起信號(hào)間連接作用,用以構(gòu)成信號(hào)的傳遞或者形成組合邏輯。因?yàn)闆](méi)有時(shí)序限定,wire的賦值語(yǔ)句通常和其他block語(yǔ)句并行執(zhí)行。
Wire不保存狀態(tài),它的值可以隨時(shí)改變,不受時(shí)鐘信號(hào)限制。
除了可以在module內(nèi)聲明,所有module的input 和output默認(rèn)都是wire型的。
Reg是寄存器的抽象表達(dá),作用類似通常編程語(yǔ)言中的變量,可以儲(chǔ)存數(shù)值,作為參與表達(dá)式的運(yùn)算,通常負(fù)責(zé)時(shí)序邏輯,以串行方式執(zhí)行。
Reg可以保存輸出狀態(tài)。狀態(tài)改變通常在下一個(gè)時(shí)鐘信號(hào)邊沿翻轉(zhuǎn)時(shí)進(jìn)行。
賦值方式
Wire有兩種賦值方式
1.在定義變量時(shí)賦初值,方式是用=。如果之后沒(méi)有再做賦值,初值會(huì)一直保留,(是否可以給邏輯?)
wire wire_a = 1’b0;
2.用assign語(yǔ)句賦值,等式右邊可以是wire,reg,一個(gè)常量或者是邏輯運(yùn)算
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的默認(rèn)狀態(tài)是高阻態(tài),即z。
對(duì)reg的使用通常需要有觸發(fā)條件,在always的block下進(jìn)行。觸發(fā)條件可以是時(shí)鐘信號(hào)上升沿。賦值語(yǔ)句可以是=或者
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在聲明時(shí)候不賦初值。未賦值的reg變量處于不定態(tài),即x。
使用方式
在引用一個(gè)module時(shí),輸入端口可以是wire型,也可以reg型。這里可以把對(duì)input的賦值看作一個(gè)assign語(yǔ)句,使用的變量相當(dāng)于等號(hào)右邊的變量,所以兩者都可以。
而對(duì)于輸出端口,必須使用reg型,而不能是wire型。同樣用assign的角度考慮,module的輸出在等號(hào)右邊,而使用的變量成了等號(hào)左邊,assign語(yǔ)句等號(hào)左邊只能是wire型。
位寬
這是個(gè)使用注意事項(xiàng)。所有的wire和reg在聲明時(shí)如果不做特殊聲明,只有1位。這個(gè)對(duì)于熟悉其他編程語(yǔ)言的人是一個(gè)容易犯錯(cuò)的地方。
執(zhí)行
wire wire_a = 4’he;
語(yǔ)句最后得到的wire_a是0x1,而不是0xe。因?yàn)閣ire_a只取了0xe的最低位的值而省略掉了其他值。所以正確的語(yǔ)句應(yīng)該是
wire[3:0] wire_a = 4’he;
這樣wire_a輸出的結(jié)果才是一個(gè)0xe。
小結(jié)
這篇文章從功能,變量狀態(tài),賦值方式,使用方式等角度討論了wire和reg變量類型的區(qū)別。并且給出了一個(gè)在verilog中常見(jiàn)的使用錯(cuò)誤及解決方法。
-
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120366 -
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110100
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論