SV中的automatic与static

本文详细解析了System Verilog(SV)中变量的生命周期概念,包括静态(static)和动态(automatic)变量的区别及其应用场景。通过具体示例展示了不同生命周期变量的行为特征。
module breakpoint;
int val1;
int val2;

int result1;//定义在这里,或者定义在未特殊声明的function/task中都是静态的方法
function int incr_static(input int a);
  $display("result1 = %0d", result1);
  result1 = a + 1;
  $display("result1 = %0d", result1);
  return result1;
endfunction

function automatic int incr_dynamic(input int a); //automatic 动态方法
//动态方法中的所有变量,如果不做特殊声明的话,都是动态的
  int result2;//动态函数调用静态变量的话,是会出错的吧
  $display("result2 = %0d", result2);
  result2 = a + 1;
  $display("result2 = %0d", result2);
  return result2;
endfunction

initial begin
//这里的val1值也是静态的
  val1 = 0;
  val1 = incr_static(val1); //这里会打印 0,1
  val1 = incr_static(val1);  // 这里会打印1,2
end

initial begin
//这里的val2值也是静态的
  val2 = 0;
  val2 = incr_dynamic(val2);
  val2 = incr_dynamic(val2); // breakpoint line14 result == ? 
end

endmodule

执行上述代码,仿真结果是:
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。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值