在systemverilog中传递ref和传递val有什么区别?
我只想知道systemverilog中pass by ref
和pass by val
之间的区别是什么?
我找不到任何例子。特别是,这是什么?有谁知道这是什么并解释?
interface xxx
...
event yyy;
event ggg;
modport io_bus ( ref yyy,
ref ggg,
....
);
endinterface
目的是什么" ref yyy"在modport?
答案 0 :(得分:0)
下面的两个代码块总结了差异。
value = 1;
IncreaseByOne(ref value); //pass by reference
//value will be set to 2
value = 1;
IncreaseByOne(value); //pass by value
//value will still be 1
通过引用传递意味着获取参数的方法能够改变变量,使得原始变量也被改变。按值传递意味着传递值的副本,对该副本的任何更改都不会反映在原始变量上。
答案 1 :(得分:0)
按值传递
在SystemVerilog中,Pass by value是将参数传递给子例程的默认机制。此参数传递机制通过将每个参数复制到子例程区域来工作。如果子例程是自动的,则子例程会在其堆栈中保留参数的本地副本。
通过引用传递
通过引用传递的参数不会复制到子例程区域中,而是将对原始参数的引用传递给子例程。
子程序然后可以通过引用访问参数数据。不允许铸造。
另请注意,对于具有静态生命周期的子例程,使用通过引用传递的参数是非法的。
只有以下内容才合法通过引用:
— A variable,
— A class property,
— A member of an unpacked structure, or
— An element of an unpacked array.
Nets和选择进入网络不得通过引用传递
对于你的问题
modport中“ref yyy”的目的是什么?
当您在多次触发不同事件时使用对事件的引用时,性能会有所提高,但仅在需要/需要进行大量性能优化时才使用。可以在link
中找到一个使用传递引用的推荐示例这里我展示了如何使用带有ref事件的modport的一种方法。
interface intf(input clk);
event out_event;
logic clk;
modport dut(input clk,ref out_event);
always @(out_event)
$display ($time,"ns"," out_event triggered");
endinterface
module dut( intf.dut d);
reg [2:0] count;
initial
count = 0;
always @ (posedge d.clk)begin
count = count + 1'b1;
if ( count == 'd2)
-> d.out_event;
end
endmodule
module top (input clk);
intf int_f(.clk(clk));
dut u0(.d(int_f.dut));
endmodule
上述工作示例可在链接EDA-Playground
中找到有关按值传递的更多详细信息,请参阅SystemVerilog LRM IEEE 1800-2012的第13.5.1节和按引用传递,请参阅第13.5.2节