静态和自动变量

静态和自动变量

自动变量–也可以称为动态变量,主要是用来描述在测试程序、抽象系统级、交易级或总线功能模型中的验证程序。自动变量的另一个用途就是编写可重入的任务,当一个任务的前一次调用仍然在执行时,可以再次对其调用。
自动变量也允许编写递归函数–函数调用其自身。含有自动变量的任务或者函数的每次调用,都建立新的变量储存空间,当访问结束后,空间被释放。

function automatic int b_add (int lo,hi);int mid = (lo + hi + 1) >> 1;if(lo + 1 != hi)return (b_add(lo,(mid - 1)) + b_add(mid,hi));elsereturn (array[lo] + array[hi]);
endfunction

在Verilog中,通过声明整个任务或者函数是自动的,来声明自动变量。自动任务或函数中的所有变量都是动态的。
SystemVerilog加入了静态和自动变量声明
SystemVerilog增加了声明静态和自动变量的能力。SystemVerilog增加了一个static关键字,允许任何变量被显性地声明为static或者automatic。这个声明时变量声明的一部分,可以出现在任务、函数、begin …end块或者fork…join块中。注意在module一级声明的变量不能显示声明为static或者automatic。在模块级,所有变量都是静态的。

//在一个静态函数中显式地声明自动变量
function int count_ones (input [31:0] data);automatic logic [31:0] count = 0;automatic logic [31:0] temp = data;for (int i = 0; i <= 32 ; i++)beginif(temp[0]) count ++;temp >> 1;endreturn count;
endfunction
//在一个自动任务中显式地声明一个静态变量
typedef struct packed{...} packet_t;task automatic check_results(input packet_t sent, received,output int total_errors);static int error_count;...if(sent !== received) error_count++;total_error = error_count;
endtask

在模块、begin…end块、fork…join块以及非自动的任务和函数中,所有的储存方式都缺省为静态的,除了被显式地声明为动态的。如果一个任务和函数被声明为自动的,则所有的储存方式默认为自动的,除非被显式地声明为静态的。

静态变量和自动变量的初始化
Verilog变量的内嵌(in-line)变量初始化
Verilog只允许在模块级声明进行内嵌初始化,在任务、函数、begin…end块及fork…join块中声明的变量不能在声明时志初始值。
SystemVerilog的内嵌初始化
初始化静态和自动变量
SystemVerilog对Verilog进行了扩展,在任务、函数声明的变量可以有内嵌初始值。
在非自动任务和函数声明的变量默认是静态的。内嵌初始值将在仿真开始前进行一次赋值。对任务或者函数的再次调用不会重新初始化变量。

注意:在任务或函数中初始化静态变量是不可综合的,可能在某些工具中不支持

静态变量只初始化一次

//在一个静态函数中显式地声明自动变量
function int count_ones (input [31:0] data);logic [31:0] count = 0;  //只初始化一次logic [31:0] temp = data; //只初始化一次for (int i = 0; i <= 32 ; i++)beginif(temp[0]) count ++;temp >> 1;endreturn count;
endfunction

自动变量每次调用时都只初始化
在非自动任务和函数中显式地声明为自动的变量在每次任务和函数调用时都会动态地创建,调用完毕会动态地释放。函数或任务每次调用都会对内嵌初始值赋值。

function int count_ones (input [31:0] data);automatic logic [31:0] count = 0;automatic logic [31:0] temp = data;for (int i = 0; i <= 32 ; i++)beginif(temp[0]) count ++;temp >> 1;endreturn count;
endfunction

在自动任务和函数声明的变量默认是自动的。每次进入任务和函数时,都会为变量动态地创建储存区,调用完毕释放。每次调用任务或函数时,内嵌初始值都会被赋值。

如果想使硬件模型中的自动变量是可综合的,则它只能用于表示暂时储存–不会传送到任务、函数或过程块的外部。

