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:
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
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" >> $@
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.