Verilog HDL 阻塞 非阻塞用法

2021-07-27 04:36:18 字數 2357 閱讀 3887

##阻塞賦值

阻塞賦值操作符用等號(即 = )表示。為什麼稱這種賦值為阻塞賦值呢?這是因為在賦值時先計算等號右手方向(rhs)部分的值,這時賦值語句不允許任何別的verilog語句的干擾,直到現行的賦值完成時刻,即把rhs賦值給 lhs的時刻,它才允許別的賦值語句的執行。一般可綜合的阻塞賦值操作在rhs不能設定有延遲,(即使是零延遲也不允許)。從理論上講,它與後面的賦值語句只有概念上的先後,而無實質上的延遲。 若在rhs 加上延遲,則在延遲期間會阻止賦值語句的執行, 延遲後才執行賦值,這種賦值語句是不可綜合的,在需要綜合的模組設計中不可使用這種風格的**。

阻塞賦值的執行可以認為是只有乙個步驟的操作:

計算rhs並更新lhs,此時不能允許有來自任何其他verilog語句的干擾。 所謂阻塞的概念是指在同乙個always塊中,其後面的賦值語句從概念上(即使不設定延遲)是在前一句賦值語句結束後再開始賦值的。

如果在乙個過程塊中阻塞賦值的rhs變數正好是另乙個過程塊中阻塞賦值的lhs變數,這兩個過程塊又用同乙個時鐘沿觸發,這時阻塞賦值操作會出現問題,即如果阻塞賦值的次序安排不好,就會出現競爭。若這兩個阻塞賦值操作用同乙個時鐘沿觸發,則執行的次序是無法確定的。下面的例子可以說明這個問題。

[例1]. 用阻塞賦值的反饋振盪器

module fbosc1 (y1, y2, clk, rst);

output y1, y2;

input clk, rst;

reg y1, y2;

always @(posedge clk or posedge rst)

if (rst) y1 = 0; // reset

else y1 = y2;

always @(posedge clk or posedge rst)

if (rst) y2 = 1; // preset

else y2 = y1;

endmodule

按照ieee verilog 的標準,上例中兩個always塊是並行執行的,與前後次序無關。如果前乙個always塊的復位訊號先到0時刻,則y1 和y2都會取1,而如果後乙個always塊的復位訊號先到0時刻,則y1 和y2都會取0。這清楚地說明這個verilog模組是不穩定的會產生冒險和競爭的情況。

##非阻塞賦值

非阻塞賦值操作符用小於等於號 (即 <= )表示。為什麼稱這種賦值為非阻塞賦值?這是因為在賦值操作時刻開始時計算非阻塞賦值符的rhs表示式,賦值操作時刻結束時更新lhs。在計算非阻塞賦值的rhs表示式和更新lhs期間,其他的verilog語句,包括其他的verilog非阻塞賦值語句都能同時計算rhs表示式和更新lhs。非阻塞賦值允許其他的verilog語句同時進行操作。非阻塞賦值的操作可以看作為兩個步驟的過程:

在賦值時刻開始時,計算非阻塞賦值rhs表示式。

在賦值時刻結束時,更新非阻塞賦值lhs表示式。

非阻塞賦值操作只能用於對暫存器型別變數進行賦值,因此只能用在"initial"塊和"always"塊等過程塊中。非阻塞賦值不允許用於連續賦值。下面的例子可以說明這個問題:

[例2]. 用非阻塞賦值的反饋振盪器

module fbosc2 (y1, y2, clk, rst);

output y1, y2;

input clk, rst;

reg y1, y2;

always @(posedge clk or posedge rst)

if (rst) y1 <= 0; // reset

else y1 <= y2;

always @(posedge clk or posedge rst)

if (rst) y2 <= 1; // preset

else y2 <= y1;

endmodule

同樣,按照ieee verilog 的標準,上例中兩個always塊是並行執行的,與前後次序無關。無論哪乙個always塊的復位訊號先到, 兩個always塊中的非阻塞賦值都在賦值開始時刻計算rhs表示式,,而在結束時刻才更新lhs表示式。所以這兩個always塊在復位訊號到來後,在always塊結束時 y1為0而y2為1是確定的。從使用者的角度看這兩個非阻塞賦值正好是並行執行的。

掌握可綜合風格的verilog模組程式設計的八個原則會有很大的幫助。在編寫時牢記這八個要點可以為絕大多數的verilog使用者解決在綜合後**中出現的90-100% 的冒險競爭問題。

時序電路建模時,用非阻塞賦值。

鎖存器電路建模時,用非阻塞賦值。

用always塊建立組合邏輯模型時,用阻塞賦值。

在同乙個always塊中建立時序和組合邏輯電路時,用非阻塞賦值。

在同乙個always塊中不要既用非阻塞賦值又用阻塞賦值。

不要在乙個以上的always塊中為同乙個變數賦值。

用$strobe系統任務來顯示用非阻塞賦值的變數值

在賦值時不要使用 #0 延遲

verilog HDL 的阻塞和非阻塞語句分析

在fpga設計中完全透視verilog hdl 的阻塞和非阻塞語句,是個人在verilog hdl運用中的一些心得體會。阻塞和非阻塞語句作為verilog hdl語言的最大難點之一,一直困擾著fpga設計者,即使是乙個頗富經驗的設計工程師,也很容易在這個點上犯下一些不必要的錯誤。阻塞和非阻塞可以說是...

verilog HDL 的阻塞和非阻塞語句分析

在fpga設計中完全透視verilog hdl 的阻塞和非阻塞語句,是個人在verilog hdl運用中的一些心得體會。阻塞和非阻塞語句作為verilog hdl語言的最大難點之一,一直困擾著fpga設計者,即使是乙個頗富經驗的設計工程師,也很容易在這個點上犯下一些不必要的錯誤。阻塞和非阻塞可以說是...

阻塞 非阻塞

阻塞和非阻塞指 的是在接收和傳送時是否等待動作完成才返回 舉例 阻塞 block 是指,你撥通某人 的 但是此人不在,於是你拿著 等他回來,其間不能再用 非阻塞 nonblock 是指,你撥通某人 的 但是此人不在,於是你結束通話 待會兒再打。至於到時候他回來沒有,只有打了 才知道。即所謂的 輪詢 ...