Verilog HDL語言中關于指派的一些概念
指派有四種方法:門基元,持續(連續)指派,過程阻塞指派(“=”)和非阻塞指派(“<=“)。這四種方法分成兩大類:門級時序模型和過程時序模型。
門級時序模型:
門基元:and(a,b,c);
又可寫成:assign a = b&c;
這兩個語句是等價的,兩者都是執行b和c的按位與運算,并将結果賦給a。無論什麼時候,隻要任何一個輸入(b或c)發生變化,都要重新計算輸出a的值。此外,a是個線網。
過程時序模型:
過程時序模型使用initial和always塊中的過程語句來産生新值。注意initial和always塊中的語句是順序執行的。
always塊:
[email protected](posedge clock)
Q <= D;
兩個輸入(clock和D)一個輸出Q。與門級時序相對應,過程指派對它的所有輸入不敏感;隻在特定的時刻對特定的輸入敏感。這裡,always隻對時鐘上升沿的變化敏感,當時鐘上升沿出現的時候,Q被D的值更新。但是,如果always塊的輸入端另一個輸入D改變了,Q的值并不更新。過程模型支隊它們顯示等待的輸入敏感,此外,所有過程指派語句的左側都是寄存器。
過程阻塞指派(“=”)立即更新它左邊的值,是以新值可以使用在下一條過程語句中。相反,過程非阻塞指派(“<=”)隻有當整個設計中等待同一邊沿的所有”<=”語句都計算完畢後才更新它左邊的值,可以形象地說新值别想在這次邊沿有效時使用。比如:
@(posedge clock)
m = 3;
n = 75;
n <= m;
r = n;
請問本次邊沿有效後什麼值賦給了r呢?答案是75,雖然第三條語句把n的值改為3,但是本次邊沿别想用這個新值,但“=”的賦的新值立即可用。
本質(這個本質就是電路實作)上講,這兩種時序模型與Verilog語言的兩種基本資料類型(線網和寄存器)有密切連續,持續指派和基元們隻能驅動線網,而過程指派隻能用于寄存器。
描述組合邏輯的always塊裡面用阻塞式指派 “=”;
描述時序邏輯的always塊裡面用非阻塞指派 “<=”