在systemverilog中传递ref和传递val有什么区别?

时间:2015-06-25 08:47:08

标签: system-verilog

在systemverilog中传递ref和传递val有什么区别?

我只想知道systemverilog中pass by refpass by val之间的区别是什么?

我找不到任何例子。特别是,这是什么?有谁知道这是什么并解释?

 interface xxx
  ...
 event yyy;
 event ggg;

 modport io_bus ( ref yyy,
                  ref ggg,
                  ....
                 );
 endinterface

目的是什么" ref yyy"在modport?

2 个答案:

答案 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节