verilog之wire和reg


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操作的基本類型,在設計和激勵中都具有重要作用。了解這兩個類型的區別,可以有效地減少設計中出現端口聲明的錯誤現象發生。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM