Re: [問題] 關於verilog signal&varieble問題

看板Electronics作者 (只想把你留在心中)時間16年前 (2009/04/12 00:05), 編輯推噓9(9041)
留言50則, 4人參與, 7年前最新討論串4/10 (看更多)
※ 引述《zxvc (修行)》之銘言: : ※ 引述《sasako (只想把你留在心中)》之銘言: : : 一個用法是用在sequential circuit的always中... : : ex:always(posedge clk or negedge n_rst) : : 另一個是用在combinational circuit的always中... : : ex:always(*) : non-blocking與blocking不是這樣分的。 : 都可以用來model sequential或combinational circuits。 : 例如: : module Test(d, c, e, f, b, a); : output reg d, c; : input e, f, b, a; : always@(*) : if(a == 1 & b == 1) : c = 1; : else : c = 0; : always@(*) : if(e == 1 & f == 1) : d <= 1; : else : d <= 0; : endmodule : c跟d都會合出AND gates。 : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ : 又如sequential circuit: : module Test(c, d, Clock , Reset1); : output reg [2:0] c; : output reg d; : input Clock, Reset1; : always@(posedge Clock) : if(Reset1) : c = 0; : else : begin : c = c+1; : if(c == 3) : d = 1; : else : d = 0; : end : endmodule : 這個用blocking的寫法會造成c = 3的那個(clock) cycle,d = 1。 : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 我這樣分,是希望在coding style大家能保持良好的習慣, 把sequential和combinational作分開,這樣在debug的時候 會比較容易.. 至於你上面寫的這個例子,個人認為就是一個bad example, c可以知道會合出DFF,且會是一個簡單的conuter.. 至於d他是一個combinational的電路,你將sequential和combinational 混在同一個always底下,的確還是可以合成,只是當在寫大電路時, 這就會造成debug上的困擾,至少我在初學者的時候,我曾經也是這樣 ,後來當程式寫得越多越大時,就會發現這樣的style實在是不好的... 或許剛開始大家可能為了交作業,只想function對就行了,但往後 程式開始複雜時,學長、老師的要求就會是整齊,把每個訊號分清楚, 加上註解,這樣以後再回頭看,自己還記得當初在寫什麼,交接學弟 時,至少不會讓人閱讀起來很痛苦... 而回到原作者一開始的問題,我覺得可以去參考一下CIC design compiler 那本教科書,他甚至舉完例子,還畫出了合成的示意圖,非常容易瞭解.. 而坊間的書多半都是解釋"<=" 就是在同時間一起動作,"="則是有次序的 動作,雖然是有次序,但在Wave上是看不出來,不過我的經驗是有時候寫 a=a+1; 與 b=a+1; 結果會是不一樣的... b=a+1; a=a+1; 我相信這每個人都會遲早會碰到..一開始會覺得很奇怪,不過等遇到時就 會開始注意,只能說debug真的是在累積錯誤的經驗...呵呵 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.103.42 ※ 編輯: sasako 來自: 220.135.103.42 (04/12 00:27)

04/12 01:19, , 1F
感謝^^
04/12 01:19, 1F

04/12 01:22, , 2F
所以 <= 是concurrent然後 =是sequential?
04/12 01:22, 2F

04/12 01:37, , 3F
我想這還是習慣的問題。我大學的時候的專題就是blocking一路
04/12 01:37, 3F

04/12 01:38, , 4F
用到底,最後還不是做出來了。
04/12 01:38, 4F

04/12 01:39, , 5F
(blocking assignment一路用到底)
04/12 01:39, 5F

04/12 01:41, , 6F
其中包括複雜的有限狀態機、sequential circuits。
04/12 01:41, 6F

04/12 01:43, , 7F
你舉的a=a+1...的例子。在我看來結果不一樣本來就是很正常的
04/12 01:43, 7F

04/12 01:55, , 8F
nonono..只有在某些情況才會不一樣
04/12 01:55, 8F

04/12 01:56, , 9F
你正常寫在always(*)底下 應該是會一樣的 這是verilog和
04/12 01:56, 9F

04/12 01:56, , 10F
C語言最大的不同點
04/12 01:56, 10F

04/12 01:58, , 11F
另外 你的習慣我不與置評 只是到了業界 習慣終究是會被學長
04/12 01:58, 11F

04/12 01:58, , 12F
糾正的
04/12 01:58, 12F

