Forum: FPGA, VHDL & Co. Timestamp in Synthese einbauen


von Martin (Gast)


Lesenswert?

Hallo zusammen,

kennt ihr eine Möglichkeit, wie ich beim bauen einer FPGA Firmware einen 
Timestamp mit einfügen kann? Dieser soll Build Datum/Uhrzeit enthalten, 
damit ich die Firmware von außen sicher identifizieren kann. (verzicht 
auf eine manuelle Vergabe der Versionsnummer bzw ergänzend zur 
Haupt-Versionsnummer)

Das ganze sollte idealerweise Toolübergreifend funktionieren, da wir 
FPGAs aller Hersteller programmieren. Falls man sich jedoch in die 
Synthese einklinken muss, wäre es auch möglich, für jeden Hersteller 
einen eigenen Ansatz zu wählen, auch wenn ich eine Lösung rein in VHDL 
bevorzuge.

Viele Grüße,
Martin

von Christian R. (supachris)


Lesenswert?

Das könntest du über einen gernic machen. Bei Xilinx kann man der 
Sythese die Generics des Top-Levels mitgeben, xst akzeptiert das in der 
.xst Datei. Da gehen auch Strings.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Martin schrieb:
> Dieser soll Build Datum/Uhrzeit enthalten,
> damit ich die Firmware von außen sicher identifizieren kann.
Wie willst du "von aussen" am FPGA erkennen, welcher Bitstrom da gerade 
werkelt?

von Martin (Gast)


Lesenswert?

Hallo,

erst einmal vielen Dank für die ersten Antworten.

@Christian
über die XILINX Tool Chain kann ich das XST File aber nicht automatisch 
anpassen, oder? Ich bräuchte für diesen Weg also ein Compile Script (ein 
manuelles Anpassen der Files will ich ja gerade vermeiden)


@Lothar
In der Regel habe ich ein Dateninterface (UART/SPI/Parraleles 
interface...), über das ich bestimmte Register auslesen kann. In sofern 
reicht mir ein konstanter SLV, den ich beispielsweise über eine 
spezielle Adresse von außen abfragen kann

Viele Grüße,
  Martin

von Heinrich H. (Firma: Ich.AG) (hhanff)


Lesenswert?

Hallo!

Ich habe in einem meiner Designs eine "lesbare" Versionsnummer 
eingebaut.
Auslesen kann man die Versionsnummer z.B. via UART.

Komfortabel ist es, weil ich bei mir die SVN Revisionsnummer verwende 
und diese wir bei einem svn commit automatisch erhöht. Dazu habe ich die 
svn properties mit

> svn propset svn:keywords "Date Author Revision"

gesetzt.

In der entsprechenden vhdl Datei habe ich nen String
  constant REVISION_C : string(1 to REVISION_STRING_LENGTH_C) := "$Rev:: 
1304   $:";
der die aktuelle Revisionsnummer enthält. Aus diesem String entnehme ich 
die Zahl, wandle sie nach std_logic_vector(15 downto 0) und dann raus 
damit.

Leider habe ich nicht herausgefunden, wie ich nach jeder erfolgreichen 
Synthese eine Zahl erhöhen kann. Da müsste man sich, genauso wie für 
eine Timestamp,  wohl mit einem Skript helfen

Gruß,

    H

von Christian R. (supachris)


Lesenswert?

Martin schrieb:
> über die XILINX Tool Chain kann ich das XST File aber nicht automatisch
> anpassen, oder? Ich bräuchte für diesen Weg also ein Compile Script (ein
> manuelles Anpassen der Files will ich ja gerade vermeiden)

Musst du über script lösen. Die xst Datei ist normales Ascii, da stehen 
die Generics drin. Eventuell geht das auch über ein Make-File, es gibts 
ja welche für die Xilinx Toolchain...meines Wissens erzeugen die die xst 
Datei bei jedem Aufruf.

von Duke Scarring (Gast)


Lesenswert?

Martin schrieb:
> kennt ihr eine Möglichkeit, wie ich beim bauen einer FPGA Firmware einen
> Timestamp mit einfügen kann?
Ja. Letztens erst eingebaut. Im Makefile steht:
1
DATE = $(shell date +"%b %d %Y  %X")
2
LENGTH = $(shell expr length "$(DATE)")
3
4
all: version.vhd
5
6
.PHONY: version.vhd
7
version.vhd:
8
  @echo "updating $@ ($(DATE))"
9
  @rm -f $@
10
  @echo "package version is"                                                    >> $@
