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
自动(可重入)任务
任务在本质上是静态的,任务中的所有声明项的地址空间是静态分配的,同事并发执行的多个任务共享这些存储区。
因此,如果这个任务在模块中的两个地方被同时调用,则这两个任务调用将对同一块地址空间进行操作。操作的结果很有可能是错误的。
为了避免这一问题,Verilog通过在task关键字前面添加automatic关键字,是任务成为可重入的,这样声明的任务也称为自动任务。