2017-09-06 3 views
3

Wenn ich eine Aufgabe aufrufen und ein Ereignis durch Verweis übergeben, wird es nicht in der Aufgabe erkannt werden, nachdem das Ereignis ausgelöst wurde:Können Ereignisse als Referenz in Systemverilog übergeben werden?

mit diesem Prüfstand
event e; 

    fork 
    test_ev(e); 
    begin 
     #1ms; 
     ->e; 
    end 
    join 

    ... 

    task ev(ref event e); 
     @(e) 
     do_something; // this will never happen 
    endtask 

Herumspielen: http://www.edaplayground.com/x/5YS7, es, dass einige scheinen würde Simulatoren wie die Ref-Ereignis und einige nicht. Es wird keine Kompilierungswarnung ausgegeben, aber die Anweisung @ (..) wird niemals übergeben.

Es scheint ein gültiger Systemverilog zu verwenden, gibt es einen Vorbehalt, den ich vermisse?

Antwort

7

Es ist nicht notwendig, eine Ereignisvariable als Referenz zu übergeben - es ist bereits eine Referenz.

Das Problem hier ist, dass SystemVerilog zwei Konstrukte in ein einzelnes Schlüsselwort kludged. In Verilog war eine event einfach eine wertlose Variable, die Sie mit einem Trigger -> ändern und darauf warten konnten, dass sie sich wie jede andere Variable änderte.

SystemVerilog erweiterte den event-Datentyp so, dass er sich mehr wie eine Klassenvariable verhält. Außer dass ein event keinen Konstruktor benötigt, erstellt jede Ereignisdeklaration automatisch ein Ereignisobjekt. Dadurch werden Ereignisse rückwärts mit Verilog kompatibel gehalten. Wenn Sie eine Zuweisung von einer Ereignisvariablen zu einer anderen Ereignisvariablen vornehmen, kopieren Sie ein Handle in ein Ereignisobjekt. Dies entspricht dem Kopieren einer Klassenvariablen - Sie kopieren nur das Handle, nicht das Objekt.

Um den Code zu ändern, ersetzen Sie ref durch input.

+0

wow dieses Klassenverhalten von 'event' ist unintuitiv .. so jetzt verstehe ich, warum' input' funktioniert und es macht Sinn, es so zu verwenden. Ich bin immer noch neugierig, warum es nicht funktioniert, wenn ich 'ref' benutze? Soll das nicht trotzdem eine Referenz innerhalb der Aufgabe erzeugen? – chinocolerico

+0

Ich glaube nicht, dass das LRM hier sehr klar ist. Da dies ein Verweis auf ein Referenzereignis ist, könnte @e so interpretiert werden, dass darauf gewartet wird, dass der Verweis auf ein anderes Ereignisobjekt und nicht auf den Ereignistrigger selbst geändert wird. Wahrscheinlich sollte ein illegales Konstrukt gemacht werden. –

4

Übergeben Sie das Ereignis als task ev(event e) übergeben Sie es auch als Verweis, wie es mit Klassenobjekten passiert. Es macht keinen Sinn, Ereignisse nach Wert zu übergeben (d. H. Es zu kopieren und der Funktion ein neues Ereignis zu geben), da Ereignisse Daten nicht wirklich speichern. Ich bin mir nicht sicher, ob dies explizit in der LRM aufgeführt ist, aber IMO ist es nur gesunder Menschenverstand.

Werkzeuge, bei denen Ihr Block nicht ausgelöst wird, behandeln Ereignisse als Grundelemente und übergeben sie als Wert. Ich würde Unterstützungsfälle dafür einreichen.

+0

Ich stimme zu, dass es in keinem Programm sinnvoll wäre, Ereignisse nach Wert zu übergeben. Aber auf den ersten Blick hätte ich erwartet, dass sie genauso behandelt werden wie ein Int oder ein Bit. Das Problem verschwindet, wenn das Ereignis als "Eingabe" für die Frage deklariert wird, wie @ dave_59 vorgeschlagen hat, also scheint das Tool das Richtige zu tun. Ich bin mir immer noch nicht sicher, warum es mit "ref" allerdings nicht funktioniert – chinocolerico

Verwandte Themen