11
  @echo ""                                                                      >> $@
12
  @echo "    constant version_time_c : string( 1 to $(LENGTH)) := \"$(DATE)\";" >> $@
13
  @echo ""                                                                      >> $@
14
  @echo "end package version;"                                                  >> $@

Im Design wird mit der Zeichenkette ein ROM initialisiert. Dieses ROM 
ist im Speicher meines SoftCores eingeblendet:
1
...
2
    char *hw_revision = (char *)0x80000000;
3
...
4
    putstr("\nHW synthesized: "); putstr( hw_revision);
5
...

Duke

von Matthias (Gast)


Lesenswert?

Ich habs bei Quartus mit TCL Script gelöst, da gibt es Hooks, damit die 
zu bestimmten Zeitpunkten der Syntheseprozess ausgeführt werden. Das 
Skript holt sich die aktuelle Zeit, generiert eine trivial-VHDL Datei im 
Syntheseverzeichnis mit einem Package, das eine Konstante mit diesem 
Wert belegt, im Design wird diese Konstante in ein read-only Register 
(ich hab netterweise in allen Designs Registerbänke) geschrieben.

Ist zwar nicht dasselbe wie eine Versionsnummer aber ich kann zumindest 
den Tag bestimmen, an dem ich ein bestimmtes Design synthetisiert habe. 
Ein anderes TCL Skript speichert am Ende des Syntheselauf die Bitstreams 
mit Zeitstempel im Dateinamen. Bisher hab ich damit den Überblick 
behalten.

lg
Matthias

von Heinrich H. (Firma: Ich.AG) (hhanff)


Lesenswert?

Matthias schrieb:
> Ich habs bei Quartus mit TCL Script gelöst, da gibt es Hooks, damit die
> zu bestimmten Zeitpunkten der Syntheseprozess ausgeführt werden. Das
> Skript holt sich die aktuelle Zeit, generiert eine trivial-VHDL Datei im
> Syntheseverzeichnis mit einem Package, das eine Konstante mit diesem
> Wert belegt, im Design wird diese Konstante in ein read-only Register
> (ich hab netterweise in allen Designs Registerbänke) geschrieben.
>
> Ist zwar nicht dasselbe wie eine Versionsnummer aber ich kann zumindest
> den Tag bestimmen, an dem ich ein bestimmtes Design synthetisiert habe.
> Ein anderes TCL Skript speichert am Ende des Syntheselauf die Bitstreams
> mit Zeitstempel im Dateinamen. Bisher hab ich damit den Überblick
> behalten.
>
> lg
> Matthias

Hallo Matthias!

Das klingt interessant! Magst Du das TCL Skript mal posten?
Xilinx ISE/PlanAhead hat ja auch eine eingebaute TCL Shell. Weiss jemand 
ob man ähnliches auch mit den Tools von Xilinx machen kann?

Gruß,

     Hendrik

von Uwe Bonnes (Gast)


Angehängte Dateien:

Lesenswert?

Wir stecken den Revisionsstring in ein auslesbares Blockram und die 
Daten dazu in ein Memfile. Das Memfile erzeugen wir mit dem C Programm 
oben und im Makefile etwa wie:

alu_cmds.mem: utils/hf_cmd/hf_cmd
        utils/hf_cmd/hf_cmd
        REVISION=`svnversion`; \
        TAGNAME=`svn info | grep -e '^URL: .*/tags/[^/]*/.*$$' | sed -e 
's%^.*/tags/\([^/]*\)/.*$$%\1%'`; \
        BUILDTIME=`date -u '+%F %T'`; \
        $(STRING2MEM)  -d -w 4  "LLBBC10 tag name: $$TAGNAME rev.: 
$$REVISION build time: $$BUILDTIME \n(c) 2008-2011 Uwe Bonnes, Martin 
Konrad, IKDA, TU Darmstadt\n" >> $@

von Matthias (Gast)


Lesenswert?

Gerne doch, aber ich warne gleich vor, schön ist anders ;) .

