通过引用传递更新构造函数中的类变量?

时间:2015-05-27 17:48:07

标签: system-verilog

使用SystemVerilog内部工作的新发现,我已经开始着手使用其中一个fandangled pass-by-reference功能来更新另一个类的构造函数中的类计数器。设置(剥离基础)看起来像这样:

class my_queue;
  int unsigned num_items; //Want to track the number of items this Queue has seen.

  function push_new_item();
     item new_item = new(num_items);
  endfunction

endclass

class parent_item;
   int unsigned x_th_item;
   function new(ref int unsigned num_items);
      x_th_item = num_items;
      num_items += 1; //This should increase the counter in num_items.
   endfunction
endclass

class item extends parent_item;
   function new(ref int unsigned num_items);
      super.new(num_items);
   endfunction
endclass

问题是我的编译器抱怨

Illegal connection to the ref port 'num_items' of function/task parent_item::new, formal argument should have same type as actual argument.

我知道如何解决这个问题:在push_new_items中调用new()之后移动增量。
但是后来我仍然不知道如何在SV中正确使用pass-by-refrence,导致错误的原因是什么? 它是另一个传递引用还是语法错误?

2 个答案:

答案 0 :(得分:1)

您不需要 ref 语义,请使用 inout 参数。 inout 在进入时被复制并在返回任务或功能时被复制出来。正如您在 ref 参数中看到的那样,类型兼容性要求更加严格。

您必须使用 ref 参数的唯一场合是耗时的任务,您需要在任务返回之前查看对参数的活动更新。

task my_task(ref bit tclock);
  @(posedge tclock) // this would hang if tclock was an input
endtask 

当参数类型是像数组这样的大对象时,您可能想要使用ref参数的另一个地方是优化。但是通过引用传递单个int实际上比直接复制它的值慢。

答案 1 :(得分:0)

邱确实指出了我的代码问题。我的问题是,虽然两端都正确地声明了变量,但我的一个构造函数被写成:

function new(ref int num_items);

应该是

function new(ref int unsigned num_items);

谢谢你。