SV中的automatic与static_sv automatic-程序员宅基地

技术标签: SV语法  IC验证  

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。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/better_xiaoxuan/article/details/79015165

智能推荐

php字符串按数组替换,php如何替换数组里的字符串-程序员宅基地

文章浏览阅读481次。php如何替换数组里的字符串2021-03-05 00:20:25php替换数组里的字符串的方法:可以利用str_replace函数来进行替换,如【str_replace("red","pink",$arr,$i)】。如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换。本文操作环境:windows10系统、php 7.3、thinkpad t480电脑。如果我们需要替换数组中的字..._php 字符串替换数组里的

ubuntu18.04安装opencv_ubuntu安装opencv4.8-程序员宅基地

文章浏览阅读546次,点赞2次,收藏6次。ubuntu 18.04 安装OpenCV 3.4.8版本1、安装包下载先到官网下载所需要的opencv包点击链接,这里我下载的是3.4.82、安装依赖包sudo apt-get install build-essentialsudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-devsudo apt-get install python-dev pyt_ubuntu安装opencv4.8

使用openlayers加载本地离线地图瓦片的一个最简单地例子_openlayer加载离线地图-程序员宅基地

文章浏览阅读1.8k次。上一篇文章写了 leaflet,本篇说一下openlayers。第一步,下载:https://github.com/openlayers/openlayers/releases/download/v6.2.1/v6.2.1-dist.zip解压后,我们只需要其中两个文件ol.css,ol.js第二步,下载瓦片,参考上篇文章,https://blog.csdn.net/netying..._openlayer加载离线地图

最全的HTTP响应状态码列表:除了404,HTTP状态码还有啥?-程序员宅基地

文章浏览阅读903次。HTTP是一个应用层协议,虽然在2015年已推出HTTP/2版本,并被主要的web浏览器和web服务器支持。它的主要特点可概括如下:支持客户/服务器模式。简单快速:..._除了404notfound还有什么

【算法训练营】周测1-程序员宅基地

文章浏览阅读1.7k次,点赞50次,收藏48次。驭风计划课程链接如果需要答案代码可以私聊博主有任何疑问或者问题,也欢迎私信博主,大家可以相互讨论交流哟~~

《从缺陷中学习C/C++》——6.3 数组传参时的sizeof-程序员宅基地

文章浏览阅读74次。本节书摘来自异步社区出版社《从缺陷中学习C/C++》一书中的第6章,第6.3节,作者: 刘新浙 , 刘玲 , 王超 , 李敬娜 , ,更多章节内容可以访问云栖社区“异步社区”公众号查看。6.3 数组传参时的sizeof从缺陷中学习C/C++代码示例void copy(int a[], int b[]) {  memcpy(b, a, sizeof..._void copy(int a[], int (&b)[]) {   memcpy(a, b, sizeof(b)); }

随便推点

批处理删除edge浏览器缓存文件_批处理 设置edge-程序员宅基地

文章浏览阅读1.9k次。@echo offrem 桌面创建删除日志set logpath=%USERPROFILE%\DESKTOP\clearEdgLog.txtrem 设置edge浏览器缓存文件路径set dirpath=%LOCALAPPDATA%\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC\#!001\MicrosoftEdge\Cache\echo.>%logpath%rem 删除不是系统,只读和隐藏的文件for /f "tokens=*" %._批处理 设置edge

Postgresql时间处理_postgresql 获取某天的23:59:59-程序员宅基地

文章浏览阅读2k次。目录时间/日期操作符日期/时间函数EXTRACT函数综合示例时间/日期操作符操作符 例子 结果 + date '2011-09-28' + integer '7' date '2011-10-05' + date '2011-09-18' + interval '1 hour' timestamp '2011-09-18 0..._postgresql 获取某天的23:59:59

【Web安全笔记】之【7.0 防御技术】_前端 实现 att&ck matrix for enterprise-程序员宅基地

文章浏览阅读1.9k次。文章目录7.0 防御技术7.1 团队建设7.1.1 人员分工1. 部门负责人2. 合规管理员3. 安全技术负责人4. 渗透/代码审计人员5. 安全设备运维人员6. 安全开发7.1.2 参考链接7.2 红蓝对抗7.2.1 概念7.2.3 网络攻防演习7.2.4 侧重7.2.5 目标7.2.6 前期准备7.2.7 行动流程7.2.8 注意事项7.2.9 参考链接7.3 安全开发7.3.1 简介7.3.2 步骤1) 阶段1:培训2) 阶段2:确定安全需求3) 阶段3:设计4) 阶段4:实现5) 阶段5:验证6) _前端 实现 att&ck matrix for enterprise

client-go入门之3:解析 yaml 文件并创建 k8s 资源对象_client.go解析yaml部署-程序员宅基地

文章浏览阅读5.4k次,点赞4次,收藏8次。我们使用 k8s 提供的命令行工具 kubeclt 可以很方便地使用kubectl apply -f xx.yaml从 yaml 文件创建 k8s 的资源对象,但使用 client-go 的时候,通常是使用 clientset 的 list 或 get 接口先获取集群中已有的对象,再通过修改对象的属性之后调用 update 接口去操作集群中的资源对象,若要通过 client-go 使用 yaml 文件创建新的资源对象,则不能使用 clientset 而要使用 dynamicClient,这个用起来就没有 c_client.go解析yaml部署

微信小程序接收后端数据并显示轮播图_微信小程序轮播图后端-程序员宅基地

文章浏览阅读1.4k次。轮播图、是否自动轮播autoplay、修改轮播速度slider部分代码:index.wxml<view class="container" style=""> <!--轮播图--> <swiper class="home-swiper" indicator-dots="true" autoplay="{{autoplay}}" interval="{{..._微信小程序轮播图后端

图书推荐|西门子S7-1200 PLC编程与应用实例-程序员宅基地

文章浏览阅读1.4k次,点赞26次,收藏16次。编撰而成,作者是行业专家,在自动控制领域有独特建树,从事过十余个行业的相关项目,因此,你从本书不仅可以学习PLC1200的应用,其中的工作和实践经验尤其难得。参与过智能制造、轨道交通、市政燃气、石油石化、智慧矿山、光伏发电、火力发电、钢铁冶金、医药制造等行业的项目,项目经验丰富。,也可供有一定基础的工程师借鉴和参考,还可作为高等院校自动化和机电专业的教材。用,基础配合实例,循序渐进,通俗易懂,内容详实且丰富,书中还在多个地方使用了。《西门子S7-1200 PLC编程与应用实例》内容由浅入深,由基础到应用,