TCL Code für Dateigenerierung:
1
proc get_timestamp_16bit {} {
2
    set currtime [clock seconds]
3
    expr $currtime / [expr 3600 * 24]
4
}
5
6
proc get_timestamp_32bit {} {
7
    clock seconds
8
}
9
10
proc write_timestamp_pkg_file {} {
11
    # delete the file if it already exists
12
    file delete "timestamp_pkg.vhd"
13
14
    set fd [open "timestamp_pkg.vhd" w+]
15
16
    set ts16 [get_timestamp_16bit]
17
    set ts32 [get_timestamp_32bit]
18
19
    puts $fd "-- File: timestamp_pkg.vhd"
20
    puts $fd "-- This is a generated file, do not modify."
21
    puts $fd "--"
22
    puts $fd ""
23
    puts $fd "package timestamp is"
24
    puts $fd ""
25
    puts $fd "  constant timestamp_16 : integer := $ts16 ;"
26
    puts $fd "  constant timestamp_32 : integer := $ts32 ;"
27
    puts $fd ""
28
    puts $fd "end timestamp;"
29
    puts $fd ""
30
31
    puts $fd "package body timestamp is"
32
    puts $fd ""
33
    puts $fd "end timestamp;"
34
    puts $fd ""
35
36
    close $fd
37
}
38
39
40
foreach { flow project revision } $quartus(args) { break }
41
42
write_timestamp_pkg_file

Das Ergebnis sieht dann so aus:
1
-- File: timestamp_pkg.vhd
2
-- This is a generated file, do not modify.
3
--
4
5
package timestamp is
6
7
  constant timestamp_16 : integer := 15190 ;
8
  constant timestamp_32 : integer := 1312469976 ;
9
10
end timestamp;
11
12
package body timestamp is
13
14
end timestamp;

Wirklich schön wäre es wohl, wenn man 32 Bit verwendet und dann mit BCD 
in Hex ein aufs erste Hinschauen lesbares Datum reinschreibt. Aber meine 
TCL Kenntnisse sind eher bescheiden und ich hab auch mal nur 16 Bit 
Register, darum hab ich mich mal damit zufrieden gegeben.

lg
Matthias

von Heinrich H. (Firma: Ich.AG) (hhanff)


Lesenswert?

Matthias schrieb:
> Gerne doch, aber ich warne gleich vor, schön ist anders ;) .
Danke!

>
> TCL Code für Dateigenerierung:
> proc get_timestamp_16bit {} {
>     set currtime [clock seconds]
>     expr $currtime / [expr 3600 * 24]
> }
>
> proc get_timestamp_32bit {} {
>     clock seconds
> }
>
> proc write_timestamp_pkg_file {} {
>     # delete the file if it already exists
>     file delete "timestamp_pkg.vhd"
>
>     set fd [open "timestamp_pkg.vhd" w+]
>
>     set ts16 [get_timestamp_16bit]
>     set ts32 [get_timestamp_32bit]
>
>     puts $fd "-- File: timestamp_pkg.vhd"
>     puts $fd "-- This is a generated file, do not modify."
>     puts $fd "--"
>     puts $fd ""
>     puts $fd "package timestamp is"
>     puts $fd ""
>     puts $fd "  constant timestamp_16 : integer := $ts16 ;"
>     puts $fd "  constant timestamp_32 : integer := $ts32 ;"
>     puts $fd ""
>     puts $fd "end timestamp;"
>     puts $fd ""
>
>     puts $fd "package body timestamp is"
>     puts $fd ""
>     puts $fd "end timestamp;"
>     puts $fd ""
>
>     close $fd
> }
>
>
> foreach { flow project revision } $quartus(args) { break }
>
> write_timestamp_pkg_file
Das was ich heute Vormittag geschrieben habe sieht ähnlich aus. Leider 
konnte ich in PlanAhead keine Hooks o.ä. finden (gibt es dass 
irgendwo???).
Für mich ist das aber kein Problem, da ich PlanAhead eh die meisste Zeit 
über ein Skript starte.

Nur die Windows-Jungs werden wohl nen bisschen mehr Aufwand betreiben 
müssen, um das ganze in der GUI ans Rennen zu bekommen. Oder kann man 
Skripte als Post-Synthese Skript einbinden???

Gruß aus Bremen, mit ist warm,

     H

von Martin (Gast)


Lesenswert?

Hallo zusammen,

vielen Dank für Eure Anregungen, die Idee per TCL Script ein Package 
zugenerieren, gefällt mir. Das ermöglicht mir sowohl beim Bauen via GUI 
den Timestamp einzufügen, als auch beim Nutzen eines Compile Scriptes. 
Für Altera habe ich das im aktuellen Projekt mal eingebunden, bei Xilinx 
scheint es auch auf ähnlichem Weg zu funktionieren und ich bin 
zuversichtlich, dass auch die anderen FPGA Hersteller das Einbinden von 
Scripten vor der Synthese auf irgendeine Art erlauben. Da werde ich mich 
dann bei Bedarf einarbeiten.

Vielen Dank,
Martin

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.