verilog中wire與reg類型的區別

 每次寫verilog代碼時都會考慮把一個變量是設置爲wire類型仍是reg類型,所以把網上找到的一些關於這方面的資料整理了一下,方便之後查找。spa

        wire表示直通,即只要輸入有變化,輸出立刻無條件地反映;reg表示必定要有觸發,輸出纔會反映輸入。設計

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

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

        輸入端口能夠由wire/reg驅動,但輸入端口只能是wire;輸出端口可使wire/reg類型,輸出端口只能驅動wire;若輸出端口在過程塊中賦值則爲reg型,若在過程塊外賦值則爲net型。用關鍵詞inout聲明一個雙向端口, inout端口不能聲明爲reg類型,只能是wire類型;輸入和雙向端口不能聲明爲寄存器類型。it

 

       簡單來講硬件描述語言有兩種用途:一、仿真,二、綜合

對於wire和reg,也要從這兩個角度來考慮。


*********************************************************************************
從仿真的角度來講,HDL語言面對的是編譯器(如Modelsim等),至關於軟件思路。
這時:
wire對應於連續賦值,如assign
reg對應於過程賦值,如always,initial

*********************************************************************************
從綜合的角度來講,HDL語言面對的是綜合器(如DC等),要從電路的角度來考慮。
這時:
一、wire型的變量綜合出來通常是一根導線;
二、reg變量在always塊中有兩種狀況:
(1)、always後的敏感表中是(a or b or c)形式的,也就是不帶時鐘邊沿的,綜合出來仍是組合邏輯
(2)、always後的敏感表中是(posedge clk)形式的,也就是帶邊沿的,綜合出來通常是時序邏輯,會包含觸發器(Flip-Flop) 

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

相關文章
相關標籤/搜索