天天看點

Verilog HDL 阻塞和非阻塞指派的了解(1)Verilog HDL 阻塞和非阻塞指派的了解(1)

Verilog HDL 阻塞和非阻塞指派的了解(1)

在Verilog HDL語言中,信号有兩種指派方式:

  1. 非阻塞

    Non_Blocking

    指派方式(如b<=a;)
    1. 塊結束後才完成指派操作;
    2. b的值并不是立刻就改變的;
    3. 這是一種比較常用的指派方法;(特别在編寫可綜合子產品時)
  2. 阻塞

    Blocking

    指派方式(b=a;)
    1. 指派語句執行完後,塊才結束;
    2. b的值在指派語句執行完後立刻就改變;
    3. 可能會産生意想不到的結果;

非阻塞指派方式和阻塞指派方式的差別常給設計人員帶來問題。

問題主要是給

always

塊内的

reg

型信号的指派方式不易把握。

到目前為止,前面所舉的例子中的

always

子產品内的reg型信号都是采用下面的這種指派方式:

b <= a;
           

這種方式的指派并不是馬上執行的,也就是說

always

塊内的下一條語句執行後,b并不等于a,而是保持原來的值。

always

塊結束後,才進行指派。

而另一種指派方式阻塞指派方式,如下所示:

b = a;
           

這種指派方式是馬上執行的。也就是說執行下一條語句時,b已等于a。

盡管這種方式看起來很直覺,但是可能引起麻煩。下面舉例說明:

Example 1:

always @ ( posedge clk ) begin
	b <= a;
	c <= b;
end
           

上例中的

always

塊中用了非阻塞指派方式,定義了兩個

reg

型信号b和c,

clk

信号的上升沿到來時,b就等于a,c就等于b,這裡應該用到了兩個觸發器。

請注意:指派是在

always

塊結束後執行的,c應為原來b的值。

這個

always

塊實際描述的電路功能如下圖所示:

Verilog HDL 阻塞和非阻塞指派的了解(1)Verilog HDL 阻塞和非阻塞指派的了解(1)

Example 2:

always @ ( posedge clk ) begin
	b = a;
	c = d;
end
           

上例中中的

always

塊用了阻塞指派方式。

clk

信号的上升沿到來時,将發生如下的變化:

b馬上取a的值,c馬上取b的值(即等于a),

生成的電路圖如下所示隻用了一個觸發器來寄存器a的值,又輸出給b和c。

這大概不是設計者的初衷,如果采用[Eaxmple 1]所示的非阻塞指派方式就可以避免這種錯誤。

Verilog HDL 阻塞和非阻塞指派的了解(1)Verilog HDL 阻塞和非阻塞指派的了解(1)

寫在後面

後面還有一期深入了解的。

Date

2019-08-29