verilog之wire和reg
1、區別
wire為線,reg為寄存器。至少初期這兩個名詞的意思是這樣的。wire在電路設計中指代的就是某個點的邏輯值,而reg則指代某個寄存器輸出的邏輯值。這個理解可以覆蓋大部分的使用。而不在這一范圍內的就是使用always寫組合邏輯。這時的reg具備的只有語法意義,而沒有電路意義。always塊內要求使用reg類型,拓展了always的用法,但是降低了verilog與電路的對應性。
在端口聲明中,wire是輸入的唯一類型。可以從電路來理解,reg變量只有存在被賦值的語句才有意義,如果使其作為模塊的輸入,那么這個reg變量就會需要在模塊內寫輸入的賦值,顯然不合理。沒有賦值的reg就是wire。至於輸出,則是可以選擇reg和wire。reg可以使用,是模塊內有reg的賦值語句。如果沒有,編譯器會警告然后將該端口在RTL視圖中剝離。好像一些編譯器會直接刪除這部分語句。wire自然也可以。wire在模塊內肯定有連線。
同樣,在激勵文件中,reg作為其他模塊的輸入,也是基於要在激勵文件中編寫其他模塊的輸入。輸出則是默認wire類型。這里主要防止模塊輸出為reg。reg和reg在端口相連是非法的。這里可能是考慮到reg變量的賦值只能在always等結構中,端口處顯然不存在這一結構。
2、使用
通過前面的總結可以看到使用中的結構是:
源文件:
module test( input wire a, output wire/reg b ); //=========== endmodule
激勵文件
module test_tb; reg a_in; wire b_out; test U1( .a(a_in), .b(b_out) ); ////////////// endmodule
上層文件:
module test_top( ////////////////// ); reg/wire a_in; wire b_out test U2( .a(a_in), .b(b_out) ); endmodule
小總結:在端口聲明中,一定是reg數據向外輸出,絕對不能出現數據向reg輸入。wire則隨便,可進可出。簡而言之就是reg只出不進,wire可出可進。
3、作用
reg和wire作為verilog操作的基本類型,在設計和激勵中都具有重要作用。了解這兩個類型的區別,可以有效地減少設計中出現端口聲明的錯誤現象發生。