阻塞賦值
阻塞賦值操作符用等號(即 = )表示。為什麼稱這種賦值為阻塞賦值呢?這是因為在賦值時先計算等號右手方向(rhs)部分的值,這時賦值語句不允許任何別的verilog 語句的干擾,直到現行的賦值完成時刻,即把rhs 賦值給 lhs 的時刻,它才允許別的賦值語句的執行。一般可綜合的阻塞賦值操作在rhs 不能設定有延遲,(即使是零延遲也不允許)。從理論上講,它與後面的賦值語句只有概念上的先後,而無實質上的延遲。 若在rhs 加上延遲,則在延遲期間會阻止賦值語句的執行, 延遲後才執行賦值,這種賦值語句是不可綜合的,在需要綜合的模組設計中不可使用這種風格的**。阻塞賦值的執行可以認為是只有乙個步驟的操作:計算rhs 並更新lhs。
非阻塞賦值
非阻塞賦值操作符用小於等於號 (即 <= )表示。為什麼稱這種賦值為非阻塞賦值?這是因為在賦值操作時刻開始時計算非阻塞賦值符的rhs 表示式,賦值操作時刻結束時更新lhs。在計算非阻塞賦值的rhs表示式和更新lhs 期間,其他的verilog 語句,包括其他的verilog 非阻塞賦值語句都能同時計算rhs表示式和更新lhs。非阻塞賦值允許其他的verilog 語句同時進行操作。非阻塞賦值的操作可以看作為兩個步驟的過程:
1) 在賦值時刻開始時,計算非阻塞賦值rhs 表示式。
2) 在賦值時刻結束時,更新非阻塞賦值lhs 表示式。
用非阻塞賦值的反饋振盪器
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 使用者解決在綜合後**中出現的90-100% 的冒險競爭問題。
1) 時序電路建模時,用非阻塞賦值。
2) 鎖存器電路建模時,用非阻塞賦值。
3) 用always 塊建立組合邏輯模型時,用阻塞賦值。
4) 在同乙個always 塊中建立時序和組合邏輯電路時,用非阻塞賦值。
5) 在同乙個always 塊中不要既用非阻塞賦值又用阻塞賦值。
6) 不要在乙個以上的always 塊中為同乙個變數賦值。
7) 用$strobe 系統任務來顯示用非阻塞賦值的變數值
8) 在賦值時不要使用 #0 延遲
非阻塞賦值只能用在always和initial等描述程序的語句中,非阻塞賦值時,程序中賦值語句先計算右值,算完後不立即賦給左值,而是同時計算下一條賦值語句的右值,等到所有該程序的右值計算結束後,在一起賦給左值。
阻塞賦值則是先計算乙個右值,同時賦給左值,然後計算下乙個賦值語句的右值,在賦給左值,以此類推。
注:本文摘自【夏宇聞verilog經典教程】
阻塞賦值和非阻塞賦值
2017 12 01 在verilog語言中,賦值語句經常使用,阻塞賦值和非阻塞賦值經常帶給我們很多困擾。在此討論兩種賦值方式的差異性。首先根據表面含義深刻理解阻塞和非阻塞 阻塞 在程序語句塊中 initial或者always或者其他 當前賦值語句的執行阻塞了後面語句的執行。即後面語句的賦值需要等到...
阻塞與非阻塞賦值
李秋鳳,華清遠見嵌入式學院 講師。稍微接觸過verilog hdl的都對阻塞與非阻塞賦值略知一二,也是我們經常強調的重點之一,在課堂上還是有學員問什麼不一樣呢,為什麼我用阻塞賦值也能得出正確的結果呢?在編寫可綜合 的時候,建議大家不要忘了開啟rtl網表檢視器看看我們自己綜合出來的電路是不是自己想要的...
Verilog中的阻塞賦值和非阻塞賦值
verilog中阻塞賦值和非阻塞賦值的異同 一 阻塞賦值 操作符 把賦值運算看做 lhs rhs 在阻塞賦值時,先計算等號右手方向 rhs 的值,這時候賦值語句不允許別的verilog語句的干擾,直到現行的賦值過程完成,即將rhs計算得到的值賦給lhs 左手方向 然後才允許別的語句執行。從理論上來說...