Re: [問題] Verilog的always

看板Electronics作者 (眾生都是未來佛)時間14年前 (2012/01/14 20:14), 編輯推噓2(202)
留言4則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《loveices (冷河)》之銘言: : 請問一下版上的學長 小弟目前自修verilog遇到了問題 : always@(a or b or sel) : begin : c=b; : if(sel==1'b1) : c=a; : end : 代表a或b或sel訊號改變才會觸發事件c=b吧 : 但我跑波形模擬時 為何一開始c的訊號就會跟b一樣 (b初值設1的話 c一開始也變1) : 照書上的來說應該c一開始是未定啊 : 請版上的學長指點一下 謝謝 IEC 62530:2011第60頁有寫,4-state integral若無初始化預設值為x(unknown)。 又163頁有寫x->0會有negedge event、x->1會有posedge event。 所以如果a, sel有上述事件,就會執行sequential block,若sel = 0, 就會看到c = b的現象。 另外sequentail block其實是一個較高階的描述, 硬是用gate-level modeling的觀念去寫, 反而失去high-level modeling的一些方便性。 舉個例子: 想用always modeling combinational logic有時會不小心寫成合出latch, 這時候只要給每個output variables一個初始值就解決了,也就是: method 1 always@(*) begin c = 0; if(sel == 0) if(sel2 == 0) c = a; end 但如果使用者堅持不用這種寫法, 就要為每個if-else的branch都設定值才不會合出latch: method 2 always@(*) begin if(sel == 0) if(sel2 == 0) c = a; else c = 0; else if(sel2 == 0) c = 0; else c = 0; end 如果if-else的數量或者output variables不只這麼少呢!? 何者比較方便很清楚吧。 其實較high-level的寫法多數人早在用了,我相信多數人不會寫成method 2, 而是以下: method 3 always@(*) begin if(sel == 0) if(sel2 == 0) c = a; else c = 0; else c = 0; end 其實這種寫法只是沒有在if-else tree的第一層對c作初始化, 但它在第一層的else有作初始化。所以method 3是個mixed的寫法。 另外有興趣的人可以把3種方法都拿去合成,應該都會合出一樣的結果。 若是以gate-level的觀點去理解sequential block, 會很難理解method 1~3合成結果是一樣的。 -- 楞嚴咒(附注音): https://skydrive.live.com/?cid=87cef5e6683b5427&sc=documents&id=87CEF5E6683B5427%21312# 縮址: http://bit.ly/r3bgEo -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.168.1.189 ※ 編輯: zxvc 來自: 218.168.1.189 (01/14 21:02)

01/15 10:36, , 1F
補充一點,l大如果看不懂一些東西沒關係,1, 2段才是回答你的
01/15 10:36, 1F

01/15 10:37, , 2F
原問題。
01/15 10:37, 2F
※ 編輯: zxvc 來自: 218.168.1.189 (01/15 10:38)

01/15 11:09, , 3F
謝謝你 看到這篇真的很感動!!^^ 讚啦
01/15 11:09, 3F

01/16 22:52, , 4F
推~
01/16 22:52, 4F
文章代碼(AID): #1F4N6ZeN (Electronics)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1F4N6ZeN (Electronics)