Verilog 中定義信號為什麼要區分 wire 和 reg 兩種類型?

Verilog 中,過程賦值語句要定義成 reg,連續賦值語句要定義成 wire,而且定義為 reg 不一定真的綜合出register(也可能是純組合邏輯),wire也不一定真的是 wire(也可能是 register)。既然如此,為何 Verilog 語法中要區分 wire 和 reg 呢?至今都沒想明白有什麼必要(除了製造出一些語法錯誤)。


兩者差別很大,完全不能取消。

在Verilog中,wire永遠是wire,就是相當於一條連線,用來連接電路,不能存儲數據,無驅動能力,是組合邏輯,只能在assign左側賦值,不能在always @ 中賦值;

reg可以綜合成register,latch,甚至wire(當其只是中間變數的時候),可以用於組合邏輯或者時序邏輯,能存儲數據,有驅動能力,在always @模塊表達式左側被賦值。

兩個共同具有性質:都能用於assign與always @模塊表達式的右側。

-----------------------------------------------------------------------------

看到一篇講兩者區別的很棒的文章http://inst.eecs.berkeley.edu/~cs150/Documents/Nets.pdf

等有空上傳一張Synopsys DC中將reg綜合成wire的綜合結果圖吧。


我對「雖然reg不一定綜合出來register,但這屬於綜合工具對代碼描述的硬體行為的一種解讀」不是很同意的,綜合工具在一定的程度上就是反應你的設計意圖,至於為什麼不想要的結構,原因有二:其一是你代碼寫的規範;其二你沒有理解你的代碼會綜合出什麼硬體的預期。例如我定義:

reg a ;

reg b;

always@ (*) begin

if (&)

a = tmp ;

b = a ;

end

在這段代碼中a是不會綜合出寄存器的,而b卻會,原因在於a是中間變數,就是一條線,所以綜合出來的不是寄存器,而是一條線。而在condtion不滿足的情況下b要保值,所以b會綜合成寄存器。絕不是綜合工具對代碼描述的硬體行為的一種解讀。

=================

wire也不一定真的是 wire(也可能是 register)這是絕對不可能發生的事情。從verilog的語言上講只有值和語句的關係。值分成常量和變數兩種,而常量是用過wire類型來體現的,這種情況下wire是直接接到高低電平上的,所以不可能是寄存器;再者語句分為過程語句和連續賦值語句,而連續賦值語句是一定不會綜合出寄存器的,因為他會馬上被引用,沒有機會保值;而過程語句大家都知道賦值的變數一定是reg類型的,所以這種情況也被否決掉了。綜上所述「wire也可能是 register」這是絕對不可能發生的事情。


謝邀。實在不好意思拖延症又犯了,這麼久才回答。

這是一個歷史遺留問題。在 Verilog 被 Cadence 買下之前(大約上世紀八九十年代的樣子),Verilog 只是一個用來做模擬的 HDL,不可綜合。在那個年代,模擬器看到 wire 和 reg 會區別處理(實際上至今也是這樣)。不知道你有沒有發現,reg 類型信號的跳變,是依靠輸入和敏感列表的,而且在非阻塞賦值中也存在一種並行的概念(同樣條件下 B &<= A、C &<= B 的時候,A 的值不會直接到 C 去)。而 wire 只需要輸入就足夠了。這樣區分兩種類型也是為了更好地模擬真實硬體中時序邏輯和組合邏輯的行為。

模擬器對 wire 類型會在每個 delta time 都進行計算並賦值,而 reg 類型只有在滿足敏感列表條件時才會計算。

而如今隨著 SV 的推出 Verilog 都已經到 2005 了,但當初的這一習慣繼承了下來。雖然 reg 不一定綜合出來 register,但這屬於綜合工具對代碼描述的硬體行為的一種解讀。always @ (*) 當中這個敏感列表依然存在,模擬器依然會依照敏感列表的指示去幹活,不論你的敏感列表是不是*。反過來看 wire,雖然 RTL 代碼中這個 wire 信號可能就是綜合後網表中某個寄存器的 Q 端,但是在行為級描述中你對這根 wire 重命名也確實是在描述一種硬體行為。

P.S. 其實我上學的時候一開始也有同樣的疑問。


請學習 systemverilog 2012

其實就是新版 verilog 換個名字

沒有multiple driven 就用 logic

有就用 wire

reg 很迷惑的 因為不一定會綜合成 寄存器


這學期剛學習了大規模集成電路,剛開始的時候也有題煮的疑惑,在此分享一點自己的理解,希望能幫到你。如果有不對的地方也希望大家指正。畢竟只是初學者為了應付考試的理解~

首先我理解的是,Verilog作為一門行為描述語言,你可以把每一段程序都理解為「用語言描述一個模塊」,而實際上,一個模塊的組成無非就是「引腳」+「內部的各種電路」。

有個這種準備之後就好理解wire 和 reg 了。Verilog中,把沒有定義類型的信號默認設置為wire,除非特殊聲明一次。如:

input[7:0] a, b;

reg [7:0] a;

以上例子,由於「input」就是模塊管腳的聲明,他有兩個管腳a,b,用作輸入。而再把a定義成寄存器類型,方便功能定義中進行操作。所以此時a 為reg型 b 為 默認wire 型。

所以說,可以粗略地把wire型理解為「從管腳輸入的、原始的信號序列」,他在導體上以電信號的形式流動,而把reg型理解為「用寄存器存著從管腳輸入的信號」,因為之後在寄存器中存住的數字信息,才能進行諸如移位、賦值等操作。

打個比方,你在一個房間里,房間有兩個水管,一個流入一個流出,你可以直接把水管的水從輸入管接到輸出管,但你就沒辦法用這些水了。如果你想用這些水來炒菜、洗澡、打水仗、等等,你就要用一個名為reg的盆去接水,這樣這些水才能被你用。


