静态和自动变量
靜態和自動變量
自動變量–也可以稱為動態變量,主要是用來描述在測試程序、抽象系統級、交易級或總線功能模型中的驗證程序。自動變量的另一個用途就是編寫可重入的任務,當一個任務的前一次調用仍然在執行時,可以再次對其調用。
自動變量也允許編寫遞歸函數–函數調用其自身。含有自動變量的任務或者函數的每次調用,都建立新的變量儲存空間,當訪問結束后,空間被釋放。
在Verilog中,通過聲明整個任務或者函數是自動的,來聲明自動變量。自動任務或函數中的所有變量都是動態的。
SystemVerilog加入了靜態和自動變量聲明
SystemVerilog增加了聲明靜態和自動變量的能力。SystemVerilog增加了一個static關鍵字,允許任何變量被顯性地聲明為static或者automatic。這個聲明時變量聲明的一部分,可以出現在任務、函數、begin …end塊或者fork…join塊中。注意在module一級聲明的變量不能顯示聲明為static或者automatic。在模塊級,所有變量都是靜態的。
在模塊、begin…end塊、fork…join塊以及非自動的任務和函數中,所有的儲存方式都缺省為靜態的,除了被顯式地聲明為動態的。如果一個任務和函數被聲明為自動的,則所有的儲存方式默認為自動的,除非被顯式地聲明為靜態的。
靜態變量和自動變量的初始化
Verilog變量的內嵌(in-line)變量初始化
Verilog只允許在模塊級聲明進行內嵌初始化,在任務、函數、begin…end塊及fork…join塊中聲明的變量不能在聲明時志初始值。
SystemVerilog的內嵌初始化
初始化靜態和自動變量
SystemVerilog對Verilog進行了擴展,在任務、函數聲明的變量可以有內嵌初始值。
在非自動任務和函數聲明的變量默認是靜態的。內嵌初始值將在仿真開始前進行一次賦值。對任務或者函數的再次調用不會重新初始化變量。
靜態變量只初始化一次
//在一個靜態函數中顯式地聲明自動變量 function int count_ones (input [31:0] data);logic [31:0] count = 0; //只初始化一次logic [31:0] temp = data; //只初始化一次for (int i = 0; i <= 32 ; i++)beginif(temp[0]) count ++;temp >> 1;endreturn count; endfunction自動變量每次調用時都只初始化
在非自動任務和函數中顯式地聲明為自動的變量在每次任務和函數調用時都會動態地創建,調用完畢會動態地釋放。函數或任務每次調用都會對內嵌初始值賦值。
在自動任務和函數聲明的變量默認是自動的。每次進入任務和函數時,都會為變量動態地創建儲存區,調用完畢釋放。每次調用任務或函數時,內嵌初始值都會被賦值。
如果想使硬件模型中的自動變量是可綜合的,則它只能用于表示暫時儲存–不會傳送到任務、函數或過程塊的外部。
注意:靜態變量初始化是不可綜合的,動態變量初始化是可綜合的。 用const限定詞聲明的變量的內嵌初始值也是可綜合的靜態和自動變量的使用原則
(1)在always和initial塊中,如果無內嵌初始化則使用靜態變量,而需要內嵌初始化的使用自動變量。使用帶內嵌初始化的變量,所表現的行為最直觀,因為過程塊每次被重新執行,自動變量都會重新初始化。
(2)如果一個任務和函數會是可重入的,則應該設成自動的。變量也應該是自動的,除非有特殊的原因需要在兩次調用之間保持變量的值。一個簡單的例子,如果需要用一個變量來記錄任務或者函數被調用的次數,則這個變量應該是靜態的。
(3)如果一個任務和函數用來描述硬件的獨立部分,并且不是可重入的,那么應該把它聲明為靜態的,任務和函數中的所有變量也應該是靜態的。
總結
- 上一篇: 关于kafka中ISR、AR、HW、LE
- 下一篇: debug设计