為什麼在verilog中要定義wire

時間 2021-05-07 19:59:54

1樓:

有幾種情況變數需要定義成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。

2樓:一諾千金丨

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

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

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

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

3樓:

這個,wire通俗的理解就是線,難道你在設計電路的時候不需要用線將各個設計模組或者設計模組的內部訊號連線起來~????

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

4樓:

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

5樓:戰**

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[7,0]a;跟wire[8,1]a;第二個數字是什麼意思? 是一樣的嗎?為什麼有這樣的表示?

6樓:匿名使用者

首先要指出的是wire[7,0]a和wire[8,1]a這樣的表達在verilog中是錯誤的,應該寫成wire[7:0]a和wire[8:1]a

wire[7:0]a表示定義了一個wire型資料,該資料由8位的二進位制陣列成,該資料的

第1位表示為wire[7]

第2位表示為wire[6]

. .

. .

. .

第8位表示為wire[0]

這樣,你在程式中就不能出現像wire[8]這樣的表達同理wire[8:1]a表示定義了一個wire型資料,該資料由8位的二進位制陣列成,該資料的

第1位表示為wire[8]

第2位表示為wire[7]

. .

. .

. .

第8位表示為wire[1]

這樣,你在程式中就不能出現像wire[0]這樣的表達希望我能幫助到你。

——medied.lee

verilog中wire一般什麼時候應用?

7樓:光環國際

有幾種情況變數需要定義成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。

8樓:

wire就是導線啊. verilog中有顯性定義和隱性定義的區別. 好比protel裡畫電路, 有些導線上你標了d0, d1, ...

有些導線你沒標, 自動賦了n03781096, 不宣告不等於它不需要或不存在, 事實上大量存在. 在verilog裡面, 你可以用wire 宣告特定的導線名稱, 多用於testbench互聯(即無寄存的直連). 我以前用它(alias)做倒序轉化後賦值給一組reg, 可以精簡**.

9樓:手機使用者

要在always模組裡賦值,必須是暫存器變數。要用assign賦值,必須是wire型。output自動就是wire型。不知道說清楚了麼

10樓:手機使用者

輸出變數如果沒有特別宣告,預設是wire型;

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

11樓:何處安鑫

這是一個歷史遺留問題。在 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 重新命名也確實是在描述一種硬體行為。

在C中何為引數,引數的定義是什麼

引數一般出現在方法裡面。如 public void get string str,int age 在get後面的括號裡,就是形參,引數可以有很多中,具體情況需要結合實際的需求,去定義有效的引數,如果能幫助到樓主,請採納,萬分感謝 引數是用來傳遞資料的。以下是是本人學習筆記 不同型別的引數傳遞 如果需...

在象棋中, 車 為什麼要念作 ju 呢

象棋誕生的時候,車是讀j 的,然後作為象棋的專有名詞傳了下來。車,是漢代才讀ch 的,此前的讀音只有j 漢代劉熙載 釋名 車,古者曰車,聲如居,言行所以居人也。今曰車,車,舍也,行者所出,若車舍也。劉熙載的意思是 車既可以看成行人 居 住的處所,也可看成行人出入的房 舍 漢代以前 古者 讀j 是取前...

函式中能定義區域性static變數嗎,為什麼不行

凌培勇 為什麼你要在函式裡定義static呢,statis 是類變數,在類初始化的時候就要載入 這跟jvm執行機制有關,定義static之後表明在執行程式前,就要自動對其進行初始化,你的static變數寫在了非static方法中,jvm不會在程式執行前就初始化這個方法,但是裡面又包含了需要初始化的變...