verilog HDL中wire和reg的區別

2021-10-09 06:42:40 字數 1643 閱讀 2405

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

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

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

兩者的區別是:暫存器型資料保持最後一次的賦值,而線型資料需要持續的驅動。wire使用在連續賦值語句中,而reg使用在過程賦值語句(initial ,always)中。wire若無驅動器連線,其值為z,reg預設初始值為不定值 x 。

在連續賦值語句中,表示式右側的計算結果可以立即更新表示式的左側。在理解上,相當於乙個邏輯之後直接連了一條線,這個邏輯對應於表示式的右側,而這條線就對應於wire。在過程賦值語句中,表示式右側的計算結果在某種條件的觸發下放到乙個變數當中,而這個變數可以宣告成reg型別的。根據觸發條件的不同,過程賦值語句可以建模不同的硬體結構:如果這個條件是時鐘的上公升沿或下降沿,那麼這個硬體模型就是乙個觸發器;如果這個條件是某一訊號的高電平或低電平,那麼這個硬體模型就是乙個鎖存器;如果這個條件是賦值語句右側任意運算元的變化,那麼這個硬體模型就是乙個組合邏輯。

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

輸入埠可以由wire/reg驅動,但輸入埠只能是wire;輸出埠可以是wire/reg型別,輸出埠只能驅動wire;若輸出埠在過程塊中賦值則為reg型,若在過程塊外賦值則為net型(wire/tri)。

預設訊號是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, ……

Verilog中wire和reg的區別

wire為無邏輯線,本身只做連線,不帶邏輯,輸入什麼就是什麼。用always語句對wire語句賦值,綜合就會報錯。1 assign 語句 例如 reg a,b wire and result assign and result a b 2 原件例化必須用wire 例如 wire dout ram u...

Verilog中Wire 和 Reg 的區別

wire 和reg是verilog程式裡的常見的兩種變數型別,他們都是構成verilog程式邏輯最基本的元素。正確掌握兩者的使用方法是寫好verilog程式的前提。但同時,因為他們在大多數程式語言中不存在,很多新接觸verilog語言的人並不能很清楚的區別兩種變數的不同之處。這裡簡單對他們做乙個比較...

FPGA中wire與reg型別的區別

wire表示直通,即只要輸入有變化,輸出馬上無條件地反映 reg表示一定要有觸發,輸出才會反映輸入。不指定就預設為1位wire型別。專門指定出wire型別,可能是多位或為使程式易讀。wire只能被assign連續賦值,reg只能在initial和always中賦值。wire使用在連續賦值語句中,而r...