2016-04-10 79 views
0

當我正在做作業時,我對reg和wire感到困惑。我無法準確理解reg和wire之間的差異。你能解釋一下嗎?另外,我想知道當我使用output q而不是output reg q時會發生什麼?什麼時候應該使用reg而不是電線?

+0

@Qui我不敢相信這個問題以前沒有問過,但找不到這樣的事情。我發現你提到的問題,並不認爲它是重複的。 –

+1

http://stackoverflow.com/questions/29965504/difference-between-wire-and-reg –

+1

http://stackoverflow.com/questions/33459048/what-is-the-difference-between-reg-and-wire -in-a-verilog-module –

回答

2

模擬,一個的Verilog wire行爲就像一塊金屬,軌道,絲,而一個的Verilog reg是一個變量,它是存儲*。

他們在模擬中的區別可以通過顯示如果我從多個位置分配給他們來說明。如果我從一個以上的地方分配到wire,那麼仿真的行爲就好像我將這兩條電線短接在一起。所以,

wire w; 
assign w = 1'b1; 
assign w = 1'b0; 
initial 
    $display("w= %b", w); 

將顯示xw的值將爲x,因爲一個assign正在驅動1'b1和另一個1'b0,所以這將使解決x。通過這種方式,它正在模擬真實硬件的行爲,其中x代表未知的值(一個驅動器實際導線驅動值較高,另一個驅動器驅動較低的值實際上未知)。

如果我分配給reg - 一個變量 - 來自多個地方,我會得到不同的行爲。代替解析爲xreg將僅取最後指定的任何值。所以,

reg r; 

initial 
    r = 1'b1; 

initial 
    r = 1'b0; 

initial 
    #1 $display("r= %b", r); 

將顯示任一10取決於其初始塊執行最後一個(一些不確定性的)上。

請注意,reg是由initial塊驅動的。 A reg必須由initialalways塊(所謂的程序代碼)驅動。假設您正在編寫Verilog,而不是System Verilog,則不能從assign語句或實例化模塊的輸出分配reg。所以,如果你想從程序代碼中分配某些東西,你必須使用reg;如果要從assign語句或實例化模塊的輸出分配某些內容,則必須是wire因此,您是否將output定義爲regwire完全取決於您指定的位置。如果你從always塊中分配給它,它需要是reg;如果您從assign語句或實例化模塊的輸出分配給它,則它需要是wire

這就是模擬中regwire行爲的差異。你的合成器將以不同的方式解釋reg。如果你從一個以上的always塊(不能合成initial塊)中分配一個reg,那麼你的邏輯合成器將合成兩塊硬件,驅動同一塊金屬,軌道,導線,不管 - 你可能不需要的東西 - 不想要。

*那意味着reg將合成時必然成爲存儲(即觸發器)。 「reg」變成觸發器還是組合邏輯取決於它是以順序組合式還是組合式總是分配的。

+1

請注意,'reg'不支持存儲如果'always'模塊實現組合邏輯,則總是分配給'reg'。在這種情況下,'reg'就像一個連續分配的'wire',實現相同的功能。順便說一句。如果可能的話,考慮使用SystemVerilog邏輯類型,因爲這會合並'wire'和'reg',因此您不必根據實現來更新聲明。 –

0

輸出q相當於輸出線q。

reg用於順序邏輯,如觸發器。即使對於組合塊,它也總是需要*塊。 電線用於組合邏輯。

相關問題