verilog HDL中wire和reg的區別

wire表示直通,即輸入有變化,輸出馬上無條件地反映(如與、非門的簡單連接)。

reg表示一定要有觸發,輸出纔會反映輸入的狀態。

reg相當於存儲單元,wire相當於物理連線。reg表示一定要有觸發,沒有輸入的時候可以保持原來的值,但不直接實際的硬件電路對應。

      兩者的區別是:寄存器型數據保持最後一次的賦值,而線型數據需要持續的驅動。wire使用在連續賦值語句中,而reg使用在過程賦值語句(initial ,always)中。wire若無驅動器連接,其值爲z,reg默認初始值爲不定值 x 。

     在連續賦值語句中,表達式右側的計算結果可以立即更新表達式的左側。在理解上,相當於一個邏輯之後直接連了一條線,這個邏輯對應於表達式的右側,而這條線就對應於wire。

在過程賦值語句中(比如always語句),表達式右側的計算結果在某種條件的觸發下放到一個變量當中,而這個變量可以聲明成reg類型的,根據觸發條件的不同,過程賦值語句可以建模不同的硬件結構:如果這個條件是時鐘的上升沿或下降沿,那麼這個硬件模型就是一個觸發器;如果這個條件是某一信號的高電平或低電平,那麼這個硬件模型就是一個鎖存器;如果這個條件是賦值語句右側任意操作數的變化,那麼這個硬件模型就是一個組合邏輯

 對組合邏輯輸出變量,可以直接用assign。即如果不指定爲reg類型,那麼就默認爲1位wire類型,故無需指定1位wire類型的變量。當然專門指定出wire類型,可能是多位或爲使程序易讀。wire只能被assign連續賦值,reg只能在initial和always中賦值。

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

  默認信號是wire類型,reg類型要申明。這裏所說的默認是指輸出信號申明成output時爲wire。如果是模塊內部信號,必須申明成wire或者reg.

      對於always語句而言,賦值要申明成reg,連續賦值assign的時候要用wire。

模塊調用時 信號類型確定方法總結如下:

 

•信號可以分爲端口信號內部信號。出現在端口列表中的信號是端口信號,其它的信號爲內部信號。

對於端口信號,輸入端口只能是net類型。輸出端口可以是net類型,也可以是register類型。若輸出端口在過程塊中賦值則爲register類型;若在過程塊外賦值(包括實例化語句),則爲net類型。

•內部信號類型與輸出端口相同,可以是net或register類型。判斷方法也與輸出端口相同。若在過程塊中賦值,則爲register類型;若在過程塊外賦值,則爲net類型。

若信號既需要在過程塊中賦值,又需要在過程塊外賦值。這種情況是有可能出現的,如決斷信號。這時需要一箇中間信號轉換

 

 

 

下面所列是常出的錯誤及相應的錯誤信息(error message)

•用過程語句給一個net類型的或忘記聲明類型的信號賦值。

           信息:illegal …… assignment.

•將實例的輸出連接到聲明爲register類型的信號上。

           信息: has illegal output port specification.

•將模塊的輸入信號聲明爲register類型。

           信息:incompatible declaration,  ……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章