Forum: FPGA, VHDL & Co. TCL Skripte in Quartus/TimeQuest


von Martin O. (ossi-2)


Lesenswert?

Im TimeQuest Timing Analyser unter Quartus kann man TCL Skripte laufen 
lassen. Mich würde interessieren ob Ihr das benutzt, und falls ja wofür.

von Markus F. (mfro)


Lesenswert?

In TimeQuest hatte ich dafür bislang keinen Bedarf, aber Quartus selbst 
kann ja auch sehr sinnvoll mit Tcl-Skripten aufgepeppt werden.

Das jedenfalls mache ich in fast allen meiner Projekte.

von Martin O. (ossi-2)


Lesenswert?

@mfro
Was machst Du denn mit TCL Scripten? Hast Du ein Beispiel? Wo finde ich 
die Beschreibung der möglichen TCL Kommandos in Quartus?

von Markus F. (mfro)


Lesenswert?

Martin O. schrieb:
> @mfro
> Was machst Du denn mit TCL Scripten? Hast Du ein Beispiel? Wo finde ich
> die Beschreibung der möglichen TCL Kommandos in Quartus?

Im Handbuch ;)
https://www.intel.com/content/www/us/en/programmable/quartushelp/current/index.htm#tafs/tafs/tafs.htm

Leider hat der Umzug von Altera zu Intel dafür gesorgt, daß die meisten 
Links zu den Handbüchern verschollen sind. Und Intel scheint's nicht auf 
die Reihe zu kriegen, die in ihrer Website anständig zu verlinken.

Zum ersten Teil der Frage:

Damit kann man alles mögliche anstellen (z.B. auch externe Makefiles 
aufrufen o.Ä.).

Beispiel: ich habe in eigentlich allen meiner FPGA-Projekte irgendwie 
einen µC drin - entweder im FPGA oder extern angeflanscht. In dessen 
Firmware möchte ich wissen, welche Config-Version eigentlich im FPGA 
ist. Dazu habe ich ein Tcl-Script, das eine VHDL-Datei mit Datum und 
Uhrzeit der Synthese erzeugt (irgendwo - vielleicht sogar hier - 
geklaut):
1
puts make_datetime.tcl
2
3
# Make datetime.vhd package from Tcl script
4
5
# Current date, time, and seconds since epoch
6
# Array index                                            0  1  2  3  4  5  6
7
set datetime_arr [clock format [clock seconds] -format {%Y %m %d %H %M %S %s}]
8
9
# Write VHDL package
10
set filename datetime.vhd
11
set file [open $filename w]
12
puts $file "library ieee;"
13
puts $file "use ieee.std_logic_1164.all;"
14
puts $file ""
15
puts $file "package datetime is"
16
puts $file "    -- Date information"
17
puts $file "    constant YEAR_INT  : integer                       := [lindex $datetime_arr 0];"
18
puts $file "    constant YEAR_HEX  : std_ulogic_vector(15 downto 0) := X\"[lindex $datetime_arr 0]\";"
19
puts $file "    constant MONTH_INT : integer                       := [lindex $datetime_arr 1];"
20
puts $file "    constant MONTH_HEX : std_ulogic_vector(7 downto 0)  := X\"[lindex $datetime_arr 1]\";"
21
puts $file "    constant DAY_INT   : integer                       := [lindex $datetime_arr 2];"
22
puts $file "    constant DAY_HEX   : std_ulogic_vector(7 downto 0)  := X\"[lindex $datetime_arr 2]\";"
23
puts $file "    constant DATE_HEX  : std_ulogic_vector(31 downto 0) := YEAR_HEX & MONTH_HEX & DAY_HEX;"
24
puts $file "    -- Time information"
25
puts $file "    constant HOUR_INT   : integer                       := [lindex $datetime_arr 3];"
26
puts $file "    constant HOUR_HEX   : std_ulogic_vector(7 downto 0)  := X\"[lindex $datetime_arr 3]\";"
27
puts $file "    constant MINUTE_INT : integer                       := [lindex $datetime_arr 4];"
28
puts $file "    constant MINUTE_HEX : std_ulogic_vector(7 downto 0)  := X\"[lindex $datetime_arr 4]\";"
29
puts $file "    constant SECOND_INT : integer                       := [lindex $datetime_arr 5];"
30
puts $file "    constant SECOND_HEX : std_ulogic_vector(7 downto 0)  := X\"[lindex $datetime_arr 5]\";"
31
puts $file "    constant TIME_HEX   : std_ulogic_vector(31 downto 0) := X\"00\" & HOUR_HEX & MINUTE_HEX & SECOND_HEX;"
32
puts $file "    -- Miscellaneous information"
33
puts $file "    constant EPOCH_INT  : integer := [lindex $datetime_arr 6];  -- Seconds since 1970-01-01_00:00:00"
34
puts $file "end package;"
35
close $file