04/12 02:17, , 14F
verilog_blocking_nonblocking.html
04/12 02:17, 14F

04/12 02:18, , 15F
1F自己連起來吧 google搜尋這種資訊很多啦...
04/12 02:18, 15F

04/12 03:26, , 16F
我說的不一樣就是指在某些sequential circuits下的情況。
04/12 03:26, 16F

04/12 03:30, , 17F
如果你的coding style就是跟業界一樣,我也許會follow。(不過
04/12 03:30, 17F

04/12 03:31, , 18F
我不一定會去業界)
04/12 03:31, 18F

04/12 03:41, , 19F
我老師是比較開明loop generate跟for loop只要你寫得出來她都
04/12 03:41, 19F

04/12 03:42, , 20F
接受。
04/12 03:42, 20F

04/12 03:44, , 21F
另外你給的連結第三點觀念錯誤。continuous assignment跟
04/12 03:44, 21F

04/12 03:45, , 22F
non-blocking、blocking assignments一點關係都沒有。
04/12 03:45, 22F

04/12 03:46, , 23F
它是另外一種assignment。non-blocking與blocking assignment
04/12 03:46, 23F

04/12 03:48, , 24F
是procedure assignment (IEEE 1364-2005 Sec 6)。
04/12 03:48, 24F

04/12 03:49, , 25F
procedure assignment是用在reg、integer等data types。
04/12 03:49, 25F

04/12 03:50, , 26F
continouse assignment是用在wire之類的data types上。
04/12 03:50, 26F

04/12 03:51, , 27F
它們update values的方式也不太一樣(IEEE 1364-2005 Sec. 9.2
04/12 03:51, 27F

04/12 03:51, , 28F
)。
04/12 03:51, 28F

04/12 04:14, , 29F
continuous assignment是等號右邊出現的inputs一變,就
04/12 04:14, 29F

04/12 04:16, , 30F
evaluate與update,這通常用在model combinational circuits
04/12 04:16, 30F

04/12 04:18, , 31F
。procedure assignment的evaluation/update則往往受到
04/12 04:18, 31F

04/12 04:19, , 32F
sensitivity list的影響,它不總是等號右邊的inputs一有變化
04/12 04:19, 32F

04/12 04:21, , 33F
就evaluation/update。但always(*)就可以達到跟continuous
04/12 04:21, 33F

04/12 04:22, , 34F
assignment一樣的效果,所以它也可以用來model combinational
04/12 04:22, 34F

04/12 04:22, , 35F
circuits。
04/12 04:22, 35F

04/12 04:42, , 36F
另外我老師也是待過業界的。她建議(沒有強制)只要用
04/12 04:42, 36F

04/12 04:43, , 37F
non-blocking assignment就好,包括用always model
04/12 04:43, 37F

04/12 04:43, , 38F
combinational circuits。
04/12 04:43, 38F

04/12 04:45, , 39F
其實我覺得non-blocking assignment一個好用的地方在於用
04/12 04:45, 39F

04/12 04:45, , 40F
always model shift registers。
04/12 04:45, 40F

04/12 04:51, , 41F
其實用non-blocking或blocking assignment與always model
04/12 04:51, 41F

04/12 04:51, , 42F
combinational circuits的結果似乎是一樣的(我沒證明過)。
04/12 04:51, 42F

04/12 04:53, , 43F
不過用blocking可以做到non-blocking做不到的事,例如我之前
04/12 04:53, 43F

04/12 04:54, , 44F
在板上po的priority encoder就是利用blocking update的特性。
04/12 04:54, 44F

04/12 05:02, , 45F
抱欺我上兩句話有錯。我把那個priority encoder改成
04/12 05:02, 45F

04/12 05:03, , 46F
non-blocking assignment,結果也合出一樣的priority encoder
04/12 05:03, 46F

04/12 05:04, , 47F
可能non-blocking與blocking在always(*)情況下是等價的。
04/12 05:04, 47F

04/12 05:05, , 48F
(我指的是合出來的電路是等價的)
04/12 05:05, 48F

11/11 15:04, , 49F
用到底,最後還不是做出 https://noxiv.com
11/11 15:04, 49F

01/04 21:55, 7年前 , 50F
procedure a https://daxiv.com
01/04 21:55, 50F
文章代碼(AID): #19uB-_UD (Electronics)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文 (最舊先):
完整討論串 (本文為第 4 之 10 篇):
文章代碼(AID): #19uB-_UD (Electronics)