SV中的Task和Function不需要,必须加一个begin..end来指明body。
task muliple_line;
......body...
endtask :multiple_line
子程序在执行到子程序的最后一行就返回,将返回值赋给与函数同名的变量,也可以显式的调用return来返回。
SV中module和program的子程序默认是静态存储的,当需要动态存储时,仍然需要显式的用automatic显式指出。(class中默认是automatic的)
子程序中的参数缺省值是logic input。verilog对子程序参数的处理是,在进入子程序时,将input和inout的值赋值给子程序本地变量,在子程序返回时将output和
inout的值赋值给模块中的变量。SV中增加了一种方式ref,指定为引用而不是复制。这种方式只能用在automatic的子程序中,这种参数的好处是在子程序中
修改变量对调用它的模块随时可见。
task bus_read(input logic [31:0] addr, ref logic [31:0]data); initial fork
bus.request = 1‘b1; bus_read(addr,data);
@(posedge bus.grant) bus.addr =addr; thread2: begin //使用ref类型传递data,这样不需
@(posedge bus.enable) data = bus.data; @data; //要等到bus_read进程结束,
....... $display; //thread2便可以看见data的变化
endtask:bus_read end
join