在systemverilog中方法也可以聲明為“static”。靜態方法意味著對類的所有對象實例共享。
在內存中,靜態方法的聲明存儲在一個同一個地方,所有對象實例都可以訪問。
另外,靜態方法可以在類外部訪問,即使還沒有實例化任何一個類對象。
靜態方法只能訪問靜態屬性。
從靜態方法訪問非靜態屬性會導致編譯錯誤,靜態方法也不能是virtual的,也不能使用“this”句柄。
module class_TOP( ); class base; static logic [31:0] data ; //static property logic [31:0] addr; //dynamic property static task munge; //Static method data = 32'h f0f0_f0f0; //OK to access static variable //addr = 32'h ff_0000; //NOT OK since 'addr' is not static $display("data = %h", data); endtask endclass : base base base1; initial begin base1.munge; end initial #10 $fnish(2); endmodule
仿真log:
data = f0f0f0f0 $fnish at simulation time 10 V C S S i m u l a t i o n R e p o r t
在本例中,我們在類“base”中聲明了一個名為“munge”的靜態方法。
我們訪問“munge”可以使用尚未完成實例化的對象句柄“base1”。
需要注意的是,靜態方法“munge”只能索引靜態變量“data”,如果取消下面這行代碼的注釋,則會發生編譯錯誤。
因為“addr”不是靜態變量,需要實例化后使用對象的句柄才能訪問。
//addr = 32'h ff_0000; //NOT OK since 'addr' is not static
靜態函數訪問非靜態變量,會導致編譯錯誤:
Error-[SV-AMC] Non-static member access testbench.sv, 9 class_TOP, "addr" Illegal access of non-static member 'addr' from static method 'base::munge'.
還可以使用類解析操作符訪問靜態方法,建議使用這種方法,因為它清楚地標識了我們正在訪問一個靜態方法。
class setIt; static int k; static function set (int p ); k = p + 100; endfunction endclass module tbTop; initial begin setIt::set(10); $display("k = %0d",setIt::k); setIt::set(20); $display("k = %0d",setIt::k); end endmodule
仿真log:
k = 110 k = 120 V C S S i m u l a t i o n R e p o r t
靜態變量和靜態方法隸屬于一個類,而不是類的某個對象實例。如果在靜態方法前面加上virtual,你會得到一個編譯錯誤:
class base; virtual static task munge(); endtask endclass
編譯log:
Error-[WUCIQ] Invalid qualifer usage testbench.sv, 32 Invalid use of class item qualifers. Cannot use virtual and static keywords together for method declarations.
審核編輯:劉清
-
Verilog語言
+關注
關注
0文章
113瀏覽量
8237
原文標題:SystemVerilog中的Static方法
文章出處:【微信號:芯片驗證工程師,微信公眾號:芯片驗證工程師】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論