SystemVerilog-任务和函数
概述
0、Verilog中函数不能调用任务,SV中允许哈数调用任务,但只能是由fork……join_none语句生成的线程中。
Verilog中函数必须有一个函数名代表的返回值,并且返回值必须被使用,例如用到赋值语句。SV中增加了void 函数
1、一般情况下,不带参数的子程序在定义或调用时不需要带空括号()
2、相比于Verilog-1995,在子程序中去掉了begin……end, task/endtask、function/endfunction以及足够定义子程序的边界
3、具有C语言风格的子程序参数,如 task mytask (output logic [31:0] x, input logic y)
4、缺省的类型和方向是“logic 输入”, 如task mytask(a,b,output bit [15:0] u,v); 参数a,b是1比特宽度的logic输入,u和v是16比特宽度的bit类型输出
5、具有高级的参数类型,参数的传递方式可以指定为引用而不是复制,这种ref参数类型允许将数组传递给子程序。如function void print_checksum(const ref bit [31:0] a[]).
向子程序传递数组时应该尽量使用ref以获取最佳性能,否则数组会被复制到堆栈区,这样的操作代价很高;ref参数的第二个好处是在执行并发线程时共享变量信息
6、可以给参数指定缺省值,如function void print_checksum(const ref bit [31:0] a[],input bit [31:0] low=1, input int high=-1)
7、可以采用名字进行参数传递。如 task many(input int a=1,b=2,c=3,d=4);调用时可以只指定c,如many(.c(5));
8、增加了return语句,使子程序的流程控制变得更加方便。
9、Verilog的子程序只能返回一个简单值,例如比特、整数或是向量,在SV中可以采用引用ref来返回数组
10、增加了自动存储automatic,防止多个地方调用同一个子程序时串用局部变量(使用共享的静态存储区),它会迫使仿真器使用堆栈区存储局部变量。