作者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://webptt.com/m.aspx?n=bbs/Electronics/M.1406126335.A.A83.html
1F:→ tkhan:所以你的blocking在哪?.. 07/23 22:40
2F:推 obov:assign跟不是blockin耶......... 07/23 23:27
3F:→ dinex:應該說,把最下面改成blocking的寫法,產生的結果卻仍然是 07/23 23:28
4F:→ dinex:non-blocking結束 07/23 23:29
5F:推 obov:那有可能不同tool會有不同結果 07/23 23:30
6F:推 illl:d用assign呢? 07/24 08:47
7F:→ dinex:感謝樓上指點!把assign寫入d的always裡處理就對了! 07/24 21:58
8F:→ illl:我覺得把assign放在always裡好像有點怪 07/25 05:44
9F:→ dinex:就是說把assign那行指令寫到d後面直接判斷。因為原始程式碼 07/25 07:49
10F:→ dinex:比起這多出很多狀態,所以不適合在狀態機外面直接assign 07/25 07:50