Re: [問題] 請教Verilog入門書籍

看板Electronics作者 (眾生都是未來佛)時間13年前 (2012/08/14 19:22), 編輯推噓3(3048)
留言51則, 7人參與, 最新討論串2/2 (看更多)
有些人說"用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

08/14 23:06, , 1F
為什麼只會且可以合出一個多工器?兩個if不是同時進行嗎?
08/14 23:06, 1F

08/14 23:42, , 2F
因為由上讀到下, if s = 1, 一開始先給定a,可是接下
08/14 23:42, 2F

08/14 23:42, , 3F
改成給b,if s = 0的話也是同一個邏輯
08/14 23:42, 3F

08/15 07:56, , 4F
h大,所以不要用gate-level的"同時進行"去看待always+
08/15 07:56, 4F

08/15 07:58, , 5F
sequential block這種behavioral-level描述方式。
08/15 07:58, 5F

08/15 08:03, , 6F
sequential block裡的敘述是一行一行執行的。合成器在合它的
08/15 08:03, 6F

08/15 08:07, , 7F
時候是不會管在一次此block的執行中,訊號o被assign幾次、只
08/15 08:07, 7F

08/15 08:09, , 8F
會管此block每次結束後最終的值來決定它合成的邏輯閘。
08/15 08:09, 8F

08/15 08:13, , 9F
就如前面l大所提到的,Verilog是個可用不同抽象(abstraction)
08/15 08:13, 9F

08/15 08:14, , 10F
層(level)描述的語言,不是只有gate-level。用不同level的方
08/15 08:14, 10F

08/15 08:17, , 11F
式去解讀另一level,有時是不太洽當的、甚至完全無法解釋。
08/15 08:17, 11F

08/15 10:43, , 12F
Verilog behavioral-level去寫gate-level應該完全不是問題
08/15 10:43, 12F

08/15 11:39, , 13F
基本上,腦筋還算清楚的人不會寫出這樣的 always block
08/15 11:39, 13F

08/15 11:40, , 14F
再來就是搞清楚 blocking/non-blocking assignment 的運作
08/15 11:40, 14F

08/15 11:41, , 15F
一個像 C 另一個不像 C
08/15 11:41, 15F

08/15 11:57, , 16F
要是相信Verilog可以用C寫的初學者寫成這樣我也不意外
08/15 11:57, 16F

08/15 12:06, , 17F
我舉這範例只是想明顯的指出不該用gate-level的角度去解釋
08/15 12:06, 17F

08/15 12:07, , 18F
always+sequential block的modelling方式。
08/15 12:07, 18F

08/15 12:14, , 19F
我之所以說sequential block像C是因為它是一行一行執行的。
08/15 12:14, 19F

08/15 12:23, , 20F
l大,你那句話我個人持保留態度...個人是覺得滿大膽的說法。
08/15 12:23, 20F

08/15 12:25, , 21F
至於我說不要用gate-level看待"一些"behavioral-level,這篇
08/15 12:25, 21F

08/15 12:25, , 22F
就給了一個例子。
08/15 12:25, 22F

08/22 18:53, , 23F
multi driven, 只有頭腦有問題才寫這樣的code
08/22 18:53, 23F

08/22 18:58, , 24F
另外沒有任何 gate 描述,這是RTL
08/22 18:58, 24F

08/22 19:02, , 25F
同不同意只是程度問題
08/22 19:02, 25F

08/22 19:07, , 26F
只有 a=b; a=c; 卻扯一堆只是讓人好笑
08/22 19:07, 26F

08/22 21:58, , 27F
不知道c大在說誰好笑,這只是個方便講解的特殊例子。有人真
08/22 21:58, 27F

08/22 21:59, , 28F
的就理解錯誤。
08/22 21:59, 28F

08/22 22:01, , 29F
電路合成也不會有multi driven,不信去合合看,哪家合出
08/22 22:01, 29F

08/22 22:01, , 30F
multi driven請告訴我,謝謝。
08/22 22:01, 30F

08/22 22:03, , 31F
再來把上述blocking assignment,全改成nonblocking
08/22 22:03, 31F

08/22 22:04, , 32F
assignment,仍然會合出一個"s為1選b, 0選a"多工器。
08/22 22:04, 32F

08/22 22:04, , 33F
合不出來請告訴我用哪家合成器,謝謝。
08/22 22:04, 33F

08/22 22:16, , 34F
這種sequential block執行一次,同一變數被assign兩次有個實
08/22 22:16, 34F

08/22 22:16, , 35F
用的例子,就是給預設值防止合出latch。
08/22 22:16, 35F

08/22 22:19, , 36F
補充:不管nonblocking/blocking assignments,在always+
08/22 22:19, 36F

08/22 22:22, , 37F
sequential block中,每次迭代都會有較後面的assignment複寫
08/22 22:22, 37F

08/22 22:23, , 38F
前面assignments的情形。
08/22 22:23, 38F

08/22 22:25, , 39F
blocking是比較立即的、nonblocking是在迭代結束後。
08/22 22:25, 39F

08/22 22:26, , 40F
所以若要以"同時執行"的字眼形容blocking assignment,有時是
08/22 22:26, 40F

08/22 22:26, , 41F
行不太通的。
08/22 22:26, 41F

08/22 22:28, , 42F
抱歉,打錯了,上上樓應該是要說"...形容nonblocking..."。
08/22 22:28, 42F

08/22 22:41, , 43F
講了這樣多,再提一下重點,我認為要能理解較高階、方便的HDL
08/22 22:41, 43F

08/22 22:43, , 44F
甚至能掌控它,必需對它要有正確的理解。用似是而非的理解只
08/22 22:43, 44F

08/22 22:44, , 45F
能解釋一部分,但有些好用、實用的語法,就不見得能夠解釋。
08/22 22:44, 45F

08/22 22:47, , 46F
另外我承認我上面有個"迭代結束"是個"似是而非"的方便說法,
08/22 22:47, 46F

08/22 22:48, , 47F
它不能解釋所有情況。正確來講要用SystemVerilog的scheduling
08/22 22:48, 47F

08/22 22:49, , 48F
的nonblocking assignment (NBA) region來解釋。
08/22 22:49, 48F

08/13 19:30, , 49F
m
08/13 19:30, 49F

08/13 19:30, , 50F
08/13 19:30, 50F

09/17 23:23, , 51F
blocking是比較 https://daxiv.com
09/17 23:23, 51F
文章代碼(AID): #1GAZJbST (Electronics)
文章代碼(AID): #1GAZJbST (Electronics)