ref介绍
在module,function或者task中有input,output,inout等具有方向的声明变量,它们在作为参数传递的过程中是作为参数值传递的,效率较低,数据在每一次方法的调用过程中均需要被复制。而ref参数传递的则为传递参数的引用地址,本文介绍了ref的用法和注意事项。
ref用法
在使用ref参数以后,不同时刻hao的变化会被transfer_ref方法中的xiaohao所看见,并通过display打印得到,即子程序中调用函数的变量可以被方法中的变量修改。
module ref_1;
int hao;
initial begin
hao = 0;
#10 hao = 4;
#10 hao = 8;
#10 $stop;
end
initial begin
transfer_ref(hao);
end
task automatic transfer_ref(ref int xiaohao);
forever begin
#5 $display("transfer_ref: xiaohao is %0d", xiaohao);
end
endtask
endmodule
仿真结果如下
同样,子程序中的函数同样可以监测到方法中参数的变化,如下,display函数中的hao参监测到了方法中的xiaohao参数变化并实现了打印。
module ref_1;
int hao;
initial begin
hao = 0;
fork
while(1) begin
#5 $display("transfer_ref: hao is %0d", hao);
end
transfer_ref(hao);
join_any
#20 $stop;
end
task automatic transfer_ref(ref int xiaohao);
#10 xiaohao = 4;
#10 xiaohao = 8;
endtask
endmodule
若不想要方法内对子程序中调用方法的引用参数进行修改,可以使用const ref,示例如下,加const以后,方法内再对引用参数进行修改,仿真即会报错。
module ref_1;
int hao;
initial begin
hao = 0;
fork
while(1) begin
#5 $display("transfer_ref: hao is %0d", hao);
end
begin
transfer_ref(hao);
end
join_any
#20 $stop;
end
task automatic transfer_ref(const ref int xiaohao);
#10 xiaohao = 4;
#10 xiaohao = 8;
endtask
endmodule
注意事项
- ref指定的形参类型在方法被调用时,需要与被引用的参数的实参类型保持一致。