作者sasako ( )
看板Electronics
标题Re: [问题] non-blocking v.s. blocking?
时间Sun Jul 27 17:04:19 2014
※ 引述《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://webptt.com/cn.aspx?n=bbs/Electronics/M.1406451861.A.B98.html