注意:静态变量初始化是不可综合的,动态变量初始化是可综合的。
用const限定词声明的变量的内嵌初始值也是可综合的

静态和自动变量的使用原则
(1)在always和initial块中,如果无内嵌初始化则使用静态变量,而需要内嵌初始化的使用自动变量。使用带内嵌初始化的变量,所表现的行为最直观,因为过程块每次被重新执行,自动变量都会重新初始化。
(2)如果一个任务和函数会是可重入的,则应该设成自动的。变量也应该是自动的,除非有特殊的原因需要在两次调用之间保持变量的值。一个简单的例子,如果需要用一个变量来记录任务或者函数被调用的次数,则这个变量应该是静态的。
(3)如果一个任务和函数用来描述硬件的独立部分,并且不是可重入的,那么应该把它声明为静态的,任务和函数中的所有变量也应该是静态的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/243315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像拉普拉斯金字塔融合(Laplacian Pyramid Blending)

转摘的&#xff0c;修改了下程序&#xff0c;图像融合看不太懂 。。。。http://blog.csdn.net/abcjennifer/article/details/7628655#comments // 转摘的别人的程序 // #include <stdio.h> #include <cv.h> #include <cxcore.h> #include <highgui.h>…

[转]GIS简介

************************************************** 最近论坛上经常有人讨论GIS&#xff0c;特意从别人的blog中转了一篇GIS简介的帖子************************************************** 地理信息系统(GIS,Geographic Information System)是一门用计算机来研究地理的学科…

debug设计

debug设计 会用到debug设计的阶段 (1)RTL级设计仿真 (2)实施后的设计模拟 (3)在系统调试 使用网表插入调试探测流动 (1)最高级别是一个简单的向导,用于创建和配置集成逻辑分析仪 (ILA)内核会根据选定的一组网络自动进行调试。 (2)下一级是主调试窗口,允许控制单个…

ASA 9.21 in Vmware Workstation 10

There is old post “ASA 8.02 in Vmware Workstation “ in this blog posted on Dec 2011. Anothe post “How to Make your own ASA 8.42 in VMware”. Here are all related posts in this blog: ASA 8.02 in Vmware WorkstationASA 8.42 in VMware WorkstationASA 9.21 i…

MMU及PTS说明

MMU与PTS表格 最近在FPGA上仿真调试Virgo&#xff08;基于ARM11的一款处理器&#xff09;芯片。MMU部分总是出错&#xff0c;具体的现象是查看物理地址和虚拟地址的映射时候芯片经常会挂掉。先是怀疑MMU的寄存器配置有问题&#xff0c;后来又怀疑MMU映射使用的PTS表格有问题&a…

bug?VS2010中CImageList::DrawIndirect总是返回失败

//VS2010 #if _MSC_VER > 1600pImageList->Draw(pDC, nImage, point, ILD_NORMAL); #elseSIZE size;size.cx rect.Width() < sizeImage.cx ? rect.Width() : sizeImage.cx;size.cy rect.Height() < sizeImage.cy ? rect.Height() : sizeImage.cy;pImageList-&g…

VHDL基本结构

VHDL基本结构 (1)实体(Entity):描述所设计的系统的外部接口信号,定义电路设计中得到所有的输入和输出端口。 (2)结构体(Architecture):描述系统内部的结构和行为 (3)包集合(Package):存放各设计模块能共享的数据类型、常数和子程序等; (4)配置(Configurat…

Source Code Collection for Reproducible Research

转自&#xff1a;http://www.csee.wvu.edu/~xinl/source.html “It doesnt matter how beautiful your theory is, it doesnt matter how smart you are. If it doesnt agree with experiment, its wrong” - Richard Feynman "As a method for finding things out, scien…

IClass与电源管理

IClass与电源管理 前段时间为J9项目上添加电源管理&#xff0c;中间走了一些弯路。之前错误的认为&#xff0c;IClass只是与电源状态的改变方法有关&#xff0c;也就是说IClass的正确与否只会影响到设备电源状态的正确与否&#xff0c;而不会造成设备是否可以支持设备电源状态的…

状态机在VHDL中的实现

状态机在VHDL中的实现 1、Moore状态机的VHDL描述 输出仅取决于所处的状态 LIBRARY IEEE; --库、程序包的说明调用 USE IEEE.STD_LOGIC_1164.ALL;ENTITY Moore IS PORT (RESET,CLOCK,DIN : IN STD_LOGIC;DOUT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0) ); END;ARCHITECTURE Mo…

