全局变量和局部变量

在讨论静态变量和动态变量之前,我们先说全局变量和局部变量的概念。

  • 局部变量的生命周期同其所在域,例如function/task中的变量,在方法调用结束后,这些变量的也将消失,所以它们是动态生命周期;
  • 全局变量是从仿真开始到结束一直存在的,例如module中的变量默认情况下全部为全局变量,这也可以理解为module中的变量是硬件电路中实际存在的信号和连接,所以它们是静态生命周期;

静态变量和动态变量

变量可以分为动态(automatic)和静态(static),静态变量的特点:

  • 该变量将被这个类的所有实例所共享,并且使用范围仅限这个类
  • 静态变量在声明时就应该对其初始化,它只初始化一次,也就是在仿真0时刻就存在。
  • 可以认为声明在类中的静态成员变量,它是保存在类中,而不是在对象中,它会一直存在的,不会因为对象被销毁而消失。
  • 静态变量可以在类没有被实例化的时候调用,通过 class::static_variable 的方式获取静态变量。

动态变量的特点:

  • 动态变量是类在实例化时,即调用构造函数new( )才会初始化。
  • 它的声明周期随着对象而存在,当对象被销毁时,这个变量就也就消失了。
  • 必须要在类被实例化之后才可以调用。

如下,使用静态变量count来计数所创建的实例数目:

class Transaction;static int count = 0;int id;function new();id = count++;endfunction
endclassTransaction t1,t2;
initial begint1 = new(); // t1 中:count = 1,id =0t2 = new(); // t2 中:count = 2,id =1$display("t2中count=%0d和id=%0d",t2.count,t2.id);$display("Transaction中count=%0d",Transaction::count);
end//Transaction类中:count = 2

解释代码:

  • 每例化一次transaction,count就自加1
  • 第一次在例化时,cout值为0,所以对象 t1 中的 id = 0;
  • 类的构造函数调用完后,使得count自加1,count = 1;
  • 第二次在例化时,cout值为1,所以对象 t2 中的 id = 1;
  • 可以通过Transaction::count的方式,访问类中的静态变量,此时类中的count = 2;

静态方法和动态方法

static 和 automatic 除了可以修饰类中的成员变量,还可以修饰 function 和 task,被static修饰的方法称为静态方法。
静态方法的特点:

  • 如果方法被static修饰,那么其内部所有的声明的变量都是 static 的;
  • 静态方法可以在类没有被实例化时被调用,通过 :: 操作符获取,具有全局的静态生命周期;
  • 如果方法被声明为static,那么在仿真开始时即会被创建,且可以被多个进程和方法共享;

动态方法的特点:

  • 如果方法被修饰为 automatic,那么其内部所有的声明的变量默认都是 automatic的;
  • 如果被修饰为 automatic,那么在进入该方法后,automatic变量会被创建,而离开该进程/方法后就被销毁;

静态方法和动态方法的区别,如下:

module static_test;function automatic int cnt1(input a);  // 函数内所有的变量均为automatic int cnt = 0; //这个变量在每次调用时都会初始化cnt += a ;return cnt;endfunctionfunction static int cnt2(input a);  // 函数内所有的变量均为staticstatic int cnt = 0; //这个static 变量 cnt只会初始化一次cnt += a ;return cnt;endfunctionfunction int cnt3(input a);  // module中的方法默认为staticint cnt = 0; //这个static 变量 cnt只会初始化一次cnt += a ;return cnt;endfunction
endmoduleinitial begin$display("%0d",cnt1(1));  // 输出1$display("%0d",cnt1(1));  // 输出1$display("%0d",cnt2(1));  // 输出1$display("%0d",cnt2(1));  // 输出2$display("%0d",cnt3(1));  // 输出1$display("%0d",cnt3(1));  // 输出2
end

解释代码:

  • 函数声明为automatic或static时,其块内所有的变量都是automatic或static的;
  • automatic类型的变量随函数调用结束后就销毁了,下次再调用时,又会初始化;
  • static类型的变量随函数调用结束后不会被销毁,下次调用时也不需要重新初始化;
  • module内的方法默认是static的

SV中的规定

  • 在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。