For system verilog, you can use logic for both wire and reg.


很簡單

你用verilog寫一個simulation的testbench

你會發現input永遠是reg,output永遠是wire

你再寫一個always block

你會發現output永遠是reg,說白了只有reg才能在always block裡面變值

附贈一張slide


看了young cc推薦的文章,在語法層面做個小總結,希望對大家有所幫助~~


因為verilog是硬體描述語言

你設計的是硬體電路

你設計的是硬體電路

你設計的是硬體電路

硬體電路,特別是時序硬體電路,裡面的基本構成:寄存器 邏輯門 連線


網路數據類型表示結構實體(例如門)之間的物理連接。網路類型的變數不能儲存值,而且它必需受到驅動器(例如門或連續賦值語句,assign)的驅動。如果沒有驅動器連接到網路類型的變數上,則該變數就是高阻的,即其值為z。常用的網路數據類型包括wire型和tri型。這兩種變數都是用於連接器件單元,它們具有相同的語法格式和功能。之所以提供這兩種名字來表達相同的概念是為了與模型中所使用的變數的實際情況相一致。 wire型變數通常是用來表示單個門驅動或連續賦值語句驅動的網路型數據,tri型變數則用來表示多驅動器驅動的網路型數據。如果wire型或tri型變數沒有定義邏輯強度(logic strength) ,在多驅動源的情況下, 邏輯值會發生衝突從而產生不確定值。

====================================================

wire型數據常用來表示用於以assign關鍵字指定的組合邏輯信號。Verilog程序模塊中輸入輸出信號

類型預設時自動定義為wire型。wire型信號可以用作任何方程式的輸入,也可以用作「assign」語句

或實例元件的輸出。

====================================================

寄存器是數據儲存單元的抽象。 寄存器數據類型的關鍵字是reg.通過賦值語句可以改變寄存器儲存的值,其作用與改變觸發器儲存的值相當。Verilog HDL語言提供了功能強大的結構語句使設計者能有效地控制是否執行這些賦值語句。這些控制結構用來描述硬體觸發條件,例如時鐘的上升沿和多路器的選通信號。在行為模塊介紹這一節中我們還要詳細地介紹這些控制結構。reg類型數據的預設初始值為不定值x。

=====================================================

別想那麼複雜,好好體會。

學而不思則罔,思而不學則殆。

=====================================================

以上摘自《夏宇聞Verilog經典教程》


你在哪本書看到wire也能綜合出register的?看我不打死那個作者。

本質上為什麼要有reg和wire,因為電路需要有記憶性的單元(比如FF)以及無記憶性的單元(比如導線)

reg可以合成導線的前提是這個過程塊是描述組合邏輯的,那就不需要記憶性單元了。

但是如果條件分支沒寫全就會合出latch

所以在systemverilog裡面都統一定義成logic就好了,非常適合啥都不懂的小白


題主思考的很對,確實沒有必要。

所以在 SystemVerilog 中引入了 logic 類型,完全不需要 wire 和 reg 類型即可進行設計。但是作為designer而言,內心是要 wire 與 reg,組合邏輯與時序邏輯 的區分的,你需要知道你寫出來的代碼哪部分只是wire,哪部分則是reg,哪部分會綜合成組合邏輯,哪部分又會綜合成時序邏輯。即從硬體的角度是思考設計代碼。


1.

「」wire也不一定真的是 wire(也可能是 register)」 這個是要毀我三觀嗎?!!!!

reg型可能會綜合成wire,wire絕對不可能綜合成register。在elaborate階段就會報錯。

2.

verilog為什麼會有wire和reg型。首先回答一個問題,verilog是什麼?

verilog是一種HDL, hardware description language,硬體描述語言。

他的目的就是為了描述硬體的行為的。硬體裡面有什麼,verilog語言就需要建模什麼。這個是核心。verilog描述一個硬體的物質世界的抽象語言。

那我們看看硬體裡面有什麼,不就是金屬線連接一些MOS管嗎? Ok, 金屬線用什麼描述,wire型。那個數字電路中最基本的單元D 觸發器用什麼呢? reg型。

3. 為什麼申明的reg型,綜合出來有可能是wire型。

綜合工具會根據你語言描述的上下文去推斷電路結構,在自己的通用庫也就是GTECH庫中尋找基本的單元去替換verilog的語言描述。比如:

reg a;

assign a=b|c;

綜合工具一看這裡a是一個電平觸發的,不是時鐘沿觸發,這裡不需要D flip flop。然後再看後面,喔,這是一個或門。然後從GTECH庫中找一個或門出來。

至於為什麼reg可以有wire的行為,但是wire卻沒有reg的行為,IEEE 協議是這樣規定的,綜合工具就要按照IEEE來。detail原因我也不知道。


reg 只能在always或者initial裡面賦值,而wire可以用assign賦值。這是語法區別,設計上靈活的選用。綜合只是工具去理解你的設計意圖。


Hardware description languages need the concept of a wire. - Janick Bergeron

The variable is sufficient for ordinary sequntial programming languages.When desribing hardware, a construct that describe the behavior of a wire used to connect multiple devices together must be provided.

希望對你有幫助


推薦閱讀:

如何評價英偉達發布的 Tesla V100 計算卡?
片上網路NoC為何還沒有得到實際應用?
集成電路的工作原理是什麼?
人類歷史上第一個集成電路使用什麼儀器製作的?
集成電路晶元電極如何引出來?

TAG:現場可編輯邏輯門陣列FPGA | 微電子 | 晶元集成電路 | 數字電路 | Verilog |