1. 程式人生 > >關於Verilog中的幾種賦值語句

關於Verilog中的幾種賦值語句

變量數據類型 ril 存儲 函數的調用 能夠 兩種 sig 註意 調用

http://www.cnblogs.com/nanoty/archive/2012/10/21/2733017.html

1. 連續賦值語句(Continuous Assignments)

連續賦值語句是Verilog數據流建模的基本語句,用於對線網進行賦值,等價於門級描述,是從更高的抽象角度來對電路進行描述。連續賦值語句必須以關鍵詞assign開始。

連續復制的主要特點是:

  • 連續賦值語句的左值可以是一下類型之一:

①標量線網

②向量線網

③矩陣中的一個元素(該矩陣可以是標量線網類型的,也可以是向量線網類型的)

④向量線網的某一位

⑤向量線網的部分位

以及上述各種類型的拼接體

但是,不能是向量或向量寄存器。

  • 連續賦值語句總是處於激活狀態。只要任意一個操作數發生變化,表達式就會被立即重新計算,並且將結果賦給等號左邊的線網。
  • 操作數可以是標量或向量的線網或寄存器,也可以是函數的調用。
  • 賦值延遲用於控制對線網賦予新值的時間,根據仿真時間單位進行說明。賦值延遲類似於門延遲,對於描述實際電路中的時序是非常重要的。

2. 過程賦值語句(Procedural Assignments)

過程賦值語句的更新對象是寄存器、整數、實數或時間變量等。這些類型的變量在被賦值後,其值將保持不變,直到被其他過程賦值語句賦予新值。過程賦值語句只有在執行到的時候才會起作用。過程賦值語句只能在initial或always語句內進行賦值,只能對變量數據類型賦值,同時initial和always中只能使用過程賦值語句。過程賦值語句的左值可以是以下類型之一:

①reg、整形數、實型數、時間寄存器變量或存儲器單元

②上述各種類型的位選(例如:addr[3])

③上述各種類型的域選(例如:addr[31:16])

④上面三種類型的拼接

過程性賦值語句包括兩種類型的賦值語句:阻塞賦值(=)和非阻塞賦值(<=)(其主要區別詳見各類Verilog參考書,這裏不再詳述)。

3. 過程連續賦值語句(Procedural Continuous Assignments

過程連續賦值是在過程塊內對變量或線網型數據進行連續賦值,是一種過程性賦值,換言之,過程性連續賦值語句是一種能夠在always或initial語句塊中出現的語句。這種賦值可以改寫(Override)所有其他語句對線網或者變量的賦值。這種賦值允許賦值表達式被連續的驅動進入到變量或線網中去。

過程連續賦值語句有兩種類型:

①assign和deassign過程性語句:對變量進行賦值。

②force和release過程性語句:主要用於對線網賦值,也可以用於對變量賦值。

3.1 assign和deassign語句

assign和deassign語句構成了一類過程性連續賦值語句,只能用於對寄存器類型變量的連續賦值操作,不能用來對線網類型數據進行連續賦值操作。

①assign語句

語法:assign <寄存器類型變量> = <賦值表達式>;

assign在執行時,寄存器類型變量將由賦值表達式進行連續驅動,即進入連續賦值狀態。如果此時有普通的過程賦值語句對該寄存器變量進行過程賦值操作,由於過程連續賦值語句assign的優先級高於普通過程賦值語句,所以出於連續賦值狀態的寄存器變量將忽略普通過程賦值語句對它的過程賦值操作,其邏輯狀態仍然由過程連續賦值語句內的賦值表達式所決定。

如果先後有兩條assign語句對同一寄存器變量進行了過程連續賦值操作,那麽第二條assign的執行將覆蓋第一條assign的執行效果。

②deassign語句

語法:deassign <寄存器類型變量>;

deassign語句是一條撤銷連續賦值語句,用來結束對變量的連續賦值操作。當deassign語句執行後,原來由assign語句對該變量進行的連續賦值操作將失效,寄存器變量被連續賦值的狀態將得到解除,該變量又可以由普通過程賦值語句進行賦值操作了。這裏需要註意一點,當執行該語句撤銷對某寄存器變量的連續賦值後,該寄存器變量仍將保持使用該語句之前的原有值。

③示例:

技術分享圖片

上述語句執行過程如下:

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語句對變量或者線網施加的過程連續賦值將失效,變量將解除被被連續賦值的狀態,較低優先級的賦值語句的賦值操作將有效。

③示例:

技術分享圖片

s0:實現對變量var_reg1的過程賦值操作,即var_reg1被賦值為3‘b000;

s1:執行assign過程連續賦值語句,用來實現對變量var_reg2的連續賦值,從而var_reg2將被連續賦值為3‘b001;

s2:在執行本條語句時,var_reg1未被assign語句進行過連續賦值操作,因此var_reg1被force連續賦值為3‘b100;

s3:執行本條語句後,var_reg2被force連續賦值為3‘b100;

s4:執行本條語句時,因為變量var_reg1將退出連續賦值的狀態,因為var_reg1未曾被assign語句進行過連續賦值操作,故var_reg1取值保持不變,即保持force狀態時的值3‘b100;

s5:執行本語句時,因為var_reg2在執行s3之前已經由s1實現了連續賦值,所以在本條語句s5執行後,變量var_reg2將恢復到由assign語句s1確定的連續賦值狀態,即3‘b001;

4. 賦值語句的區別

4.1 連續賦值語句和過程賦值語句之間的區別

  • 連續賦值語句由assign來標示,而過程賦值語句不能包含這個關鍵詞;
  • 連續賦值語句中左側的數據類型必須是線網數據類型,而過程賦值語句中的被賦值數據類型則必須是寄存器類型的變量;
  • 連續賦值語句不能出現在過程塊(initial或always)中,而過程賦值語句可以;
  • 連續賦值語句主要用來對組合邏輯電路進行建模以及對線網數據間的連接進行描述,而過程賦值語句主要用來對時序邏輯電路進行行為描述;
  • 連續賦值語句對被賦值線網型數據的賦值是“連續”的(即賦值表達式的任何變化都會在立刻反應在線網數據的取值上),而過程性賦值語句,只有在過程賦值語句被執行時才執行賦值操作,語句執行完後被賦值變量的取值不再受到賦值表達式的影響(註意這裏的一次是指:在initial塊中,過程性賦值只順序執行一次,而在always塊中,每一次滿足always的條件時,都要順序執行一次該always塊中的語句。)。
  • 連續賦值與過程賦值的區別:

過程賦值

連續賦值

assign

無assign(過程性連續賦值除外)

有assign

符號

使用“=”或“《=”

只使用“=”

位置

在always語句或initial語句中均可出現

不可出現於always語句和initial語句

執行條件

與周圍其他語句有關

等號右端操作數的值發生變化時

用途

驅動寄存器

驅動線網

4.2 過程連續賦值語句和連續賦值語句之間的區別

  • 過程連續賦值語句只能用在過程塊(initial過程快或always過程塊)內,而連續賦值語句不能出現在過程塊中。
  • 過程連續賦值語句可以對寄存器類型變量進行連續賦值(其中force-release語句還可以對線網進行連續賦值),但是其賦值目標不能是變量或線網的某一位或某幾位,而連續賦值語句只能對線網數據進行賦值,賦值目標可以是線網型數據的某一位或某幾位。

關於Verilog中的幾種賦值語句