在SystemVerilog中存储对数组/队列的引用

时间:2017-12-14 10:15:49

标签: system-verilog

我想在类中存储对数组/队列的引用。但是,这似乎不可能做到这一点。

我想做这样的事情:

class some_class;

  // class member that points to the 'q' supplied as a constructor arg
  ??? q_ref;

  function new(ref int q[$]);
    this.q_ref = q;
  endfunction

endclass

如果q_ref仅定义为int q_ref[$],则赋值运算符将创建一个副本,这不是我想要的。我想在课堂上看到'q'的变化。

LRM中是否有一些显示如何完成此操作的隐藏部分?

我不是在寻找明显的“你必须在类回答中包装数组/队列”,而是要让我能够与使用本机数组/队列的代码进行交互。

2 个答案:

答案 0 :(得分:1)

SystemVerilog中只有三种可以存储引用的变量类型:类,事件和虚拟接口变量。

您必须将数组/队列包装为类对象中的成员。然后,可以在事件表达式中使用该类的任何方法。对类对象成员的任何更改都会导致重新评估该方法。请参阅1800-2012 LRM 9.4.2事件控制部分中的最后一段和示例。

答案 1 :(得分:0)

因此,唯一的解决方案是将队列包装在一个类中。后者始终由引用分配,如下例所示:

class QueueRef #(type T = int);
   T queue[$];
   function void push_back(T t);
      queue.push_back(t);
   endfunction // push_back
endclass // Queue

class some_class;
  QueueRef q_ref;
  function new(QueueRef q);
     this.q_ref = q;
  endfunction
endclass

program test;
   QueueRef q = new;
   some_class c = new (q);
   initial begin 
      q.push_back(1);
      q.push_back(2);
      $display(c.q_ref.queue);
   end
endprogram // test