verilog中wire和reg的区别,什么时候用wire?什么时候用reg?
相信很多和我一樣剛開始接觸verilog語言的小白都會有這樣的困惑,wire型變量和reg型變量到底有什么區別?什么情況下使用wire定義變量、什么情況下使用reg定義變量?下面就詳細分析兩者在使用中的區別。
1.wire和reg的本質是什么
wire的本質是一條沒有邏輯的連線,也就是說輸入時什么輸出也就是什么。wire型數據常用來表示以assign關鍵字指定的組合邏輯信號,模塊的輸入輸出端口類型都默認為wire型,wire相當于物理連線,默認初始值是z(高組態)。
如果你把wire定義的變量用在有邏輯性的語句中就會出現綜合錯誤:
例如:
在always語句中使用wire型定義的變量賦值,綜合器就會報錯。
reg型表示的寄存器類型,用于always模塊內被賦值的信號,必須定義為reg型,代表觸發器,常用于時序邏輯電路,reg相當于存儲單元,默認初始值是x(未知狀態)。reg型相對復雜些,其綜合后的輸出主要還看具體使用的場景:當在組合電路中使用reg,合成后的仍然是net網絡;當在時序電路中使用reg合成后的才是register。
2.wire和reg在硬件描述語言中的釋義
關于wire和reg在硬件描述語言中的釋義一般需要分為以下兩個部分來分析:
從電路綜合角度來說
(1)wire型變量綜合出來是一根導線
(2)reg型在always語句模塊中又分為兩種情況
(a) always后的敏感表中是(a or b or c)形式的,也就是不帶時鐘邊沿的,綜合出來還是組合邏輯
(b) always后的敏感表中是(posedge clk)形式的,也就是帶邊沿的,綜合出來一般是時序邏輯,會包含觸發器(Flip-Flop)
在設計中,輸入信號一般來說你是不知道上一級是寄存器輸出還是組合邏輯輸出,那么對于本級來說就是一根導線,也就是wire型。而輸出信號則由你自己來決定是組合邏輯輸出還是寄存器輸出,wire型、reg型都可以。但一般的,整個設計的外部輸出(即最頂層模塊的輸出),要求是寄存器輸出,較穩定、扇出能力也較好。
從仿真分析角度來說
wire對應于連續賦值,如assign
reg對應于過程賦值,如always,initial
3.什么情況下使用wire型變量
(1)assign 語句中變量需要定義成wire型,使用wire必須搭配assign
例如:
reg a,b;
wire result;
…
assign result =a&&b;
你可以試試把wire定義成reg,綜合器會報錯。
(2)元件例化時候的輸出必須用wire
例如:
wire dout;
ram u_ram
(
…
.out(dout)
…
);
(3)input、output和inout的預設值都是wire
4.什么情況下使用reg型變量
(1)變量放在begin……end之內必須使用reg變量
(2)在initial語句中使用
總結
以上是生活随笔為你收集整理的verilog中wire和reg的区别,什么时候用wire?什么时候用reg?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于MIG控制器的DDR3读写控制详解
- 下一篇: Vivado simulation使用简