关于阻塞赋值与非阻塞赋值
时间:10-02
整理:3721RD
点击:
菜鸟求助
最近在学习阻塞赋值和非阻塞赋值,今天在仿真如下程序时
module t(
clk,
b,
c,
d);
input b,clk;
output c,d;
reg c,d;
always @ ( posedge clk)
begin:blk
c = b;
d <= c;
end
endmodule
得到的仿真结果却是bc之间为非阻塞赋值,cd之间为阻塞赋值,不懂啊~求大神指点~!
最近在学习阻塞赋值和非阻塞赋值,今天在仿真如下程序时
module t(
clk,
b,
c,
d);
input b,clk;
output c,d;
reg c,d;
always @ ( posedge clk)
begin:blk
c = b;
d <= c;
end
endmodule
得到的仿真结果却是bc之间为非阻塞赋值,cd之间为阻塞赋值,不懂啊~求大神指点~!
阻塞和非阻塞的区分,用单条语句无法看出效果。并不是说阻塞当前语句的赋值操作,而是说阻塞后面语句的赋值操作。
如果是:
在时序逻辑中
a=b;
c=a;
则,第一个赋值阻塞了第二个赋值,所以b直接给了c。
如果是:
在时序逻辑中
a<=b;
c<=a;
则,两个赋值是同时发生的,所以c得到的是a的过去值,而不是b。这里隐含了一个事务队列的处理机制,详细内容可以找些资料好好推敲。这是HDL语言的精妙所在,看似并行,但不失顺序。
b = c这一句阻塞了后面的 d <= c ,应该是b=c先执行完,再执行下面的非阻塞,从波形上看到的应该是在clk的上升沿检测到b,然后c的值改变,d值改变在c之后,我仿了一下
一个always块里面不建议用混合的赋值方式
今天想了好久,源头就是verilog的事务队列处理机制,好好研究一下,多谢高人指点啊
研究这个有点邪门,哈哈~
这个VHDL也有相应的问题吗?
谢谢!
就是打错了结果得到这样。
一个always块里面不建议用混合的赋值方式
