概述
关于赋值语句并不多,有 非阻塞赋值(<=) 和 阻塞赋值(=) 两种,重点在于理解二者之间的差异。
通过一个简单有效的例子来理解和记忆:
假设abc的初值分别是S0,S1,S2,下面两种赋值方式的结果是不同的。
非阻塞赋值:
always @(posedge clk) begin
b <= a;
c <= b;
end
阻塞赋值:
always @(posedge clk) begin
b = a;
c = b;
end
非阻塞赋值中, b <= a;b <= c;这两个语句是同时进行的,当这个always块快结束时,同时执行这两个语句,得到的结果是b为S0,c的值为S1;
阻塞赋值中, 先执行b=a,在执行c=b,之后才是always块结束,最终得到的结果是,b=S0,c=S0。
故:
非阻塞赋值方式:
(1)语句块中,上面所赋的变量值不能立即为下面的语句使用;
(2)块结束后才能完成赋值操作,所赋的变量值是上一次赋值所得到的;
(3)在编写可综合的时序逻辑模型,常用这种方法。
阻塞赋值方式:
(1)赋值语句执行完成后,块才结束;
(2)b=a的赋值语句中,b的值在赋值语句执行完成后立刻就改变。