SV中的automatic与static【转】

 1 module breakpoint;
 2 int val1;
 3 int val2;
 4 
 5 int result1;//定义在这里,或者定义在未特殊声明的function/task中都是静态的方法
 6 function int incr_static(input int a);
 7   $display("result1 = %0d", result1);
 8   result1 = a + 1;
 9   $display("result1 = %0d", result1);
10   return result1;
11 endfunction
12 
13 function automatic int incr_dynamic(input int a); //automatic 动态方法
14 //动态方法中的所有变量,如果不做特殊声明的话,都是动态的
15   int result2;//动态函数调用静态变量的话,是会出错的吧
16   $display("result2 = %0d", result2);
17   result2 = a + 1;
18   $display("result2 = %0d", result2);
19   return result2;
20 endfunction
21 
22 initial begin
23 //这里的val1值也是静态的
24   val1 = 0;
25   val1 = incr_static(val1); //这里会打印 0,1
26   val1 = incr_static(val1);  // 这里会打印1,2
27 end
28 
29 initial begin
30 //这里的val2值也是静态的
31   val2 = 0;
32   val2 = incr_dynamic(val2);
33   val2 = incr_dynamic(val2); // breakpoint line14 result == ? 
34 end
35 
36 endmodule
View Code

执行上述代码,仿真结果是: 
result1 = 0 
result1 = 1 
result1 = 1 
result1 = 2

result2 = 0 
result2 = 1 
result2 = 0 
result2 = 2

依次解析 
result1 = 0 //int-有符号的二值变量,默认初始值为0 
result1 = 1 // 0+1 =1 
result1 = 1 //由于result1是静态变量,且作用域为当前module,所以一直存在,且可以被修改 
result1 = 2//

result2 = 0 
result2 = 1 
result2 = 0//由于result2是静态变量,且作用域为当前function,所以用完就销毁了下次调用就重新申明了 
result2 = 2


变量的生命周期

    • 在SV中,我们将数据的生命周期分为动态(automatic)和静态(static)。
    • 局部变量的生命周期同其所在域共存亡,例如function/task中的临时变量,在其方法调用结束后,临时变量的生命也将终结,所以它们是动态生命周期。
    • 全局变量即伴随着程序执行开始到结束一直存在,例如module中的变量默认情况下全部为全局变量,用户也可理解为module中的变量由于在模拟硬件信号,所以它们是静态生命周期。
    • 上面(这里略去了)的三个function被定义在了module内,分别被声明为了automatic、static和默认类型。
    • 对于automatic方法,其内部的所有变量默认也是automatic,即伴随automatic方法的生命周期建立和销毁。
    • 对于static方法,其内部的所有变量默认也是static类型。
    • 对于automatic或者static方法,用户可以对其内部定义的变量做单个声明,使其类型被显式声明为automatic或者static。
    • 对于static变量,用户在声明变量时应该同时对其做初始化,而初始化只会伴随它的生命周期发生一次,并不会随着方法调用被多次初始化。
    • 在module、program、interface、task和function之外声明的变量拥有静态的生命周期,即存在于整个仿真阶段,这同C定义的静态变量一致。
    • 在module、interface和program内部声明,且在task、process或者function外部声明的变量也是static变量,且作用域在该块中。在module、program和interface中定义的task、function默认都是static类型。
    • 在过程块中(task、function、process)定义的变量均跟随它的作用域,即过程块的类型。如果过程块为static,则它们也默认为static,反之亦然。这些变量也可以由用户显式声明为automatic或者static。
    • 为了使得在过程块中声明的变量有统一默认的生命周期,可以在定义module、interface、package或者program时,通过限定词automatic或者static来区分。对于上述程序块默认的生命周期类型为static。

猜你喜欢

转载自www.cnblogs.com/icdesign/p/9541957.html
今日推荐