初学verilog的同学容易搞混淆阻塞与非阻塞赋值操作。要区分的话,其实也有办法。学过数字电路的都知道时序的概念,比寄存器的操作,把D端输入用clk打入寄存器,在clk时钟上升沿采样D值,只有在时钟上升沿的下一周期的上升沿,D值才会在输出端Q上输出出来。符合这个特征的就是非阻塞赋值:
always @ (posedge clk)
if (!rst)
dout <= 1'b0 ;
else
dout <= d ;
阻塞赋值是立即被更新的,与非阻塞赋值有非常明显的差异。如果连续用阻塞赋值方式对一个变量赋值,那么最终它就等于最后赋值时的变量值。如下:
always @ (*)
begin
dout = 1'b0 ;
dout = d ;
end
变量dout最后的值是d,dout初始赋值的0被后面所的赋值d覆盖(阻塞)而没有了。阻塞赋值的符号也是与非阻塞赋值不一样的“=”。