reg和wire的不同以及編寫測試檔案的差別

2021-10-07 18:39:55 字數 1569 閱讀 4311

wire是連線,baireg是暫存器

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。

怕自己忘掉所以在此記錄一下

wire和reg之間的差異

abstract verilog初學者最常見的問題 什麼時候該用wire?什麼時候又該用reg?大體上來說,wire和reg都類似於c c 的變數,但若此變數要放在begin end內,該變數就須使用reg,在begin end之外,則使用wire。若wire和reg用錯地方,compiler都會提...

verilog HDL中wire和reg的區別

wire表示直通,即輸入有變化,輸出馬上無條件地反映 如與 非門的簡單連線 reg表示一定要有觸發,輸出才會反映輸入的狀態。reg相當於儲存單元,wire相當於物理連線。reg表示一定要有觸發,沒有輸入的時候可以保持原來的值,但不直接實際的硬體電路對應。兩者的區別是 暫存器型資料保持最後一次的賦值,...

Verilog中wire和reg的區別

wire為無邏輯線,本身只做連線,不帶邏輯,輸入什麼就是什麼。用always語句對wire語句賦值,綜合就會報錯。1 assign 語句 例如 reg a,b wire and result assign and result a b 2 原件例化必須用wire 例如 wire dout ram u...