目录

1 首先总结如下:

2 全局变量和局部变量

3 静态变量和动态变量

4 静态方法和动态方法


1 首先总结如下:

class中成员和方法默认为automatic,program、module、interface、package中函数和任务和变量默认为静态的。

2 全局变量和局部变量

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

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

3 静态变量和动态变量

变量可以分为动态(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;

4 静态方法和动态方法

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、interface和program中定义的task、function默认都是static类型。
  • 在过程块中(task、function、process)定义的变量均跟随它的作用域,即过程块的类型,如果过程块为static,则它们也默认为static,反之亦然。这些变量也可以由用户显式声明为automatic或者static。

以上规定大致总结如下:class中成员和方法默认为automatic动态的,program、module、interface、package中函数和任务和变量默认为静态的。

SV笔记:static 和 automatic 概念及相关规定相关推荐

  1. Unix C学习笔记10 进程的概念,相关命令,父子孤尸,进程标识,创建子进程

    进程的概念 相关命令 pstree显示bash进程 ps显示进程,以快照方式,显示某一瞬间进程状态 ps aux top显示实时进程信息,会动态变化 父子孤尸 进程标识 会重用,但不会立马重用PID ...

  2. 区块链笔记:区块链概念、相关对比、技术特点、CAP定理、FLP定理、价值网络

    什么是区块链 对于区块链这个技术名词出现在很多文章里面,有很多解释.站在技术角度来说,它是指一种数据的记录格式,任何系统都要记录数据,区块链对于其他的数据库或者工具有什么不一样的地方呢? 记录数据的方 ...

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

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

  4. 数据结构笔记(三十)-- 查找的基本概念和相关的顺序查找

    查找的基本概念和相关的顺序查找 一.查找 1.查找与查找表的定义 2.对查找表的操作 3.查找的结果 二.如何查找 1.查找方法 2.比较式查找方法的评价方式 主要是根据平均查找长度进行评价 三.顺序 ...

  5. static 和 automatic 修饰(systemverilog)

    全局变量和局部变量 在讨论静态变量和动态变量之前,我们先说全局变量和局部变量的概念. 局部变量的生命周期同其所在域,例如function/task中的变量,在方法调用结束后,这些变量的也将消失,所以它 ...

  6. 机器学习的基本概念和相关术语

    文章目录 一.什么是机器学习 二.机器学习的相关术语 三.机器学习的典型任务 四.假设与假设空间 五.假设的选择原则 六.机器学习的三要素 推荐文章 一.什么是机器学习 人工智能标准化白皮书(2018 ...

  7. Systemverilog中static、automatic区别

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

  8. QML笔记:QML基本概念及使用

    QML笔记:QML基本概念及使用 Qt5中的Qt Qml和Qt Quick架构 Qt Qml模块本身并没有涉及图形显示,所有的图形处理都由Qt Quick模块完成. Qt Quick 以QPA(Qt ...

  9. tensorflow笔记:流程,概念和简单代码注释

    tensorflow是google在2015年开源的深度学习框架,可以很方便的检验算法效果.这两天看了看官方的tutorial,极客学院的文档,以及综合tensorflow的源码,把自己的心得整理了一 ...

最新文章

  1. [转]VS2015编译的程序在其他机器上缺少msvcp120.dll
  2. Spring 的 Bean 生命周期,11 张高清流程图及代码,深度解析
  3. C语言单链成绩表,【查找链表面试题】面试问题:C语言基于单链… - 看准网
  4. 人工智能十年回顾:CNN、AlphaGo、GAN……它们曾这样改变世界
  5. 新智能时代颠覆情报的未来
  6. 如何用Chrome自带的截屏功能截取超过一个屏幕的网页
  7. ajax 对404的处理
  8. 【机器学习基础】Python机器学习入门指南(全)
  9. 基于DispatchProxy打造自定义AOP组件
  10. flask html 路径,【Python】Flask 怎样获取当前页面的相对路径
  11. Bootstrap3 工具提示插件的选项
  12. java.lang.IllegalArgumentException: Request header is too large 解决方案
  13. android 多个style,Android样式的开发_style篇
  14. maximum call stack size exceeded ajax,Maximum call stack size exceeded error
  15. Java 接口和抽象类的异同点
  16. Autocad 字体
  17. 点击电脑桌面图标就点计算机图标老是出现是否删除快捷方式,电脑点击桌面图标提示缺少快捷方式怎么办...
  18. Linux 杀毒软件ClamAV离线安装部署
  19. DSB算法C语言程序,单片机中使用DSB温度传感器C语言程序.doc
  20. POJ - 1625 Censored!(AC自动机+dp+高精度运算)

热门文章

  1. 小心!手机这样充电被1秒窃取信息!
  2. 腾讯应用宝认领APP并将空白apk写入签名
  3. 多伦多大学Self-Driving Cars自动驾驶专项课程(三)Driving Decisions and Actions
  4. 箱型图构成及画图——详解
  5. 不要在条件判断中执行复杂的语句
  6. 软件测试工作三年薪资能拿20k往上吗?
  7. 计算机网络教研室网站参考,计算机网络教研室
  8. 第一次用uni-app写项目,无法自动运行微信小程序,怎么解决呢
  9. wap网站的优化建设
  10. vts传感器采取船舶的_船舶交通服务系统介绍