看板 Electronics 關於我們 聯絡資訊
在撰寫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