Static变量和Local变量的区别

描述

变量可以分为3类,即Static、Automatic、和Local。如下表所示。
static

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

 

  审核编辑:汤梓红

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分