Forum: FPGA, VHDL & Co. Modelsim TCL Script Prüfen auf Logikwert X, Proc Call


von Andreas (Gast)


Lesenswert?

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

von HeyHo (Gast)


Lesenswert?

>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?

von Andreas (Gast)


Lesenswert?

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

von HeyHo (Gast)


Lesenswert?

>In dem Fall wurde nicht gefunden.

Eben! Es sollte aber was gefunden werden, da das Signal permanent auf 
'U' ist.

von Franz (Gast)


Lesenswert?

Was nun, wird nach 'X' oder 'U' gesucht?

von Andreas (Gast)


Lesenswert?

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

von HeyHo (Gast)


Lesenswert?

>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.

von R. M. (rmax)


Lesenswert?

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.

von Andreas (Gast)


Lesenswert?

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

von R. M. (rmax)


Lesenswert?

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
Noch kein Account? Hier anmelden.