【轉】【學】wire與reg的區別?什麼時候用wire?什麼時候用reg?

簡單來說硬件描述語言有兩種用途:1、仿真,2、綜合。
對於wire和reg,也要從這兩個角度來考慮。
*********************************************************************************
從仿真的角度來說,HDL語言面對的是編譯器(如Modelsim等),相當於軟件思路。
這時:
wire對應於連續賦值,如assign
reg對應於過程賦值,如always,initial
*********************************************************************************
從綜合的角度來說,HDL語言面對的是綜合器(如DC等),要從電路的角度來考慮。
這時:
1、wire型的變量綜合出來一般是一根導線;
2、reg變量在always塊中有兩種情況:
(1)、always後的敏感表中是(a or b or c)形式的,也就是不帶時鐘邊沿的,綜合出來還是組合邏輯
(2)、always後的敏感表中是(posedge clk)形式的,也就是帶邊沿的,綜合出來一般是時序邏輯,會包含觸發器(Flip-Flop)
在設計中,輸入信號一般來說你是不知道上一級是寄存器輸出還是組合邏輯輸出,那麼對於本級來說就是一根導線,也就是wire型。而輸出信號則由你自己來決定是寄存器輸出還是組合邏輯輸出,wire型、reg型都可以。但一般的,整個設計的外部輸出(即最頂層模塊的輸出),要求是寄存器輸出,較穩定、扇出能力也較好。

爲什麼在verilog中要定義wire?

有幾種情況變量需要定義成wire。
第一。assign 語句
例如:
reg a,b;
wire and_result;
...
assign and_result =a&&b;
你可以試試把wire定義成reg。綜合器會報錯。
第二。元件例化時候的輸出必須用wire
例如:
wire dout;
ram u_ram
(
...
.out(dout)
...
);
wire按照國外的教材上面的定義:
wire爲無邏輯連線。只做連線,wire本身是不帶邏輯性的,所以輸入什麼輸出就是什麼。所以你嘗試着用always語句對wire變量賦值。綜合器就會報錯。
那麼你可能會問。assign c =a&&b不是就是對wire的賦值嗎?
其實並非如此。綜合器綜合時將a&&b綜合成ab經過一個與門。而c只是連接到與門輸出的線。正真綜合出與門的是&&。而不是c。

Abstract
Verilog初學者最常見的問題:『什麼時候該用wire?什麼時候又該用reg?』

Introduction
大體上來說,wire和reg都類似於C/C++的變數,但若此變數要放在begin...end內,該變數就須使用reg,在begin...end之外,則使用wire。
另外使用wire時,須搭配assign;reg則不必。
input,ouput,inout預設值都是wire。

若wire和reg用錯地方,compiler都會提醒,所以不必太擔心。
一個很重要的觀念,在Verilog中使用reg,並不表示合成後就是暫存器(register)。若在組合電路中使用reg,合成後仍只是net,唯有在循序電路中使用reg,合成後才會以flip-flop形式表示成register。

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