變量可以分為3類,即Static、Automatic、和Local。如下表所示。
Static vs. Local Variables
下面的這個(gè)例子可以看出Static變量和Local變量的區(qū)別:
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
首先,我們?cè)趍odule ' vars '外面聲明一個(gè)靜態(tài)變量" int n "。使得這個(gè)靜態(tài)變量n對(duì)后面的所有模塊都可見(jiàn)。
或者說(shuō)這個(gè)靜態(tài)變量的作用域不在某個(gè)module內(nèi),而在整個(gè)編譯域$unit內(nèi)。
然后,在module“vars”中聲明另一個(gè)變量“int n”并賦值2,所以這個(gè)n是一個(gè)module-level的變量,僅對(duì)module vars可見(jiàn)。
然后在過(guò)程塊init2中聲明另一個(gè)變量int n
,并賦值為3,使得n只對(duì)指定的語(yǔ)句塊init2可見(jiàn)。
為了給靜態(tài)聲明的變量“n”賦值,我們需要使用
$unit::n = 4;
block-level “init2.n”可以從其他過(guò)程塊中訪問(wèn)。
initial begin //hierarchical reference to local variable $display("init2.n = %0d", init2.n); end
Automatic變量 vs. Static 變量
Automatic變量在每次進(jìn)入語(yǔ)句塊時(shí)被重新分配內(nèi)存空間和初始化。相比之下,靜態(tài)變量只被分配內(nèi)存空間和初始化一次。
下面是Automatic變量和Static 變量比較的一個(gè)示例:
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
在本例中,有兩個(gè)for循環(huán)。第一個(gè)for循環(huán)聲明了一個(gè)名為“l(fā)oop3”的“automatic”變量,初始值為0。
第二個(gè)for循環(huán)聲明了一個(gè)名為loop2的靜態(tài)變量,初始化為0。
simulation log:
loop3=1 loop3=2 loop3=1 loop3=2 loop2=1 loop2=2 loop2=3 loop2=4
在第一個(gè)for循環(huán)中,automatic變量每次循環(huán)時(shí)重新初始化。
simulation log:
loop3=1 loop3=2 loop3=1 loop3=2
相比之下,第二個(gè)for循環(huán)的靜態(tài)變量只會(huì)初始化一次。
simulation log:
loop2=1 loop2=2 loop2=3 loop2=4
審核編輯:湯梓紅
-
變量
+關(guān)注
關(guān)注
0文章
613瀏覽量
28360 -
static
+關(guān)注
關(guān)注
0文章
33瀏覽量
10366 -
locale
+關(guān)注
關(guān)注
0文章
11瀏覽量
1173
原文標(biāo)題:SystemVerilog中的Static變量, Automatic變量和Local變量
文章出處:【微信號(hào):芯片驗(yàn)證工程師,微信公眾號(hào):芯片驗(yàn)證工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論