Forum: FPGA, VHDL & Co. TCL Command mit Variable


von Dominik Gausa (Gast)


Lesenswert?

Hallo Forum,

ich nutze Modelsim-Altera 10.1d und möchte rekursiv durch die instanzen 
gehen und diese gruppiert darstellen lassen.
Dazu schreibe ich mir eine Prozedur, die ich für alle Instanzen aufrufe 
und in der ich die einzelnen Signale etc. optisch aufbereitet ausgebe.
1
proc plot { inst } {
2
  echo plotting $inst "\n"
3
  set entity_name "top"
4
  
5
  set group ""
6
  foreach sgrp [split $inst "/"] {
7
    if { $sgrp eq "" } {
8
      echo "empty"
9
    } else {
10
      echo "append " $sgrp
11
      append group " -group " $sgrp " "
12
      }
13
    }
14
    echo "Group: " $group
15
16
  echo "add wave $group -divider -height 32 CLOCK"
17
  add wave $group -divider -height 32 CLOCK
18
  foreach sig [ find signals /$inst/CLK_* ] { 
19
    echo "add wave -group vhdl $group -color #F5BCA9 $sig"
20
    set var "-group top "
21
    add wave -group vhdl $var -color #F5BCA9 $sig
22
    }
23
24
  foreach sig [ find signals /$inst/RESET_* ] { 
25
    add wave $group -color #FE642E $sig
26
    }
27
28
  add wave -group $inst -noupdate -divider -height 32 SIGNALS
29
  foreach sig [ find signals /$inst/s_* ] {
30
    add wave -group $inst -color #00BFFF $sig
31
    }
32
}
33
34
foreach ent [lsort [find instances /top_tb/* ] ] {
35
  echo $ent "\n"
36
  plot [lindex $ent 0]
37
}



habe folgendes Problem:
1
  foreach sig [ find signals /$inst/CLK_* ] { 
2
    echo "add wave -group vhdl $group -color #F5BCA9 $sig"
3
    set var "-group top "
4
    add wave -group vhdl $var -color #F5BCA9 $sig
5
    }

Ergibt:
1
# add wave -group vhdl  -group top_tb  -group top  -color #F5BCA9 /top_tb/top/CLK_SYS 
2
# ** Error: Unrecognized option: "-group top " ignored.
3
# Error in macro ./plot.do line 41
4
# Unrecognized option: "-group top " ignored.


Wie muss ich die Variable in den Befehlsaufruf einbringen, damit es 
funktioniert ?

Danke euch!

von Prof. Dr. Wolf (Gast)


Lesenswert?

Ich glaube diese thread wäre im PC-Programmierung Forum besser 
aufgehoben.

von Dominik Gausa (Gast)


Lesenswert?

Da es Hier hauptsächlich um die Nutzung von Makros für Modelsim für die 
Simulation von FPGA Verhalten geht. Denke ich das es Hier eher jemanden 
geben wird, welcher sich damit schon einmal beschäftigt hat.

Ferner spricht die Suchfunktion eine deutliche Sprache, das TCL im FPGA 
Forum eher verbreitet ist als im PC Forum.

von bernhard (Gast)


Lesenswert?

Um auf das Problem zurückzukommen: das liegt an den Parametern die add 
erwartet und wie TCL Parameter ersetzt. In deinem Beispiel wird add mit 
7 Parametern aufgerufen, nämlich
1
#arg:        1      2     3      4          5     6       7
2
       add wave -group  vhdl   $var     -color #F5BCA9 $sig
Auch nach der Ersetzung von $var durch den Inhalt "-group top " bleiben 
das 7 Parameter, nämlich
1
#arg:       1      2     3      4           5     6       7
2
       add wave -group  vhdl -group top  -color #F5BCA9 $sig
Der 4. Parameter ist also "-group top ", mit dem konnte add nichts 
anfangen. Eine mögliche Abhilfe wäre, in var nur den Gruppennamen zu 
speichern und add folgendermaßen aufzurufen
1
       set var top
2
       add wave -group vhdl -group $var -color #F5BCA9 $sig
3
#arg:         1     2    3      4    5     6       7      8
denn hier sind -group und $var zwei Argumente. Ich kenne Modelsim nicht, 
den "unrecognized option"-Fehler wird damit wohl los, ob es sinnvoll 
ist, zweimal eine Gruppe mit -group anzugeben, weiss ich nicht.

Viel Spass damit
B

von Dominik Gausa (Gast)


Lesenswert?

Vielen Dank, es hat mich weiter geführt.

Ich möchte damit rekursiv durch die Instanzen gehen und diese dann 
hirarchisch gruppiert anzeigen.

top
|-Counter
| |-Clock
| |-Signale
|-Ports
| |-Clock
| |-Signale
.
.
.

von Dominik Gausa (Gast)


Angehängte Dateien:

Lesenswert?

Bin nun weiter:

1
proc plot { inst } {
2
  echo plotting $inst "\n"
3
  set entity_name "top"
4
  set hirac [string trim [string map {"/" " "} $inst] ]
5
  set group [join [split $hirac " "] " -group " ]
6
  
7
  add wave -group vhdl -group $group -divider -height 32 CLOCK
8
  foreach sig [ find signals /$inst/CLK* ] {     
9
    add wave -group vhdl -group $group -color #F5BCA9 $sig
10
    }
11
  foreach sig [ find signals /$inst/RESET* ] {
12
    add wave -group vhdl -group $group -color #FE642E $sig
13
    }
14
    
15
  add wave -group vhdl -group $group -divider INTERFACE
16
  foreach sig [ find signals /$inst/in_* ] {
17
    add wave -group vhdl -group $group -color #FE642E $sig
18
    }
19
  foreach sig [ find signals /$inst/out_* ] {
20
    add wave -group vhdl -group $group -color #FE642E $sig
21
    }
22
  foreach sig [ find signals /$inst/io_* ] {
23
    add wave -group vhdl -group $group -color #FE642E $sig
24
    }
25
26
  add wave -group vhdl -group $group -noupdate -divider -height 32 SIGNALS
27
  foreach sig [ find signals /$inst/s_* ] { 
28
    add wave -group vhdl -group $group -color #00BFFF $sig
29
    }
30
}
31
32
foreach ent [lsort [find instances -recursive /top_tb/* ] ] {
33
  echo $ent "\n"
34
  plot [lindex $ent 0]
35
}

Läuft nun Fehlerfrei durch, aber statt $group so wie gewünscht mit in 
den Aufruf zu integrieren wird es als String gewertet aller -group 
".....".
Gibt es da noch eine Idee?

Danke euch ;-)

von Dominik Gausa (Gast)


Angehängte Dateien:

Lesenswert?

---- Breaking News ! ----

"eval" löst die Probleme ;-)

von bernhard (Gast)


Lesenswert?

Hm, ohne Kenntnis vom Modelsim verstehe ich immer noch nicht so richtig, 
was du vor hast. Ich vermute folgendes:

- du hast einen String inst, der durch Slash getrennte Gruppennamen 
enthält, also etwa
1
 gruppe1/g2/g3
- aus dem möchtest du den Befehl
1
  add wave -group vhdl -group gruppe1 -group g2 -group g3 -color ...
zusammenbasteln. Im Moment baust du dir in group ungefähr folgenden 
String zusammen
1
 -group gruppe1 -group g2 -group g3
und übergibst den an add. Dein String wird aber wieder nicht 
aufgebrochen, die add-Prozedur bekommt jetzt als Name einer Gruppe den 
ganzen String übergeben.

Ich sehe zwei Baustellen: eine ist eher weltanschaulich. Die Methode mit 
der du den String baust, ist nämlich umständlich und fehleranfällig, z. 
B. wenn die Gruppen Leerzeichen enthalten. Ich würde die Gruppenliste so 
bauen
1
   set inst g1/g2/g3
2
3
   set hirac [list]
4
   foreach i [split $inst /] {lappend hirac -group $i}
Jetzt steht in hirac
1
  -group g1 -group g2 -group g3

Zweite Baustelle: hirac soll in einzelne Parameter aufgebrochen werden. 
Bei alten TCLs (vor 8.5) gab es dazu nur eine unangenehme Möglichkeit
1
  eval add wave -group vhdl $group -color #00BFFF $sig
Da Unangenehme ist: mit eval wird das Kommando komplett evaluiert, wenn 
die Gruppennamen böse Zeichen (z. B. Leerzeichen oder []) enthalten, 
gibt es Ärger. Um einen boshaften Fall zu zeigen: Evaluiert man den 
Gruppenname "[exec rm -fr]" ist unter Umständen die Platte leer. Ab TCL 
8.5 geht stattdessen
1
  add wave -group vhdl {*}$group -color #00BFFF $sig
wenn Modelsims TCL neu genug ist, nimm die zweite Methode. In beiden 
Fällen gehört vor $group kein -group, denn das -group steht ja schon in 
der Variablen.

Jetzt sehe ich grade die "breaking news". Naja, jetzt schicke ich meinen 
Post trotzdem ab.

Viel Spass
B.

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.