看板 Electronics 關於我們 聯絡資訊
有些人說"用C(behavioral-level)的方式去寫Verilog(gate-level)會令人想哭", 這句話有些情況是這樣沒錯。 但把這句反過來,也一樣會讓人想哭: "用gate-level的方式去寫behavioral-level會令人想哭" 怎麼說?我舉個例子,雖然應該沒有人會這樣寫, 但結果應該會讓一些人有些驚訝: module t( output reg o, input a, input b, input s ); always@(*) begin if(s) o = a; else o = b; if(s) o = b; else o = a; end endmodule 如果是以gate-level的解度去解釋這段code,可能會得到以下結論: 有兩個if,所以會合出兩個多工器,第一個是"s為1選a, 0選b", 另一個是"s為1選b, 0選a",兩個多工器輸出都接到o...應該不能合成!? 但若是懂sequential block就會知道它只會合出一個"s為1選b, 0選a"多工器。 若能掌控sequential block合成的結果, 有很多高階、方便的語法就能用得得心應手寫出可合成的電路, 如"設定初值避免合出latch"、for loop、function。 -- 楞嚴咒(附注音): https://skydrive.live.com/?cid=87cef5e6683b5427&sc=documents&id=87CEF5E6683B5427%21312# 縮址: http://bit.ly/r3bgEo -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.220.54
hadbeen:為什麼只會且可以合出一個多工器?兩個if不是同時進行嗎? 08/14 23:06
deathcustom:因為由上讀到下, if s = 1, 一開始先給定a,可是接下 08/14 23:42
deathcustom:改成給b,if s = 0的話也是同一個邏輯 08/14 23:42
zxvc:h大,所以不要用gate-level的"同時進行"去看待always+ 08/15 07:56
zxvc:sequential block這種behavioral-level描述方式。 08/15 07:58
zxvc:sequential block裡的敘述是一行一行執行的。合成器在合它的 08/15 08:03
zxvc:時候是不會管在一次此block的執行中,訊號o被assign幾次、只 08/15 08:07
zxvc:會管此block每次結束後最終的值來決定它合成的邏輯閘。 08/15 08:09
zxvc:就如前面l大所提到的,Verilog是個可用不同抽象(abstraction) 08/15 08:13
zxvc:層(level)描述的語言,不是只有gate-level。用不同level的方 08/15 08:14
zxvc:式去解讀另一level,有時是不太洽當的、甚至完全無法解釋。 08/15 08:17
lovepy:Verilog behavioral-level去寫gate-level應該完全不是問題 08/15 10:43
Pash77:基本上,腦筋還算清楚的人不會寫出這樣的 always block 08/15 11:39
Pash77:再來就是搞清楚 blocking/non-blocking assignment 的運作 08/15 11:40
Pash77:一個像 C 另一個不像 C 08/15 11:41
deathcustom:要是相信Verilog可以用C寫的初學者寫成這樣我也不意外 08/15 11:57
zxvc:我舉這範例只是想明顯的指出不該用gate-level的角度去解釋 08/15 12:06
zxvc:always+sequential block的modelling方式。 08/15 12:07
zxvc:我之所以說sequential block像C是因為它是一行一行執行的。 08/15 12:14
zxvc:l大,你那句話我個人持保留態度...個人是覺得滿大膽的說法。 08/15 12:23
zxvc:至於我說不要用gate-level看待"一些"behavioral-level,這篇 08/15 12:25
zxvc:就給了一個例子。 08/15 12:25
colinshih:multi driven, 只有頭腦有問題才寫這樣的code 08/22 18:53
colinshih:另外沒有任何 gate 描述,這是RTL 08/22 18:58
colinshih:同不同意只是程度問題 08/22 19:02
colinshih:只有 a=b; a=c; 卻扯一堆只是讓人好笑 08/22 19:07
zxvc:不知道c大在說誰好笑,這只是個方便講解的特殊例子。有人真 08/22 21:58
zxvc:的就理解錯誤。 08/22 21:59
zxvc:電路合成也不會有multi driven,不信去合合看,哪家合出 08/22 22:01
zxvc:multi driven請告訴我,謝謝。 08/22 22:01
zxvc:再來把上述blocking assignment,全改成nonblocking 08/22 22:03
zxvc:assignment,仍然會合出一個"s為1選b, 0選a"多工器。 08/22 22:04
zxvc:合不出來請告訴我用哪家合成器,謝謝。 08/22 22:04
zxvc:這種sequential block執行一次,同一變數被assign兩次有個實 08/22 22:16
zxvc:用的例子,就是給預設值防止合出latch。 08/22 22:16
zxvc:補充:不管nonblocking/blocking assignments,在always+ 08/22 22:19
zxvc:sequential block中,每次迭代都會有較後面的assignment複寫 08/22 22:22
zxvc:前面assignments的情形。 08/22 22:23
zxvc:blocking是比較立即的、nonblocking是在迭代結束後。 08/22 22:25
zxvc:所以若要以"同時執行"的字眼形容blocking assignment,有時是 08/22 22:26
zxvc:行不太通的。 08/22 22:26
zxvc:抱歉,打錯了,上上樓應該是要說"...形容nonblocking..."。 08/22 22:28
zxvc:講了這樣多,再提一下重點,我認為要能理解較高階、方便的HDL 08/22 22:41
zxvc:甚至能掌控它,必需對它要有正確的理解。用似是而非的理解只 08/22 22:43
zxvc:能解釋一部分,但有些好用、實用的語法,就不見得能夠解釋。 08/22 22:44
zxvc:另外我承認我上面有個"迭代結束"是個"似是而非"的方便說法, 08/22 22:47
zxvc:它不能解釋所有情況。正確來講要用SystemVerilog的scheduling 08/22 22:48
zxvc:的nonblocking assignment (NBA) region來解釋。 08/22 22:49
sneak: m 08/13 19:30
sneak: ulti drive https://noxiv.com 08/13 19:30
sneak: blocking是比較 https://daxiv.com 09/17 23:23