通過RTL電路深入理解阻塞賦值和非阻塞賦值的區別

2021-09-24 09:23:15 字數 3142 閱讀 1201

稍微接觸過verilog hdl的都對阻塞與非阻塞賦值略知一二,也是我們經常強調的重點之一,在課堂上還是有學員問什麼不一樣呢,為什麼我用阻塞賦值也能得出正確的結果呢?

在編寫可綜合**的時候,建議大家不要忘了開啟rtl網表檢視器看看我們自己綜合出來的電路是不是自己想要的邏輯。

我就阻塞與非阻塞賦值這個問題詳細說明一下。

1、連續賦值

連續賦值語句的硬體實現是:從賦值語句(=)右邊提取出的邏輯,用於驅動賦值語句左邊的線網(net)

連續賦值語句

綜合以後,通過網表檢視器為上圖的結果,線網c由賦值語句的右邊的邏輯是組合邏輯a&b簡單驅動

2、過程賦值

過程賦值語句的硬體實現是,從賦值語句的(=或<=)右邊提取出的邏輯用於驅動賦值語句左邊的變數(必需是reg型別)。必須注意的是雖然過程賦值語句是可以出現在initial語句中(僅用於**),也可以出現在「always」塊語句中,但是只有「always」中的過程賦值語句才能被綜合

有兩種型別的過程賦值語句:阻塞賦值語句(blocking assignment statement)、非阻塞賦值語句(non-blocking assignment statement)

2.1、阻塞賦值語句

阻塞賦值語句可以簡單描述為,在乙個always塊中,語句按照從上到下的順序執行

綜合後的rtl檢視如上圖所示,每個時鐘上公升沿觸發後,變數q2、q1的值是同步的,q2被賦予了q1更新後的值

2.2、非阻塞賦值語句

非阻塞賦值語句簡述為:在乙個always 塊中,語句是並行執行的

從綜合結果的rtl檢視器可以看到如上圖所示,每個時鐘觸發後,q2被賦予的q1值時上個時鐘週期生成的值

從上面可以看出,第一條語句綜合出來的結果是一樣的,阻塞與非阻塞不同在於它們會影響到後面引用該條語句的邏輯

3、阻塞與非阻塞建模建模原則

1)、組合邏輯使用阻塞語句、時序邏輯使用非阻塞語句;

2)、在同乙個模組裡,同乙個變數不能既有阻塞賦值,又有非阻塞賦值

例如:

always@(posedge clk)

begin

a=a+1;

b=a-c;

endalways@(posedge clk)

begin

c=a;

endendmodule

b的結果為2。因為b取a賦值後的值,但取c賦值之前的值。

開啟tool->netlist viewer->rtl viever檢視綜合出的電路如圖:

實際上a、b、c觸發器的賦值仍然是同時進行的,只不過b會與a同時賦a+1的值。

如改為非阻塞語句:

always@(posedge clk)

begin

a<=a+1;

b<=a-c;

endalways@(posedge clk)

begin

c<=a;

endendmodule

結果b=1,則綜合出電路如下:

區別僅在於b賦a而上面是b賦a+1。

弄了很久,,,

如果是組合邏輯中的阻塞語句:

always@(posedge clk)

begin

a<=a+1;

endalways@(a)

begin

b=a+3;

c=b+7;

end

則綜合結束如下:

b、c全由組合邏輯電路實現。

若使用非阻塞語句:

always@(posedge clk)

begin

a<=a+1;

endalways@(a)

begin

b<=a+3;

c<=b+7;

end

則綜合出的電路和上面一樣。因此似乎在組合邏輯中使用非阻塞語句沒有意義。因此一般的在組合邏輯中就直接使用阻塞語句。

深入理解PHP物件賦值

1 2 深入理解php物件賦值 3echo 45 obj new stdclass 6 obj name pig 7var dump obj object stdclass 1 1 89 copy obj obj copy都是new stdclass返回的同乙個識別符號的拷貝 10var dump ...

深入理解阻塞socket和非阻塞socket

什麼是阻塞socket,什麼是非阻塞socket。對於這個問題,我們要先弄清什麼是阻塞 非阻塞。阻塞與非阻塞是對乙個檔案描述符指定的檔案或裝置的兩種工作方式。阻塞的意思是指,當試圖對該檔案描述符進行讀寫時,如果當時沒有東西可讀或者暫時不可寫,程式就進入等待狀態,直到有東西可讀或者可寫為止。非阻塞的意...

深入理解php的引用賦值

關於php引用的一般問題大家看資料就行了,這次我們來聊點有趣的東西。今天乙個朋友在群裡面問起來乙個關於變數引用賦值的問題,問題本身很簡單,我突然想做乙個實驗,來看看array直接賦值和引用賦值效能上的差別,寫完 發現另外乙個問題.請看 a array fill 0,1000000,10 functi...