※ 引述《dinex (Dinex)》之銘言:
: 在撰寫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也還是相同結果。請問
: 這是在邏輯上發生哪些錯誤了?先謝謝大大們的幫忙了!
你的問題在於還沒搞清楚sequentail和combinational邏輯的差異。
而且也還沒搞懂non-blocking和blocking是什麼意思...
當code寫上@ (posedge clk)就已經說明,這是一個flip flop受到
"clk正緣"的控制產生的行為...
換句話說,當你clk敲下去的時候,正緣對到的時間c一定是0,
d在正緣之後會等於0。
而你改成combinational邏輯後得到你想要的結果,就已經證明上述
所講的,因為combinational邏輯就是一旦條件成立,即時發生...
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.44.170
※ 文章網址: http://www.ptt.cc/bbs/Electronics/M.1406451861.A.B98.html