SV——automatic
参考:
IEEE 1800 6.21 Scope and lifetime
1. SV中变量存储
-
Variables declared outside a module, program, interface, checker, task, or function are local to the
compilation unit and have a static lifetime (exist for the whole simulation).
-
Variables declared inside a module, interface, program, or checker, but outside a task, process, or function, are local in scope(局部有效) and have a static lifetime.
-
Variables declared inside a static task, function, or block are local in scope and default to a static lifetime.
-
Tasks and functions may be declared as automatic. Variables declared in an automatic task, function, or block are local in scope, default to the lifetime of the call or block(automatic类型的变量的生存周期是函数调用时间或者块语句的生存周期), and are initialized on each entry to the call or block。
-
An automatic block is one in which declarations are automatic by default. Specific variables within an automatic task, function, or block can be explicitly declared as static. Such variables have a static lifetime.
上面前三条是一个意思,变量都是存在静态存储区,如果有多个线程同时调用任务或者函数,任务或函数内地变量是共享的,这样会发生问题。
后面两条是一个意思,变量存在动态存储区,每次对任务或者函数的调用都会分配动态存储区域来存储变量,任务或者函数执行完,自动释放动态存储区。
1800中的例子
module top_legal; int svar1 = 1; // static keyword optional initial begin for (int i=0; i<3; i++) begin automatic int loop3 = 0; // executes every loop for (int j=0; j<3; j++) begin loop3++; $display(loop3); end end // prints 1 2 3 1 2 3 1 2 3 for (int i=0; i<3; i++) begin static int loop2 = 0; // executes once at time zero for (int j=0; j<3; j++) begin loop2++; $display(loop2); end end // prints 1 2 3 4 5 6 7 8 9 end endmodule : top_legal module top_illegal; // should not compile initial begin int svar2 = 2; // static/automatic needed to show intent for (int i=0; i<3; i++) begin int loop3 = 0; // illegal statement for (int i=0; i<3; i++) begin loop3++; $display(loop3); end end end endmodule : top_illegal // 其实int loop3=2,不加static也不加automatic输出是 1 2 3 1 2 3 1 2 3;不知道上面为什么说是illegal statement
注意:
Class methods (see Clause 8) and declared for loop variables (see 12.7.1) are by default automatic,regardless of the lifetime attribute of the scope in which they are declared.
类方法和for循环中的变量默认类型就是automatic,这应该也就是上面为什么不加automatic也输出1 2 3 1 2 3 1 2 3的原因吧。
原文地址:https://www.cnblogs.com/east1203/p/11597361.html
- CentOS7安装GitLab、汉化、邮箱配置及使用
- Bootstrap源码分析之transition、affix
- Redis从单机到集群,一步步教你环境部署以及使用
- C++内存管理学习堆和栈
- 人人公司宣布收购美国卡车社区平台Trucker Path
- Mysql字符串截取总结:left()、right()、substring()、substring_index()
- c++程序的内存格局
- SpringMVC中利用@InitBinder来对页面数据进行解析绑定
- 门罗盘点:2017年那些AI击败人类的瞬间
- sizeof和strlen的区别
- mysql索引使用技巧及注意事项
- 条码支付新规,微信支付宝还好么?
- 获取对象属性类型、属性名称、属性值的研究:反射和JEXL解析引擎
- 不联网不插U盘也不一定安全 黑客能用声波攻击你的硬盘
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PyCharm2019亲测破解方式
- :: 是什么语法?
- 支付宝二面:Mybatis接口Mapper内的方法为啥不能重载吗?我直接懵逼了...
- Windows系统中使用Linux命令(可以批量下载Modis数据)
- Python制作桑基图(我承认我低估了这个教程)
- 几个好看的Seaborn图样~(虽然官方配色一般般,但我还是忍不住夸它)
- GDAL读取MAIAC的HDF文件(熟肉)
- Google Earth Engine(GEE)-谷歌地球引擎的大致Python入门
- 谷歌地球引擎(Google Earth Engine)之数据初探(栅格和矢量)
- Python-gdal离线文档下载
- 利用python把shp文件写入PostgresSQL数据库
- python调用cmd运行GDAL报错解决:ERROR 1: PROJ
- Tungsten Fabric知识库丨测试2000个vRouter节点部署
- 一行代码快速图像识别~一排代码搞定视频识别
- Python测试开发django5.urls.py参数name与<a>标签的引用