我想在类中存储对数组/队列的引用。但是,这似乎不可能做到这一点。
我想做这样的事情:
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中是否有一些显示如何完成此操作的隐藏部分?
我不是在寻找明显的“你必须在类回答中包装数组/队列”,而是要让我能够与使用本机数组/队列的代码进行交互。
答案 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