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

System verilog 在SystemVerilog中存储对数组/队列的引用,system-verilog,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[$],那么赋值操作符将创建一个副

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

我想这样做:

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中是否有一些隐藏的部分显示了如何做到这一点


我不是在寻找明显的“必须将数组/队列包装在类答案中”,而是寻找允许我与使用本机数组/队列的代码交互的东西。

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


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

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

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

您可以创建一个包含数组的类,然后存储对该类的引用。@Serge不是我想要的。我希望有一个常规队列变量,并能够将其包装到另一个类中。类对象应该看到对队列所做的更改。对象内部的更改也应该传播到队列。您有示例吗?@Serge我已经更新了问题。我猜这不可能引用队列本身。这会迫使调用代码使用包装数组/队列。您是否建议在构造函数中启动一个线程,使内部队列与“引用的”队列保持同步队列这不是一个真正的ref,但有点像一个ref。这将需要对“引用”队列的每次更改进行O(n)操作,以确定更改了哪些元素,以及在删除某些内容时在何处插入/删除元素。否。只有一个队列。它是构造类的成员。对象句柄成为您的引用,但这不是我想要的。我想与使用本机队列/数组的代码进行交互,然后将它们包装起来。