Verilog中wire與reg類型的區別


這是事轉載的一篇文章,覺得不錯,雖然中間有點小錯誤。

wire與reg類型的區別:

wire型數據常用來表示以assign關鍵字指定的組合邏輯信號。模塊的輸入輸出端口類型都默認為wire型。默認初始值是z

reg型表示的寄存器類型。always模塊內被賦值的信號,必須定義為reg型,代表觸發器。

默認初始值是x。

reg相當於存儲單元,wire相當於物理連線

Verilog 中變量的物理數據分為線型和寄存器型。這兩種類型的變量在定義時要設置位寬,缺省為1位。變量的每一位可以是0,1,X,Z。其中x代表一個未被預置初始狀態的變量或者是由於由兩個或多個驅動裝置試圖將之設定為不同的值而引起的沖突型線型變量。z代表高阻狀態或浮空量。

線型數據包括wire,wand,wor等幾種類型在被一個以上激勵源驅動時,不同的線型數據有各自決定其最終值的分辨辦法。

兩者的區別是:寄存器型數據保持最后一次的賦值,而線型數據需要持續的驅動

 

輸入端口可以由net/reg驅動,但輸入端口只能是net,如a = b & c,輸入端口a 只能是net型,但其驅動b,c可以是net/reg型;輸出端口可以使net/reg類型,輸出端口只能驅動net,如a = b & c,模塊的輸出端口b,c可以是net/reg型,但它們驅動的a必須是net型;若輸出端口在過程塊(always/initial)中賦值則為reg型,若在過程塊外賦值則為net型。用關鍵詞inout聲明一個雙向端口, inout端口不能聲明為寄存器類型,只能是net類型。

 

wire表示直通,即只要輸入有變化,輸出馬上無條件地反映;reg表示一定要有觸發,輸出才會反映輸入。

不指定就默認為1位wire類型。專門指定出wire類型,可能是多位或為使程序易讀。wire只能被assign連續賦值,reg只能在initial和always中賦值。wire使用在連續賦值語句中,而reg使用在過程賦值語句中。

在連續賦值語句中,表達式右側的計算結果可以立即更新表達式的左側。在理解上,相當於一個邏輯之后直接連了一條線,這個邏輯對應於表達式的右側,而這條線就對應於wire。在過程賦值語句中,表達式右側的計算結果在某種條件的觸發下放到一個變量當中,而這個變量可以聲明成reg類型的。根據觸發條件的不同,過程賦值語句可以建模不同的硬件結構:如果這個條件是時鍾的上升沿或下降沿,那么這個硬件模型就是一個觸發器;如果這個條件是某一信號的高電平或低電平,那么這個硬件模型就是一個鎖存器;如果這個條件是賦值語句右側任意操作數的變化,那么這個硬件模型就是一個組合邏輯。

wire型的變量綜合出來一般是一根導線;

reg變量在always塊中有兩種情況:    always后的敏感表中是(a or b or c)形式的,也就是不帶時鍾邊沿的,綜合出來還是組合邏輯   always后的敏感表中是(posedge clk)形式的,也就是帶邊沿的,綜合出來一般是時序邏輯,會包含觸發器(Flip-Flop)

在設計中,輸入信號一般來說你是不知道上一級是寄存器輸出還是組合邏輯輸出,那么對於本級來說就是一根導線,也就是wire型。而輸出信號則由你自己來決定是寄存器輸出還是組合邏輯輸出,wire型、reg型都可以。但一般的,整個設計的外部輸出(即最頂層模塊的輸出),要求是寄存器輸出,較穩定、扇出能力也較好。

 

Notes:七七八八的也看不太懂,總之wire賦值用assign,reg在always內使用。


免責聲明!

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



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