TCL Skripte in Quartus/TimeQuest

#5640961
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.
#5641357
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?
#5641405
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.
#5641416
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 ?
#5641951
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren