变量可以分为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条评论
快来发表一下你的评论吧 !