Linux : find big file in the all directories

1. Juniper Firewall find . -type f -size 10000 -exec ls -lh {} ; Sample output: [email protected]% find . -type f -size 10000 -exec ls -lh {} ; -rw-r–r– 1 930 929 134M Jan 5 17:34 ./cf/packages/junos-11.4R6.6-domestic-rw-r–r– 1 root wheel 1…

VC++静态文本框/PICTURE控件的notify属性

RT&#xff0c;该属性对应的是SS_NOTIFY&#xff0c;但是很多人误以为是WM_NOTIFY 。该属性可以用ModifyStyle函数修改。

VHDL仿真

VHDL仿真 仿真(Simulation也称模拟),不接触具体的硬件系统利用计算机对电路设计的逻辑行为和运行功能进行模拟检测,较大规模的VHDL系统设计的最后完成必须经历多层次的仿真测试过程,包括针对系统的VHDL行为仿真、分模块的时序仿真和硬件仿真,直至最后系统级的硬件仿真测…

从Var Tick角度来对CE电源管理

从Var Tick角度来对CE电源管理 一&#xff0e;相关的基础知识如下 1&#xff0e;OAL中Timer相关函数说明 1> OALTimerInit 参数&#xff1a; msecPerSysTick: 每个系统调度Tick对应多少ms&#xff1b; countsPerMSec: Timer的Counter变化多少为1ms&#xff0c;其值为T…

变量初始化的确定性

变量初始化的确定性 SystemVerilog初始化顺序 SystemVerilog标准增强了变量的内嵌初始化。SystemVerilog规定所有内嵌初始化先于仿真时刻0执行的事件。这就保证了如果Initial或者always过程块读取具有内嵌初始值的变量时取得正确的初始值&#xff0c;这个确定行为消除了Verilo…

很好的Android论坛

需要的兄弟可以看一下 http://www.eoeandroid.com/?fromuid9379

用户自定义和枚举数据类型

用户自定义和枚举数据类型 用户自定义 1、typedef定义用户自定义类型 SystemVerilog同C一样&#xff0c;使用typedef关键字来建立用户自定义类型。用户自定义类型允许使用现有的数据类型建立新的数据类型。新的数据类型定义后&#xff0c;可以声明这个类型的变量 typedef int…

Keyboard驱动介绍

Keyboard驱动介绍 最近手里面没啥事&#xff0c;就想看看一些Driver的MDD层。 以前改过Keyboard Driver的PDD层&#xff0c;但是对它的MDD层还真是一片空白&#xff0c;这两天随便看了看Keyboard的MDD层&#xff0c;赶紧把东西记录下来&#xff0c;以防以过段时间忘记了。 很多…

GDI+不同的地方

研究了GDI处理图像的地方&#xff0c;发现它一些与众不同的地方&#xff0c;被它坑了一天。。。。。1、GDI的像素的原点默认你在左下角的&#xff0c;所以读取像素的顺序是从最低一行开始的(bottom-left)&#xff0c;其他一般的图像处理软件&#xff0c;像Photoshop&#xff0c…

关于结构体的内容

关于结构体的内容 结构体使用类似于C语言的语法来定义 结构体使用struct关键字声明。结构体内的成员可以是任何数据类型&#xff0c;包括用户自定义类型和其他的结构体类型。 struct{int a,b; //32位变量opcode_t opcode;//用户定义类型logic [23:0] adress;//24位变量bit er…