Verilog賦值語句
0 簡介
賦值分為“連續賦值語句”、“過程賦值語句”和“過程連續賦值語句”。
1 連續賦值語句
語法上,必須有assign關鍵字標識;
用於對線網進行賦值,等價於門級描述;
不能出現在過程塊(initial / always)中;
產生作用後,賦值表示式中的訊號任何變化都會立即反映到左值線網型資料中;
2 過程賦值語句
語法上,無assign關鍵字標識;
用於對變數(暫存器、整數、實數或時間)等賦值;
只能出現在過程塊中;
只有賦值語句被執行才賦值,即必須滿足過程塊中敏感訊號表還有過程塊中的各種條件語句才會執行,且執行完之後,即使右值(可能是表示式)發生變化,也不會影響到左值。
連續賦值與過程賦值區別如下
過程賦值 |
連續賦值 |
|
Assign |
無assign |
有assign |
符號 |
使用“=”或者“<=” |
只使用“=” |
位置 |
在always語句或initial語句 |
不可出現在always或initial語句 |
執行條件 |
與周圍其它條件有關 |
右值一旦發生變化即刻反映 |
用途 |
驅動暫存器 |
驅動網線 |
3 過程連續賦值語句
為了在過程塊中實現連續賦值的特性(需求何在?見例一),定義了過程連續賦值語句,使用的方法有兩種:assign-deassign 和 force-release。前者只能用於對暫存器型變數的連續賦值,而不能用於對線網資料連續賦值,後者則是兩者都可以進行連續賦值。
例一
module DEF(D,Clr,Clk,Q)
input D,Clr,Clk;
output Q;
reg Q;
always@(negedge Clk)
Q = D;
always@(Clr)
begin
if(!Clr)
assign Q = 0;
else
deassign Q;
end
endmodule
以上的程式段,第一個always會將Q的值賦為D,第二個always語句在Clr的值發生變化時執行,若Clr是由高電平變為低電平,則assign 有效,並一直保持這個賦值(直到遇到deassign),這時儘管第一個always也在執行(Clk的下降沿是不會起作用的),Q的值會一直保持“assign Q = 0;”,直到Clr來一個高電平為止(deassign Q語句執行)。
4 我的理解
作為碼農,在有了上述非常官方的解釋闡述後,應該總結出對於在日常搬磚過程中的起到的作用。
1)如果你需要對網線型資料賦值時,那麼你只能在結構體外進行連續型賦值,此時你也只能使用“=”進行賦值。
2)如果你需要對變數賦值,那麼你只能在結構體內進行過程賦值,此時你可以使用“=”或者“<=”,根據你的需求是阻塞式還是非阻塞式。
3)如果你一定要將線網型資料在過程塊內使用那麼你就在使用過程連續賦值語句(目前為止只有在寫testbench時使用過),那麼你只能使用過程連續賦值語句,但是仍然只能使用“=”進行賦值。
同時,你需要理解賦值完成之後,它是如何產生變化的,是否滿足需求。
參考文獻
http://www.cnblogs.com/nanoty/archive/2012/10/21/2733017.html
http://shihchieh.lofter.com/post/1785ab_447edf