一、任务和函数
语句:时延语句:# 10 阻塞语句:@、wait
函数:不能使用时延语句和阻塞语句, 大部分不能调用任务。void函数可以被任何任务、函数调用。
子程序:任务和函数是两种用来定义子程序的方式。若消耗仿真时间,使用任务。若不消耗仿真时间,使用函数。
sv给任务和函数增加了新的语义特性,对高级抽象建模十分重要。包括静态和自动作用域、参数传递、线程、参数化函数。
二、作用域
1、形参和局部变量在Verilog、SV中放在静态存储区。 加automatic使用自动存储。
2、静态作用域:
静态作用域变量被绑定到应用程序的数据存储区域(在这里是指仿真器). 此存储区域将被所有的线程所共享. 而另一方面对于自动变量,将映射到栈区存储区, 对同一个函数进行多次调用,自动变量将映射到栈中互补相同的区域。
由C/C++编译的程序占用内存分为 :静态存储区(静态区、全局区)、堆区、栈区和代码区。
静态存储区:内存在编译(定义)时分配好,并一直保持不变,直至整个程序结束。存放静态变量、全局变量和常量。
栈区:执行函数时,局部变量的存储单元在栈上创建,执行结束由编译器自动释放。栈内存分配运算内置于处理器的指令集中,效率很高,但分配的内存容量有限。存放函数返回值、参数,局部变量。典型的例子是函数形参,在函数定义时并不给行参分配存储单元,只是在函数被调用时,才予以分配,调用函数完毕立即释放。如果一个函数被多次调用时,则反复地分配、释放形参变量的存储单元。
堆区:程序运行时申请任意大小内存,程序员决定在适当时候释放内存。存放通过new和malloc函数分配得到的空间。
参考文献:https://www.cnblogs.com/lesroad/p/10389971.html 静态存储区、堆、栈之间的区别
参考文献:https://blog.csdn.net/hairetz/article/details/4141043 堆和栈的区别(转过无数次的文章)
一个变量属于那种存储方式可以从其生存期、作用域判断。生存期和作用域时从时间和空间这两个不同的角度来描述变量的特性。
变量的存储方式可分为:“静态存储”和“动态存储”两种。 前者对应静态存储区,后者对应堆和栈。
3、自动作用域(自动存储)
因局部变量静态存储常见的两个问题:多次调用阻塞时参数覆盖、声明和初始化未分离产生初始化漏洞。
SystemVerilog允许变量以自动作用域绑定。为了在函数/任务中使用自动绑定功能,函数/任务需要声明为automatic. 另外,所有在program块中声明的函数/任务缺省都是自动作用域的。如果在自动作用域子程序中仍然需要使用静态变量,那么必须使用static关键字显式声明此变量。
1、自动存储:在所属函数被调用时自动产生,在该函数结束时消亡。自动变量是一个局部变量,作用域为包含它的代码块,代码块是被包含在花括号中的一段代码。自动变量通常存储在栈中。
2、静态存储:静态存储是整个程序执行期间都存储在的存储方式。有两种办法使变量成为静态:一种是在函数外定义它;另一种是在声明变量时使用static。
3、动态存储:new和delete运算符提供动态存储功能。动态存储内存在堆中。
三、未待完续
参考文献:https://www.cnblogs.com/mollieee/archive/2011/05/19/2050892.html