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
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.
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?
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
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
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.
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:
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
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
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" >> $@
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
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
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