2016-06-22 9 views
0

Ich habe mich gefragt, ob System Verilog eine Fähigkeit hat, die Variablennamen im laufenden Betrieb zu ändern. Zum Beispiel habe ich den folgenden Code:Änderung der Variablenbezeichnung im SystemVerilog

var1 = 1; 
var2 = 2; 
var3 = 3; 

und ich mag die folgenden Prüfungen

if(var1 == 1) 
    $display("var1 matched"); 
if(var2 == 2) 
    $display("var2 matched"); 
if(var3 == 3) 
    $display("var3 matched"); 

So im obigen Fall tun, wenn ich ‚n‘ Variablen, werde ich ' n Schecks.

Also aus diesem Grund, ich war auf der Suche nach einer Alternative, die so etwas wie dies funktioniert:

for(int i=0; i<=3;i++) 
    if($sformatf("var%0d", i) == i) //here the variable name changes on the fly 
    $display("var%0d matched", i); 

ich den obigen Code versucht, und es gab keine Fehler, aber es benahm sich nicht wie erwartet.

Ich habe auch versucht, einen String-Verkettung wie so

for(int i=0; i<=3;i++) 
    if({var,$sformatf("%0d", i)} == i) 
    $display("var%0d matched", i); 

Überraschenderweise gab diese auch keine Fehler. Aber es war ein Vergleich von mir, also geht es immer weiter.

Kann mir jemand sagen, ob es etwas im System Verilog gibt, das ich verwenden könnte?

Dank

+2

Sie können ein Array verwenden. – toolic

Antwort

0

Ich habe gerade überprüft die Abschnitte des LRM, die im Zusammenhang mit dieser sind und keinen Hinweis finden konnte, was anzeigt, dass es unterstützt wird. Das Verhalten, das Sie sehen, liegt an der Tatsache, dass Sie die Funktion $ sformatf im Ausdruck "cond_predicate" der bedingten "if" -Anweisung verwenden.

0

Schauen Sie in Abschnitt 22.5.1 der IEEE1800-2012 spec. Sie können ein Makro mit `` verwenden, um Bezeichner aus Argumenten zu konstruieren.

`define dyn_var(x) var``x 
for(int i=1; i<=3;i++) 
    if(`dyn_var(i) == i) 
     $display("var%0d matched", i); 
+0

Danke für die Antwort. Es kann auch eine gute Idee sein, einen direkten Link zu der Spezifikation bereitzustellen – YakovL