Das wird im FPGA mit einer Component an den µC-Bus angeschlossen und der 
kann anschließend Synthesedatum und -Uhrzeit abfragen.

Damit ich nicht vergesse, die Datei bei jeder Synthese neu zu erzeugen, 
steht in meiner .qsf-Datei das da:
1
set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:precmd.tcl"

Das bewirkt, daß bei jedem Synthesestart aus Quartus heraus zuallererst 
das precmd.tcl-Script abgearbeitet wird. In dem steht wiederum (z.B.) 
das hier:
1
set precmd_list { "embed_m68k.tcl" "make_datetime.tcl" }
2
3
foreach item $precmd_list {
4
    post_message "execute $item"
5
    exec quartus_sh -t $item
6
}

was bewirkt, daß alle .tcl Scripte in der Liste vor Synthesestart 
abgearbeitet werden. Will ich eins dazu haben, brauche ich das nur in 
precmd_list einzutragen. embed_m68k.tcl z.B. erzeugt aus einem 
µC-Objectfile eine VHDL-Entity mit dem *.o-Inhalt als ROM.

von Dussel (Gast)


Lesenswert?

In TimeQuest nicht, aber in Platform Designer und Quartus.

von Martin O. (ossi-2)


Lesenswert?

Ich glaub so langsam kapier ichs. Dank eurer Hilfe!
Seh ich das richtig, dass ich im .qsf file mit

set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:XXX.tcl"

mitteile, dass for dem design-flow die routine XXX.tcl ausgeführt werden 
soll?

Wie ändere ich den .qsf File so, dass quartus das mitbekommt bzw. dass 
die Änderung erhalten bleibt wenn quartus sonstwie an den qsf file geht?

von Markus F. (mfro)


Lesenswert?

Martin O. schrieb:
> Ich glaub so langsam kapier ichs. Dank eurer Hilfe!
> Seh ich das richtig, dass ich im .qsf file mit
>
> set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:XXX.tcl"
>
> mitteile, dass for dem design-flow die routine XXX.tcl ausgeführt werden
> soll?

Jupp.

>
> Wie ändere ich den .qsf File so, dass quartus das mitbekommt bzw. dass
> die Änderung erhalten bleibt wenn quartus sonstwie an den qsf file geht?

Mit einem Texteditor während das Projekt nicht in Quartus geöffnet 
ist.

von Martin O. (ossi-2)


Lesenswert?

Ich komme jetzt schon etwas weiter. Wenn ich nach dem "fitter"
den folgenden TCL-code ausführe:
1
set module [lindex $quartus(args) 0]
2
if [string match "quartus_fit" $module] {
3
  load_package report
4
  post_messge [get_fitter_resource_usage -alut]
5
  }
bekomme ich die Fehlermeldung
1
Tcl error: ERROR: Can't find panel: Fitter||Resource Section||Fitter Resource Usage Summary. Make sure the project was compiled by quartus_fit and the panel was not deleted.
2
    while executing
3
"get_fitter_resource_usage -alut"
4
    invoked from within
5
"if [string match "quartus_fit" $module] {
6
  post_message "----------------------------------------------------------- Running after fitter" load_..."

Es wird anscheinend das resultat-panel des fitters nicht gefunden. Was 
mache ich falsch ?

von Markus F. (mfro)


Lesenswert?

Martin O. schrieb:
> Was
> mache ich falsch ?

Du mußt erst den report laden:
1
load_report
2
get_fitter_resource_usage -alut

von Martin O. (ossi-2)


Lesenswert?

bei "load_report" bekomme ich die Meldung:
1
Error (23035): Tcl error: ERROR: You must open a project before you can use this command.
2
3
    while executing
4
"load_report"
5
    invoked from within
6
"if [string match "quartus_fit" $module] {
7
  post_message "----------------------------------------------------------- Running after fitter"
8
  load_pac..."
9
    (file "ossi1next.tcl" line 8)

Anscheinend muss ich das projekt öffnen, obwohl es eigentlich im flow 
geöffnet sein sollte?

von Martin O. (ossi-2)


Lesenswert?

Jetzt klappts: man muss das passende projekt öffnen, das hats gebracht.
Aber bestimmt habe ich demnächst noch weitergehende Fragen.

Besten Dank schon mal

von Martin O. (ossi-2)


Lesenswert?

Hat jemand noch TCL-Skripte, die er zu teilen bereit ist?

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.