在Verilog HDL语言中,信号有两种赋值方式:非阻塞(Non_Blocking)赋值方式和阻塞(Blocking)赋值方式。
(1)非阻塞赋值方式。
典型语句:b <= a;
① 块结束后才完成赋值操作。
② b的值并不是立刻就改变的。
③ 这是一种比较常用的赋值方法,特别在编写可综合模块时。
(2)阻塞赋值方式。
典型语句:b = a;
① 赋值语句执行完后,块才结束。
② b的值在赋值语句执行完后立刻就改变。
③ 可能会产生意想不到的结果。
非阻塞赋值方式和阻塞赋值方式的区别常给设计人员带来问题。问题主要是给“always”块内的reg型信号的赋值方式不易把握。到目前为止,前面所举的例子中的“always”模块内的reg型信号都是采用下面的这种赋值方式:
b <= a;
这种方式的赋值并不是马上执行的,也就是说“always”块内的下一条语句执行后,b并不等于a,而是保持原来的值。“always”块结束后,才进行赋值。而另一种赋值方式阻塞赋值方式,如下所示:
b = a;
这种赋值方式是马上执行的,也就是说执行下一条语句时,b已等于a。尽管这种方式看起来很直观,但是可能引起麻烦。下面举例说明。
例1:非阻塞赋值。
always @( posedge clk ) begin
b<=a;
c<=b;
end