作者dinex (Dinex)
看板Electronics
標題[問題] non-blocking v.s. blocking?
時間Wed Jul 23 22:38:52 2014
在撰寫Verilog的時候,常常會被告誡說blocking assignment最好不要跟non-blocking
assignment寫在一起,以免邏輯之間會產生錯誤
現在本人發現一個狀況:明明non-blocking還有blocking已經分開來寫了,但是兩者
之間卻還是有時間上的影響?
===以下為示意版===
assign c=(b==a)?1:0;
always@(posedge CLK)
case(state)
state 1:
a<=1;
state 2:
b<=a;
endcase
always@(posedge CLK)
if(state==state 2)
d<=c?1:0;
如上所示,走完state 2以後,這時候c的數值應當會變成1,然後d要存入1這個數值
但是經過實際模擬,d在判斷存入哪個數值的時候,卻還是用c=0來進行判斷(此時若直接
把c拉出來當output,可以看到其值已經變成1了)就算改成d=c?1:0也還是相同結果。請問
這是在邏輯上發生哪些錯誤了?先謝謝大大們的幫忙了!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 112.104.180.231
※ 文章網址: http://www.ptt.cc/bbs/Electronics/M.1406126335.A.A83.html
→ tkhan:所以你的blocking在哪?.. 07/23 22:40
推 obov:assign跟不是blockin耶......... 07/23 23:27
→ dinex:應該說,把最下面改成blocking的寫法,產生的結果卻仍然是 07/23 23:28
→ dinex:non-blocking結束 07/23 23:29
推 obov:那有可能不同tool會有不同結果 07/23 23:30
推 illl:d用assign呢? 07/24 08:47
→ dinex:感謝樓上指點!把assign寫入d的always裡處理就對了! 07/24 21:58
→ illl:我覺得把assign放在always裡好像有點怪 07/25 05:44
→ dinex:就是說把assign那行指令寫到d後面直接判斷。因為原始程式碼 07/25 07:49
→ dinex:比起這多出很多狀態,所以不適合在狀態機外面直接assign 07/25 07:50