看板 Electronics 關於我們 聯絡資訊
※ 引述《sasako (只想把你留在心中)》之銘言: : ※ 引述《zxvc (修行)》之銘言: : : 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底下,的確還是可以合成,只是當在寫大電路時, 我是習慣這種coding style。 或許你以為這樣就是分開sequential circuit與combinational circuit, module Test(c, d, Clock, Reset1); output reg [2:0] c; output reg d; input Clock, Reset1; reg d2; always@(posedge Clock) if(Reset1) c = 0; else begin c = c+1; d = d2; end always@(*) if(c == 2) d2 = 1; else d2 = 0; endmodule 但其實c = c+1;會合出加法器(combinational circuit)。 所以這種敘述也是bad style!?: always@(posedge Clock) if(Reset1) a = 0; else begin if(b) a = 1; else a = 0; end 因為if(b)會合出多工器。 如果這真是你們實驗室的coding style,我也認了。 不過我沒有輕視任何coding style的意思,只是習慣的差異。 至於debug的容易與否我想跟你自己習慣的coding style有關。 你自己習慣哪種coding style,你就覺得它容易debug。 不過如果大多數人的coding style跟我不一樣, 我想我也只好習慣別人的coding style。 題外話:這個世界不是最好的東西就是最好,還要大家說最好才算數。 : 這就會造成debug上的困擾,至少我在初學者的時候,我曾經也是這樣 : ,後來當程式寫得越多越大時,就會發現這樣的style實在是不好的... : 或許剛開始大家可能為了交作業,只想function對就行了,但往後 : 程式開始複雜時,學長、老師的要求就會是整齊,把每個訊號分清楚, : 加上註解,這樣以後再回頭看,自己還記得當初在寫什麼,交接學弟 : 時,至少不會讓人閱讀起來很痛苦... : 而回到原作者一開始的問題,我覺得可以去參考一下CIC design compiler : 那本教科書,他甚至舉完例子,還畫出了合成的示意圖,非常容易瞭解.. : 而坊間的書多半都是解釋"<=" 就是在同時間一起動作,"="則是有次序的 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 很多人喜歡這樣看,但其實是錯的。例如(我沒說可合成): initial begin a = 0; (1) a <= 1; (2) b = 0; (3) c <= a; (4) end (2)跟(4)如果視為同時動作,所以最後a = 1, c = 0!?就錯了。 硬要用"同時"、"不同時"去解釋也解釋不通這initial怎麼跑。 blocking assignment中block作動詞解釋為"阻擋",不是"方塊"。 阻擋什麼?答案是執行的控制權。 也就是當assignment的update動作還沒完成,它是不會執行下一行的。 begin...end在Verilog中叫sequential block, 也就它裡面的敘述是一行一行(sequential)執行的(IEEE 1364-2005 Sec. 9.8.1)。 fork...join在Verilog中叫parallel block, 它裡面的各敘述才是同時(concurrent)執行的(IEEE 1364-2005 Sec. 9.8.2)。 所以上面的initial要怎麼跑?答案就是,initial後面接sequential block, 所以它會先執行(1)。(1)是blocking assignment, 所以它會先對等號右手端求值(evaluation),然後更新(update)完a才繼續執行下一行。 所以現在a = 0,然後執行(2)。(2)是non-blocking assignment,它會先evaluation, 但不會立即update就執行下一行(3)。 non-blocking assignment update的動作是當 遇到blocking assignment或sequential block的end才會update。 (3)是blocking assignment,所以a會被強制update。所以(3)執行完後 a = 1, b = 0。 接著執行(4),但a此時=1,所以最後a = 1, b = 0, c = 1。 有興趣可以用ModelSim驗證看看。 另外請勿使用parallel block(fork...join)設計硬體, 因為大多合成器不能合成。 : 動作,雖然是有次序,但在Wave上是看不出來,不過我的經驗是有時候寫 : a=a+1; 與 b=a+1; 結果會是不一樣的... : b=a+1; a=a+1; : 我相信這每個人都會遲早會碰到..一開始會覺得很奇怪,不過等遇到時就 : 會開始注意,只能說debug真的是在累積錯誤的經驗...呵呵 -- 西方三聖:http://p8.p.pixnet.net/albums/userpics/8/3/553683/1193661731.jpg
《佛說阿彌陀經》http://web.cc.ncu.edu.tw/~93501025/amtf.doc 十一面觀音咒:http://file.buda.idv.tw/music/DBZFY04.mp3 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.126.142.97 ※ 編輯: zxvc 來自: 122.126.142.97 (04/12 04:32)
katheryne:推"大家說好才算數" 04/12 08:12
sasako:基本上 initial這種寫法多半出現在testbench裡面 04/12 09:22
sasako:看看大部分的程式 很少人直接寫在code裡面.. 04/12 09:22
ksmrt0123:c+1是 combinational, 但c=c+1是 sequential 04/12 18:03
zxvc:對,樓上說的沒錯。sequential circuits的定義是可以包涵 04/12 21:16
zxvc:combinational circuits。 04/12 21:17
zxvc:不過把always model的sequential circuits的combinational 04/12 21:22
zxvc:circuits分離出來的coding style有必要嗎?我見到多數人都不 04/12 21:24
zxvc:是這樣。我老闆也沒這樣要求。 04/12 21:25
zxvc:像上述的計數器,把加法器分離出來的code我反而很少看到。 04/12 21:26
ksmrt0123:所以你舉這個例子(c=c+1那段)的用意是? 抱歉看不太出來 04/12 22:09
n052111089:感謝大大用心舉例:) 那請問一下(2)跟(3)是同時update? 04/12 22:50
zxvc:(2)是先執行的,所以會比(3)先update。 04/12 23:27
zxvc:我這篇文章的第一段是要說明,我覺得沒必要把所有的 04/12 23:54
zxvc:combinational circuits從sequential circuits中分離出來 04/12 23:55
zxvc:model。 04/12 23:55
zxvc:上面三行話是回覆k大。 04/12 23:56
sneak: com 11/11 15:04
sneak: bination https://noxiv.com 11/11 15:04
sneak: com 01/04 21:55
sneak: https://muxiv.com 01/04 21:55