Wire與Reg的使用方式測試報告

2021-06-21 01:36:27 字數 3531 閱讀 6221

測試項

語法測試結果 說明

組合:=(assign/initial/always_with_no_clk)

assign用且僅用=,左值用且僅用wire

initial和always左值用且僅用reg,=和<=都可以,但是一般情況下,組合用=,時序用<=

時序:<=

(always_with_clk)

assign

assign只能用=,只能對wire

reg用於且僅用於always、initial的左值;

wire用於且僅用於assign的左值。

assign:只要右邊表示式任乙個變數有變化,表示式立即被計算,計算的結果立即賦給左邊訊號。也即assign行為上等價於組合always。

always

always不管敏感量是posedge(時序邏輯)或者是乙個訊號(組合邏輯):

可以用<=,也可以用=;

always裡面賦值的左值必須是reg。

initial

initial跟always一樣

可以用<=,也可以用=;

initial裡面賦值的左值必須是reg。

wire初值

wire不可以賦初值,但是可以賦初reg

wire w1=1'b0,w2;不合法

但是 reg r2;

wire w1=r2,w2;合法

reg可賦初值

reg可以賦初值

reg r1=1'b0,r2;合法

綜上,得到的基本概念用圖形描述如下:

l  注1:右側組合邏輯使用=,時序邏輯使用<=:是經驗法則,否則容易導致綜合出來的電路功能不合乎要求。

l  注2:其他的是語法要求,不按照做會出語法錯誤。

測試項

語法測試結果 說明

wire可做右值給reg

語法正確

always reg<=wire//clk

always reg=wire//no_clk

wire可做右值給wire

語法正確

assign wire=wire

reg可做右值給wire

語法正確

assign wire=reg

reg可做右值給reg

語法正確

always reg<=reg//clk

always reg=reg//no_clk

reg可用常數驅動

語法正確

always reg<=1』b0//clk

always reg=1』b0//no_clk

wire可用常數驅動

語法正確

assign wire<= 1』b0

測試項語法測試結果 說明

wire可做in埠

語法正確

input wire rstw

reg可做in埠

語法錯誤

input reg rstr

wire可做out埠

語法正確

output wire outw

reg可做out埠

語法正確

output reg outr

wire可做inout埠

語法正確

reg可做inout埠

語法錯誤

input和inout只能是wire,output可以使reg或者wire。

測試項

語法測試結果 說明

wire可做例化的input的wire

語法正確

目前的實驗說明:

對於module的input,使用wire和reg都可以,功能上沒有一點區別;

對於module的output,只能使用wire。

reg可做例化的input的wire

語法正確

wire可做例化的output的wire

語法正確

wire可做例化的output的reg

語法正確

reg可做例化的output的reg

語法錯誤

reg可做例化的output的wire

語法錯誤

wire肯定描述組合邏輯;reg有可能描述組合,也有可能描述時序。電路的行為從組合還是時序上就可以判斷出來。

對於例化的模組,輸入根據情況使用reg或wire(靈活起見,使用reg,這樣能夠用always實現組合或時序的賦值;但是,如果兩模組互聯,那麼都是用wire就會省事),輸出使用wire。

把3和4兩個測試結合起來,如圖所示:

簡化記憶:外面的輸入(源)可以使reg或wire,但是裡面只能用wire接收(目的地);裡面的輸出(源)可以使reg或wire,但是外面只能用wire接收(目的地)。

1、行為上:

wire或是reg並不會導致電路行為的改變,而是組合邏輯還是時許邏輯改變了電路的行為。加上reg或是wire並沒有影響電路,電路並不會因為加上了乙個reg而改變,而是有clk的always中的reg才會影響電路。

2、語法上:(埠和例化)

源是reg和wire,目的地是wire。

3、語法上:(做右值)

wire和reg在任何情況下都可以做右值,也即在左值允許的情況下可以相互賦值。

4、語法上:(做左值)

wire僅用於assign,reg僅用於initial和always。

5、語法上:(初始化)

wire在宣告的時候(可以用reg、wire初始化,不可以用常數)初始化。

reg在宣告的時候(可以用reg、wire、常數)初始化。

列表如下:專案

wire

reg埠和例化

可以做源、目的地

只能作源

做右值 可以

做左值assign

initial和always

宣告時初始化

可以用reg、wire、常數,但是最好不要初始化wire,否則在綜合的時候可能會報錯:multi-driver。

只能用常數

但是,初始化時不能再一行宣告多個變數.即:不允許wire w1=1』b0,w2;但是可以wire w1=1』b0;wire w2;

assign

initial和always

賦值符用且僅用=

=和<=都可以,但是一般情況下,組合用=,時序用<= 左值

左值用且僅用wire

左值用且僅用reg

描述電路型別 組合

initial:組合

always:組合或時序

(有@(posedge clk)的才是時序,否則都是組合)

1、一般情況下,要將乙個模組的所有輸入設為wire,將輸出設為wire和reg都行。

但是,當輸出用assign賦值或者作為其子模組的輸出時,必須為wire。

2、模組埠的output和input訊號,在模組內部都是可讀的。可作為右值,可以

FPGA中wire與reg型別的區別

wire表示直通,即只要輸入有變化,輸出馬上無條件地反映 reg表示一定要有觸發,輸出才會反映輸入。不指定就預設為1位wire型別。專門指定出wire型別,可能是多位或為使程式易讀。wire只能被assign連續賦值,reg只能在initial和always中賦值。wire使用在連續賦值語句中,而r...

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表示一定要有觸發,沒有輸入的時候可以保持原來的值,但不直接實際的硬體電路對應。兩者的區別是 暫存器型資料保持最後一次的賦值,...