微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于阻塞赋值与非阻塞赋值

关于阻塞赋值与非阻塞赋值

时间: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之间为阻塞赋值,不懂啊~求大神指点~!

阻塞和非阻塞的区分,用单条语句无法看出效果。并不是说阻塞当前语句的赋值操作,而是说阻塞后面语句的赋值操作。
如果是:
在时序逻辑中
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块里面不建议用混合的赋值方式

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top