static 和 automatic 修饰(systemverilog)相关推荐

  1. Systemverilog中static、automatic区别

    一.静态变量.动态变量说明:Systemverilog绿皮书P60.补充说明如下: Verilog早期版本仅有静态生命周期的概念,同一个function或者task无论你调用多少次内部的变量都是分配的 ...

  2. SystemVerilog学习笔记4 ---《变量范围、lifetime、static和automatic》

    先明确下基本的概念 block:块.一些关键字组成的一个范围区间,就叫做块.如 module - endmodue / task - endtask / begin - end / fork - jo ...

  3. SV笔记:static 和 automatic 概念及相关规定

    目录 1 首先总结如下: 2 全局变量和局部变量 3 静态变量和动态变量 4 静态方法和动态方法 1 首先总结如下: class中成员和方法默认为automatic,program.module.in ...

  4. 【Java4】实例初始化,类初始化,/接口,多态,final/static,权限修饰符/native

    文章目录 1.实例初始化过程:有几个构造器,就会有几个实例初始化方法 2.实例初始化和类初始化结合:先类(静态)后实 3.接口:只有abstract可省 3.1 鸟类案例:Flyable相当于父类的一 ...

  5. JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配

    JAVA基础-栈与堆,static.final修饰符.内部类和Java内存分配 发布时间: 2013/01/12 22:29 QQ空间 新浪微博 腾讯微博 人人网 豆瓣网 百度空间 百度搜藏 开心网 ...

  6. Java中的public static final来修饰数组与接口变量

    Java中的public static final来修饰数组与接口变量 public static final来修饰数组 final对数组的作用 怎样实现对数组的public static final ...

  7. static作用(修饰函数、局部变量、全局变量)

    C语言:static作用(修饰函数.局部变量.全局变量) 一. static全局变量与普通的全局变量有什么区别 ? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.   全局 ...

  8. C语言:static作用(修饰函数、局部变量、全局变量)

    C语言:static作用(修饰函数.局部变量.全局变量) 一. static全局变量与普通的全局变量有什么区别 ? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.  全局变 ...

  9. 面向对象(内部类,static,包,访问修饰符,final)

    final final是最终修饰符,可以修饰类.成员方法.变量. final修饰的类无法被继承. final修饰的方法无法被重写. final修饰的变量无法被再次赋值,变为了常量. final修饰的引 ...

最新文章

  1. go kegg_差异基因的GO与KEGG注释
  2. 常用maven插件总结
  3. 操作系统实验2—实现动态分区分配模拟程序
  4. python PyQt5 QColor()函数
  5. 流水线可靠数据传输协议
  6. 说干就干的p2psearcher2013
  7. 终于有人把计算机视觉讲明白了。。。
  8. java 怎么匹配文章_Java 14 之模式匹配,非常赞的一个新特性!
  9. 将tomcat设置成window自启动服务
  10. py 的 第 12 天
  11. Mysql SQLyog 使用详解
  12. HTTP幂等性及GET、POST、PUT、DELETE的区别
  13. airdrop搜不到对方_如何将AirDrop图标添加到您的macOS Dock
  14. java 向量存储_关于java:使用AES-256和初始化向量进行加密
  15. NFS服务器配置与管理笔记
  16. mysql删除视图sql语句_怎么样删除视图中的全部数据 用SQL语言编写。
  17. 双绞线绞合消除电磁干扰原理
  18. 惠普彩色激光打印机CM1312送稿台卡纸不能消除解决办法
  19. LLVM IR转CFG
  20. 三菱模拟量fx3u4da_模拟量输出模块FX3U-4DA手册三菱FX3U-4DA安装使用手册 - 广州凌控...

热门文章

  1. 华为耳机5根线怎么接线图解_【技能】小白耳机维修入门--各种耳机插头接线图--耳机维修汇总贴...
  2. week-15(ZJM 与霍格沃兹)
  3. 我的世界服务器方块高度修改,我的世界:Mojang解除建筑高度限制,最高可达2032格,玩家狂喜!...
  4. ADS2017安装步骤
  5. 同样的代码不同环境 提示握手失败:ssl_client_socket_impl.cc handshake failed
  6. android 导航安全密码,您导航的v5.3.8 Android版本
  7. 【VUE】vue+vue-cropper实现上传剪裁图片
  8. Acer 4750 安装黑苹果_黑苹果安装体验初始阶段几个小技巧
  9. MacOS上高效管理SSH服务器-Core Shell
  10. iOS开发UI篇—ios应用数据存储方式(偏好设置)