1. 連續賦值語句(Continuous Assignments)
連續賦值的主要特點:
1)語法上,有關鍵詞“assign”來標識;
2)連續賦值語句不能出現在過程塊中(initial/always);
3)連續賦值語句主要用來對組合邏輯進行建模以及線網數據間進行描述;
4)左側被賦值的數據類型必須是線網型數據(wire)
連續賦值語句的左值可以是一下類型之一:
①標量線網
②向量線網
③矩陣中的一個元素(該矩陣可以是標量線網類型的,也可以是向量線網類型的)
④向量線網的某一位
⑤向量線網的部分位
以及上述各種類型的拼接體
但是,不能是向量或向量寄存器。
5)連續賦值語句產生作用后,賦值表達式中信號的任何變化都將立即被反映到賦值線網型數據的取值上;
連續賦值語句總是處於激活狀態。只要任意一個操作數發生變化,表達式就會被立即重新計算,並且將結果賦給等號左邊的線網。
操作數可以是標量或向量的線網或寄存器,也可以是函數的調用。
賦值延遲用於控制對線網賦予新值的時間,根據仿真時間單位進行說明。賦值延遲類似於門延遲,對於描述實際電路中的時序是非常重要的。
2. 過程賦值語句(Procedural Assignments)
過程賦值的主要特點:
1)語法上,沒有關鍵詞assign;
2)過程賦值語句的左值可以是以下類型之一:
①reg、整形數、實型數、時間寄存器變量或存儲器單元
②上述各種類型的位選(例如:addr[3])
③上述各種類型的域選(例如:addr[31:16])
④上面三種類型的拼接
3)過程賦值語句只能在initial或always語句內進行賦值,只能對變量數據類型賦值,同時initial和always中只能使用過程賦值語句。
4)在過程賦值語句的情況下,只有在過程賦值語句被執行時才執行賦值操作,語句執行完后被賦值變量的取值不再受到賦值表達式的影響, 這些類型的變量在被賦值后,其值將保持不變,直到被其他過程賦值語句賦予新值。過程賦值語句只有在執行到的時候才會起作用。
5)過程性賦值語句包括兩種類型的賦值語句:阻塞賦值(=)和非阻塞賦值(<=)。
3. 過程連續賦值語句(Procedural Continuous Assignments)
過程連續性賦值語句的主要特點:
1)過程連續賦值是在過程塊內對變量或線網型數據進行連續賦值,是一種過程性賦值,換言之,過程性連續賦值語句是一種能夠在always或initial語句塊中出現的語句。
2)這種賦值可以改寫(Override)所有其他語句對線網或者變量的賦值。這種賦值允許賦值表達式被連續的驅動進入到變量或線網中去;過程性連續賦值語句比普通的過程賦值語句有更高的優先級。
3)過程連續賦值語句有兩種類型:
force語句的優先級高於assign 。
①assign和deassign過程性語句:
只能用於對寄存器型變量的連續賦值操作,而不能用來對線網型數據進行連續賦值操作;
deassign 撤銷對某一個寄存器型變量的連續賦值后,該寄存器變量仍然保持deassign操作之前的取值。
②force和release過程性語句:它不僅能對寄存器型變量產生作用,也對線網型數據產生作用。
3.1 assign和deassign語句
assign和deassign語句構成了一類過程性連續賦值語句,只能用於對寄存器類型變量的連續賦值操作,不能用來對線網類型數據進行連續賦值操作。
①assign語句
語法:assign <寄存器類型變量> = <賦值表達式>
assign在執行時,寄存器類型變量將由賦值表達式進行連續驅動,即進入連續賦值狀態。如果此時有普通的過程賦值語句對該寄存器變量進行過程賦值操作,由於過程連續賦值語句assign的優先級高於普通過程賦值語句,所以出於連續賦值狀態的寄存器變量將忽略普通過程賦值語句對它的過程賦值操作,其邏輯狀態仍然由過程連續賦值語句內的賦值表達式所決定。
如果先后有兩條assign語句對同一寄存器變量進行了過程連續賦值操作,那么第二條assign的執行將覆蓋第一條assign的執行效果。
②deassign語句
語法:deassign <寄存器類型變量>
deassign語句是一條撤銷連續賦值語句,用來結束對變量的連續賦值操作。當deassign語句執行后,原來由assign語句對該變量進行的連續賦值操作將失效,寄存器變量被連續賦值的狀態將得到解除,該變量又可以由普通過程賦值語句進行賦值操作了。這里需要注意一點,當執行該語句撤銷對某寄存器變量的連續賦值后,該寄存器變量仍將保持使用該語句之前的原有值。
reg [3:0] out;
initial begin
out = 4'b0000; //s0:過程賦值語句
#10;
assign out = a & b; //s1:第一條過程連續賦值語句
#10;
assign out = c & d; //s2:第二條過程連續賦值語句
assign out = e & f; //s3:第三條過程連續賦值語句
deassign out; //s4:撤銷連續賦值語句
end
上述語句執行過程如下:
s0:在0時刻,out被賦值為0,並且保持這個取值;
s1:在10時刻,s1開始執行,實現了對變量out的連續賦值操作,因此從10時刻開始,out將處於連續賦值狀態;
s2:在20時刻,s2開始執行,將覆蓋s1產生的作用,所以從20時刻開始,out將由c & d連續驅動;
s3:s3操作覆蓋掉s2操作;
s4:當deassign語句得到執行,變量out連續賦值狀態被解除,其取值將保持最后一次assign語句賦予的值,即“e & f”;
3.2 force和release語句
force和release語句與assign和deassign語句類似,也是一種過程連續賦值語句。這組賦值語句不僅能對寄存器類型變量產生作用,還能對線網類型數據進行連續賦值操作。
①force語句
語法:force <寄存器變量或者線網數據> = <賦值表達式>>;
force語句應用於寄存器類型變量時,則在force語句執行后,該寄存器變量將強制由<賦值表達式>進行連續驅動,進入被連續賦值的狀態,此時將忽略其他較低優先級的賦值語句對該寄存器變量的賦值操作,直到執行一條release語句來釋放對該寄存器變量的連續賦值為止。
force語句應用於線網數據時,則force語句執行后,對應的線網數據將得到<賦值表達式>的連續驅動,此時將忽略該線網數據上較低優先級的驅動,直到有一條release語句執行為止。
②release語句
語法:release <寄存器變量或者線網數據>
release語句執行后,原先由force語句對變量或者線網施加的過程連續賦值將失效,變量將解除被被連續賦值的狀態,較低優先級的賦值語句的賦值操作將有效。
`timescale 1ns/1ps
module test();
reg [2:0] reg1;
reg [2:0] reg2;
initial begin
reg1 = 3'b000; //s0:過程賦值語句
assign reg2 = 3'b001; //s1過程連續賦值語句
#10;
force reg1 = 3'b100; //s2:過程連續賦值語句
force reg2 = 3'b100; //s3:過程連續賦值語句
#10;
release reg1; //s4:撤銷連續賦值語句
release reg2; //s5:撤銷連續賦值語句
end
endmodule
s0:實現對變量reg1的過程賦值操作,即reg1被賦值為3'b000;
s1:執行assign過程連續賦值語句,用來實現對變量reg2的連續賦值,從而reg2將被連續賦值為3'b001;
s2:在執行本條語句時,reg1未被assign語句進行過連續賦值操作,因此reg1被force連續賦值為3'b100;
s3:執行本條語句后,var_reg2被force連續賦值為3'b100;
s4:執行本條語句時,因為變量reg1將退出連續賦值的狀態,因為reg1未曾被assign語句進行過連續賦值操作,故reg1取值保持不變,即保持force狀態時的值3'b100;
s5:執行本語句時,因為reg2在執行s3之前已經由s1實現了連續賦值,所以在本條語句s5執行后,變量reg2將恢復到由assign語句s1確定的連續賦值狀態,即3'b001;
4. 賦值語句的區別
4.1 連續賦值語句和過程賦值語句之間的區別
連續賦值語句由assign來標示,而過程賦值語句不能包含這個關鍵詞;
連續賦值語句中左側的數據類型必須是線網數據類型,而過程賦值語句中的被賦值數據類型則必須是寄存器類型的變量;
連續賦值語句不能出現在過程塊(initial或always)中,而過程賦值語句可以;
連續賦值語句主要用來對組合邏輯電路進行建模以及對線網數據間的連接進行描述,而過程賦值語句主要用來對時序邏輯電路進行行為描述;
連續賦值語句對被賦值線網型數據的賦值是“連續”的(即賦值表達式的任何變化都會在立刻反應在線網數據的取值上),而過程性賦值語句,只有在過程賦值語句被執行時才執行賦值操作,語句執行完后被賦值變量的取值不再受到賦值表達式的影響(注意這里的一次是指:在initial塊中,過程性賦值只順序執行一次,而在always塊中,每一次滿足always的條件時,都要順序執行一次該always塊中的語句。)。
4.2 過程連續賦值語句和連續賦值語句之間的區別
過程連續賦值語句只能用在過程塊(initial過程快或always過程塊)內,而連續賦值語句不能出現在過程塊中。
過程連續賦值語句可以對寄存器類型變量進行連續賦值(其中force-release語句還可以對線網進行連續賦值),但是其賦值目標不能是變量或線網的某一位或某幾位,而連續賦值語句只能對線網數據進行賦值,賦值目標可以是線網型數據的某一位或某幾位。