2017-12-14 4 views
0

Ich möchte einen Verweis auf ein Array/Warteschlange in einer Klasse speichern. Es scheint jedoch nicht möglich zu sein, dies zu tun.Store Verweis auf Array/Warteschlange in SystemVerilog

Ich möchte so etwas wie dies zu tun:

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 

Wenn q_ref nur als int q_ref[$] definiert ist, dann wird der Zuweisungsoperator eine Kopie erstellen, die nicht das, was ich will. Ich möchte, dass Änderungen in 'q' in der Klasse sichtbar sind.

Gibt es einen versteckten Abschnitt in der LRM, der zeigt, wie dies getan werden kann?

Ich bin nicht auf der Suche nach dem offensichtlichen "Sie müssen das Array/Warteschlange in einer Klasse Antwort wickeln", aber für etwas, das mich mit Code, der native Arrays/Warteschlangen verwendet interagiert.

+0

Sie können eine Klasse erstellen, die ein Array enthält, und dann einen Verweis auf diese Klasse speichern. – Serge

+0

@Serge Nicht was ich will. Ich möchte eine reguläre Warteschlangenvariable haben und sie in eine andere Klasse einbinden können. Das Klassenobjekt sollte Änderungen an der Warteschlange sehen. Änderungen innerhalb des Objekts sollten sich auch in der Warteschlange fortpflanzen. –

+0

hast du ein beispiel? – Serge

Antwort

1

Es gibt nur drei Variablentypen in SystemVerilog, die Referenzen speichern können: Variablen der Klasse, des Ereignisses und der virtuellen Schnittstellen.

Sie müssen das Array/die Warteschlange als Mitglied in einem Klassenobjekt umbrechen. Dann kann jede Methode dieser Klasse in einem Ereignisausdruck verwendet werden. Jede Änderung an einem Mitglied des Klassenobjekts bewirkt eine Neubewertung dieser Methode. Siehe den letzten Abschnitt und das Beispiel im Abschnitt 9.4.2 Ereignissteuerung der 1800-2012 LRM.

+0

Schlägst du vor, einen Thread im Konstruktor zu starten, der die interne Warteschlange mit der Warteschlange "referenziert" synchronisiert? Dies ist nicht wirklich ein Ref, aber eine Art von verhält sich wie einer. Dies würde O (n) -Operationen bei jeder Änderung der "referenzierten" Warteschlange erfordern, um herauszufinden, welches Element sich geändert hat und wo ein Element eingefügt/gelöscht werden soll, wenn etwas gelöscht wird. –

+0

Nein. Es gibt nur eine Warteschlange. Es ist ein Mitglied einer konstruierten Klasse. Der Objekthandle wird zu Ihrer Referenz –

+0

Das ist aber nicht das, was ich will. Ich möchte mit Code interagieren, der native Warteschlangen/Arrays verwendet und diese anschließend umschließt. –

0

Also, die einzige Lösung für Sie wäre, die Warteschlange in eine Klasse zu wickeln. Letzteres wird immer durch eine Referenz zugewiesen, wie in diesem Beispiel:

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 
+0

Dadurch wird der aufrufende Code gezwungen, ein umgebrochenes Array/eine Warteschlange zu verwenden. –

+0

ja, aber Sie haben nicht viel Auswahl mit SV. – Serge