Hallo, ich versuche im Moment mir einige TCL-Skipte zu schreiben, die im späteren Verlauf automatisch mein Waveformwindow nach dem Logikwert "x" durchsuchen sollen. Dazu bietet Modelsim folgenden Befehl an: searchlog -expr {<signalname>'hasX} {1 ps} <signalname> Soweit funktioniert das Ganze auch wunderbar. Wenn ich nun aber versuche den Funktioneruf in eine weitere Funktion zu kappseln: proc SearchX {signalname} { searchlog -expr {$signalname'hasX} {1 ps} $signalname; }; Bekomme ich lediglich die Meldung: "Null argument expression expansion failed" zurück. Woran könnte dies liegen? Denn sobalkd ich ein echo auf die Variable mache, liefret dieser genau den Ausdruck zurück mit dem es egtl. funktionieren sollte. Vielen Dank für die Antworten! Viele Grüße Andreas
>searchlog -expr {<signalname>'hasX} {1 ps} <signalname> >Soweit funktioniert das Ganze auch wunderbar. Habe mir mal ein Testsignal generiert und setze dies permanent auf 'U' Erhalte folgedes Ergebnis: {{} 0} Ist das so gewollt?
Na genau, das ist soweit richtig. Siehe hier: S.201: http://cseweb.ucsd.edu/classes/fa10/cse140L/lab/docs/modelsim_ref.pdf Die ersten leeren geschweiften Klammern geben den Zeitpunkt an, und die 0 die Anzahl. In dem Fall wurde nicht gefunden. Viele Grüße Andreas
>In dem Fall wurde nicht gefunden.
Eben! Es sollte aber was gefunden werden, da das Signal permanent auf
'U' ist.
Hallo, >Eben! Es sollte aber was gefunden werden, da das Signal permanent auf >'U' ist. Also wenn ich es richtig verstanden habe, gibt die Funktion nur einen Wert ungleich 0 zurück, sobald ein 'X' im Signalverlauf auftaucht. Warum dann bei 'U' eine Ausgabe erfolgen soll weis ich nicht. >Was nun, wird nach 'X' oder 'U' gesucht? Ich suche nach 'X'. Viele Grüße Andreas
>Also wenn ich es richtig verstanden habe, gibt die Funktion nur einen >Wert ungleich 0 zurück, sobald ein 'X' im Signalverlauf auftaucht. Sorry, mein Fehler. Du hast Recht.
Kannst Du bitte nochmal ohne Platzhalter schreiben, wie die konkreten Aufrufe mit und ohne proc aussehen? Vielleicht liegt darin ja der Fehler. Übrigens braucht man Strichpunkte in Tcl nur, wenn mehrere Kommandos in einer Zeile stehen sollen. Am Zeilenende sind sie weder nötig noch üblich.
Hallo, >Übrigens braucht man Strichpunkte in Tcl nur, wenn mehrere Kommandos in >einer Zeile stehen sollen. Am Zeilenende sind sie weder nötig noch >üblich. okay danke für den Hinweis. Meine Funktion sieht wie folgt aus: proc SearchX {signalname} { set temp [searchlog -expr {$signalname 'hasX} {1 ps} $signalname] # get first element of List set temp [lindex $temp 0] # calculate last elemenet in expression set LastElem [string length $temp] set LastElem [expr $LastElem - 1] # get state of comprehension set state [string index $temp $LastElem] if {$state == 0} { return 1; } else { echo ["Signalname:" $signalname "STRONG UNKNOWN (X) at:" $temp] return 0 } } >Kannst Du bitte nochmal ohne Platzhalter schreiben Und auf ein Signal angewandt: searchlog -expr {tb_rom_ctrl:i_rom_ctrl:rom_ip_DQ_io'hasX} {1ps} tb_rom_ctrl:i_rom_ctrl:rom_ip_DQ_io
Andreas schrieb: >>Übrigens braucht man Strichpunkte in Tcl nur, wenn mehrere Kommandos in >>einer Zeile stehen sollen. Am Zeilenende sind sie weder nötig noch >>üblich. > > okay danke für den Hinweis. Inzwischen habe ich einen Blick in die Doku von ModelSim geworfen und da scheinen die Strichpunkte doch üblich zu sein. Allgemein läßt man sie in Tcl aber normalerweise weg. > set temp [searchlog -expr {$signalname 'hasX} {1 ps} $signalname] > [...] > searchlog -expr {tb_rom_ctrl:i_rom_ctrl:rom_ip_DQ_io'hasX} {1ps} > tb_rom_ctrl:i_rom_ctrl:rom_ip_DQ_io Ich kenne mich nur mit Tcl selbst aus, nicht mit ModelSim, es fällt mir aber auf, daß in der proc vor "'hasX" ein Leerzeichen steht, im direkten Aufruf aber nicht. Könnte das das Problem sein? Auch das Argument {1 ps} schreibst Du mal mit und mal ohne Leerzeichen. Außerdem wäre da noch die Frage, ob searchlog auf dem Argument von -expr Variablensubstitution macht oder nicht. Funktioniert denn folgendes außerhalb einer proc?
1 | set signal "tb_rom_ctrl:i_rom_ctrl:rom_ip_DQ_io" |
2 | searchlog -expr {$signal'hasX} {1 ps} $signal] |
Falls das den gleichen Fehler bringt, wie in der proc, probier's mal mit Anführungszeichen um das Argument von -expr, statt der geschweiften Klammern, also so:
1 | searchlog -expr "$signal'hasX" {1 ps} $signal] |
Die Suche nach dem letzten Element in Deiner proc ist übrigens etwas umständlich, denn sowohl [lindex] als auch [string index] erlauben als Index-Parameter auch die speziellen Werte "end", "end-1" und in neueren Tcl-Versionen auch "end-<nummer>". Das Ganze könnte also so aussehen:
1 | set temp [lindex $temp 0] |
2 | set state [string index $temp end] |
oder noch kompakter:
1 | set state [string index [lindex $temp 0] end] |
Edit: Ach, und die echo-Zeile wird so wie sie dasteht wohl auch zu einer Fehlermeldung führen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.