變量可以分為3類,即Static、Automatic、和Local。如下表所示。
Static vs. Local Variables
下面的這個例子可以看出Static變量和Local變量的區別:
static int n; // Static variable – outside ‘module’ – // globally declared //visible to all modules/scopes that follow. module vars; int n; //Local variable - Module level - visible to all scopes below initial begin n = 2; $display("module level ‘n’ = %0d",n); end initial begin : init2 int n; //Local - Block level n = 3; $display("block level ‘n’ = %0d",n); $unit::n = 4; //Static Global $display("Statically declared ‘n’ = %0d",$unit::n); end initial begin //hierarchical reference to local variable $display("init2.n = %0d", init2.n); end endmodule module next; //Static variable 'n' is visible in the module 'next' initial begin $display("Statically declared 'n' in module 'next' = %0d",$unit::n); end endmodule
Simulation log:
module level ‘n’ = 2 block level ‘n’ = 3 Statically declared ‘n’ = 4 init2.n = 3 Statically declared 'n' in module 'next' = 4 V C S S i m u l a t i o n R e p o r t
首先,我們在module ' vars '外面聲明一個靜態變量" int n "。使得這個靜態變量n對后面的所有模塊都可見。
或者說這個靜態變量的作用域不在某個module內,而在整個編譯域$unit內。
然后,在module“vars”中聲明另一個變量“int n”并賦值2,所以這個n是一個module-level的變量,僅對module vars可見。
然后在過程塊init2中聲明另一個變量int n
,并賦值為3,使得n只對指定的語句塊init2可見。
為了給靜態聲明的變量“n”賦值,我們需要使用
$unit::n = 4;
block-level “init2.n”可以從其他過程塊中訪問。
initial begin //hierarchical reference to local variable $display("init2.n = %0d", init2.n); end
Automatic變量 vs. Static 變量
Automatic變量在每次進入語句塊時被重新分配內存空間和初始化。相比之下,靜態變量只被分配內存空間和初始化一次。
下面是Automatic變量和Static 變量比較的一個示例:
module autovars; initial begin for (int i=0; i<2; i++) begin automatic int loop3 = 0; // executes every loop for (int j=0; j<2; j++) begin loop3++; $display("loop3=%0d",loop3); end end // loop3 = 1 2 1 2 for (int i=0; i<2; i++) begin static int loop2 = 0; // executes once at time zero for (int j=0; j<2; j++) begin loop2++; $display("loop2=%0d",loop2); end end // loop2 = 1 2 3 4 end endmodule : autovars
在本例中,有兩個for循環。第一個for循環聲明了一個名為“loop3”的“automatic”變量,初始值為0。
第二個for循環聲明了一個名為loop2的靜態變量,初始化為0。
simulation log:
loop3=1 loop3=2 loop3=1 loop3=2 loop2=1 loop2=2 loop2=3 loop2=4
在第一個for循環中,automatic變量每次循環時重新初始化。
simulation log:
loop3=1 loop3=2 loop3=1 loop3=2
相比之下,第二個for循環的靜態變量只會初始化一次。
simulation log:
loop2=1 loop2=2 loop2=3 loop2=4
審核編輯:湯梓紅
-
變量
+關注
關注
0文章
613瀏覽量
28360 -
static
+關注
關注
0文章
33瀏覽量
10366 -
locale
+關注
關注
0文章
11瀏覽量
1173
原文標題:SystemVerilog中的Static變量, Automatic變量和Local變量
文章出處:【微信號:芯片驗證工程師,微信公眾號:芯片驗證工程師】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論