看板 Electronics 關於我們 聯絡資訊
※ 引述《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)
n052111089:感謝^^ 04/12 01:19
n052111089:所以 <= 是concurrent然後 =是sequential? 04/12 01:22
zxvc:我想這還是習慣的問題。我大學的時候的專題就是blocking一路 04/12 01:37
zxvc:用到底,最後還不是做出來了。 04/12 01:38
zxvc:(blocking assignment一路用到底) 04/12 01:39
zxvc:其中包括複雜的有限狀態機、sequential circuits。 04/12 01:41
zxvc:你舉的a=a+1...的例子。在我看來結果不一樣本來就是很正常的 04/12 01:43
sasako:nonono..只有在某些情況才會不一樣 04/12 01:55
sasako:你正常寫在always(*)底下 應該是會一樣的 這是verilog和 04/12 01:56
sasako:C語言最大的不同點 04/12 01:56
sasako:另外 你的習慣我不與置評 只是到了業界 習慣終究是會被學長 04/12 01:58
sasako:糾正的 04/12 01:58
sasako:verilog_blocking_nonblocking.html 04/12 02:17
sasako:1F自己連起來吧 google搜尋這種資訊很多啦... 04/12 02:18
zxvc:我說的不一樣就是指在某些sequential circuits下的情況。 04/12 03:26
zxvc:如果你的coding style就是跟業界一樣,我也許會follow。(不過 04/12 03:30
zxvc:我不一定會去業界) 04/12 03:31
zxvc:我老師是比較開明loop generate跟for loop只要你寫得出來她都 04/12 03:41
zxvc:接受。 04/12 03:42
zxvc:另外你給的連結第三點觀念錯誤。continuous assignment跟 04/12 03:44
zxvc:non-blocking、blocking assignments一點關係都沒有。 04/12 03:45
zxvc:它是另外一種assignment。non-blocking與blocking assignment 04/12 03:46
zxvc:是procedure assignment (IEEE 1364-2005 Sec 6)。 04/12 03:48
zxvc:procedure assignment是用在reg、integer等data types。 04/12 03:49
zxvc:continouse assignment是用在wire之類的data types上。 04/12 03:50
zxvc:它們update values的方式也不太一樣(IEEE 1364-2005 Sec. 9.2 04/12 03:51
zxvc:)。 04/12 03:51
zxvc:continuous assignment是等號右邊出現的inputs一變,就 04/12 04:14
zxvc:evaluate與update,這通常用在model combinational circuits 04/12 04:16
zxvc:。procedure assignment的evaluation/update則往往受到 04/12 04:18
zxvc:sensitivity list的影響,它不總是等號右邊的inputs一有變化 04/12 04:19
zxvc:就evaluation/update。但always(*)就可以達到跟continuous 04/12 04:21
zxvc:assignment一樣的效果,所以它也可以用來model combinational 04/12 04:22
zxvc:circuits。 04/12 04:22
zxvc:另外我老師也是待過業界的。她建議(沒有強制)只要用 04/12 04:42
zxvc:non-blocking assignment就好,包括用always model 04/12 04:43
zxvc:combinational circuits。 04/12 04:43
zxvc:其實我覺得non-blocking assignment一個好用的地方在於用 04/12 04:45
zxvc:always model shift registers。 04/12 04:45
zxvc:其實用non-blocking或blocking assignment與always model 04/12 04:51
zxvc:combinational circuits的結果似乎是一樣的(我沒證明過)。 04/12 04:51
zxvc:不過用blocking可以做到non-blocking做不到的事,例如我之前 04/12 04:53
zxvc:在板上po的priority encoder就是利用blocking update的特性。 04/12 04:54
zxvc:抱欺我上兩句話有錯。我把那個priority encoder改成 04/12 05:02
zxvc:non-blocking assignment,結果也合出一樣的priority encoder 04/12 05:03
zxvc:可能non-blocking與blocking在always(*)情況下是等價的。 04/12 05:04
zxvc:(我指的是合出來的電路是等價的) 04/12 05:05
sneak: 用到底,最後還不是做出 https://noxiv.com 11/11 15:04
sneak: procedure a https://daxiv.com 01/04 21:55