Re: [問題] Verilog的always
※ 引述《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
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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):