Verilog中定義訊號為什麼要區分wire和reg兩種型別

2021-04-28 02:32:45 字數 3331 閱讀 8371

1樓:何處安鑫

這是一個歷史遺留問題。在 verilog 被 cadence 買下之前(大約上e68a8462616964757a686964616f31333361313966世紀**十年代的樣子),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 重新命名也確實是在描述一種硬體行為。

verilog 中定義訊號為什麼要區分 wire 和 reg 兩種型別

2樓:

簡單來說硬體描述語言有兩種用途: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。

3樓:戰**

wire:線性訊號變數 reg為暫存器變數 input a,b,cin; 可推出 cin(wire) output sum,cout; 可推出 cout(wire/reg) module fadd(a,b,cin,sum,cout);呼叫如下: c1->a,c2->b,c3->cin,c4->sum,c5->count fadd m(c1,c2,c3,c4,c5); 可推出:

c3為input c5 為output c3(wire) c5(wire) 又因為 為內部呼叫 所以c3可以為:reg變數 綜上: cin(wire) cout(wire/reg) c3(wire/reg) c5(wire) 也請其他高人指點下

verilog 中定義訊號為什麼要區分 wire 和 reg 兩種型別

4樓:誒侖佬呈

首先要先清楚一點,verilog是硬體描述語言,其最終是為了生成一個電路,所以內它的變數型別是根據實際容電路來決定的。

從名字理解:

wire,線型,實際上在電路中的作用就是一根連線;

reg,暫存器型,在電路中就作為暫存器存在。

連線和暫存器是構成數位電路的基本結構,這也是verilog這兩種變數型別的**。

當然,在verilog的升級版system verilog中提供了更多的,更一些抽象化的變數型別

verilog 中定義訊號為什麼要區分 wire 和 reg 兩種型別

5樓:匿名使用者

兩者差別很大,抄完全襲

不能取消。

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

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

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

請教 verilog分頻中為什麼要有rst的輸入控制訊號

rst訊號的作用就是復位,使得分頻時鐘clk odd在fpga或cpld的復位過程中保持為0狀態,不會形成時鐘脈衝訊號,從而防止了由clk odd驅動的電路產生誤觸發。這是一種可靠性的做法,並不一定非得要有rst訊號,當然,如果沒有rst復位訊號,那麼你得保持在復位過程中,由clk odd驅動的訊號...

訊號為什麼要進行積分,為何要將調製訊號進行微分或者積分處理?

你是指bai 訊號的積分變換吧,du 我們現實中的訊號zhi都是時域中dao的,這些信版號對我們來說權比較熟悉,如正弦訊號。但這些時域訊號不好分析,計算量大 這可以從解時域微分方程中看出來 所以我們要尋求變換,開始是連續訊號的傅立葉變換,接著是廣泛的拉式變換,還有離散訊號的z變換。這些變換不僅使訊號...

顯示器無訊號,為什麼顯示器無訊號?

親親,您指的是什麼顯示器呢。提問。電腦顯示器。1 首先檢查電腦的外部接線是否接好,把各個連線重新插一遍,看故障是否排除。2 如果故障依舊,接著開啟主機箱檢視機箱內有無多餘金屬物,或主機板變形造成的短路,聞一下機箱內有無燒焦的糊味,主機板上有無燒燬的晶片,cpu周圍的 電容 有無損壞等。3 如果沒有,接著...