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