作者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/cn.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