Forum: FPGA, VHDL & Co. SVN Nummer als std_logic_vector


von Achim (Gast)


Lesenswert?

Hallo Zusammen,

in einem Projekt stelle ich einem DSP ein Register zur Verfügung, das 
die Versionsnummer des FPGA Images enthält. Zurzeit ändere ich die 
Nummer nach jeder Änderung selbst was ich (Asche über mein Haupt) schon 
mal verbockt habe.
Ich würde die Sache gerne gerade ziehen, indem die aktuelle (bzw die zur 
Zeit des commits, ich sehe das Problem) SVN Nummer als Keyword direkt 
ins vhd gebracht und als std_logic_vector übergeben wird.

Genau daran hänge ich jetzt. Meine, wenn auch nicht so elegante Lösung 
sah so aus:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
use work.simulation_tools_pkg.all;
5
use std.textio.all;
6
7
package svn_pkg is
8
  constant c_rev_nr_string : string := "$Revision: 86 $";
9
  function f_rev_number return std_logic_vector;
10
end package svn_pkg;
11
12
package body svn_pkg is
13
function f_rev_number return std_logic_vector is
14
    variable v_start_index    : positive := 1;
15
    variable v_int_char_count : natural  := 0;
16
    variable v_number_string  : string(1 to 4) := (others => '-');
17
  begin
18
    -- parse the string and search the first int number in string
19
    for i in 10 to c_rev_nr_string'length loop -- 10 is where the number string begins
20
      if c_rev_nr_string(i) >= '0' and c_rev_nr_string(i) <= '9' then
21
        v_start_index := i;
22
        exit;
23
      end if;
24
    end loop;
25
    -- parse the string beginning at the first int number and copy till end of number string
26
    for i in v_start_index to c_rev_nr_string'length loop -- start index is where the number string begins
27
      if c_rev_nr_string(i) >= '0' and c_rev_nr_string(i) <= '9' then
28
        v_int_char_count := v_int_char_count + 1;
29
      else
30
        v_int_char_count := v_int_char_count - 1;
31
        exit;
32
      end if;
33
    end loop;
34
    v_number_string := ((v_number_string'left to (v_number_string'right - v_int_char_count - 1) => character'('0'))) & c_rev_nr_string(v_start_index to v_start_index + v_int_char_count);
35
    report "Found revision number: " & (v_number_string);
36
    return std_logic_vector(to_unsigned(f_conv_string_2_int(v_number_string, 10), 16));
37
  end function f_rev_number;
38
39
end package body svn_pkg;

f_conv_string_2_int macht nur das, was die Funktion sagt - ist in meinem 
sim_tool_pkg.

Leider bekomme ich das nicht durch die Synthese, weil der Index des 
rev_nr strings nicht konstant ist.

Habt ihr vielleicht eine Idee das Problem zu lösen oder vielleicht einen 
anderen, eleganteren Weg?

Viele Grüße

Achim

von Kest (Gast)


Angehängte Dateien:

Lesenswert?

Ich mach sowas einfacher, mit einem TCL-Script, den ich irgednwo geklaut 
habe und angepasst habe.

von Christian R. (supachris)


Lesenswert?

Ich mache sowas mit subwcrev das kann auch gleich Text in einem Template 
ersetzen und zwar die Rev der gesamten Arbeitskopie und nicht nur die 
des einen Files.

von Markus F. (mfro)


Lesenswert?

Das wird so nix.

Nicht weil man den Text, den Subversion in $Revision$ schreibt, nicht 
irgendwie da raus kriegen würde, sondern weil der Ansatz verkehrt ist.

Du willst ja die Quelle genau einmal schreiben und dann nie mehr 
anfassen müssen (ist ja auch nachvollziehbar).

Wenn Du's aber nie mehr anfaßt, wird sich auch seine Revision nie mehr 
ändern, selbst wenn alle anderen Dateien des Projekts schon hundert 
Revisionen weiter wären. Damit das funktioniert, müsstest Du für jedes 
Release irgendwas in der Datei ändern (damit Subversion einen 
Unterschied zum Vorgänger findet), da kannst Du die Release-Nummer auch 
gleich von Hand vergeben.

Da ist der Ansatz mit der Revision-Nummer des Projektverzeichnisses 
schon besser (die ändert sich mit jeder Änderung im Verzeichnis). Aber 
auch da ist ein Haken: wenn Du einen Bugfix an einem alten Release 
machst (dafür macht man üblicherweise einen Branch), geht der Zähler 
hoch (noch "hinter" den des aktuellen Working-branches). Für ein 
vernünftiges Release-Management müsstest Du dir irgendwo extern merken, 
daß R100 (z.B.) das "Release 5" ist, während R107 die Reparatur vom 
Release 3 meint (also eigentlich einen Vorgänger).

Was Du eigentlich haben willst, ist das Release-Tag (wenn ein Release - 
egal ob Latest oder Bugfix) fertig ist, macht man üblicherweise ein "svn 
tag", das allen für dieses Release gültigen Dateien den Stempel "ich 
gehöre zu 3.1" oder "ich gehöre zu 5.0" aufdrückt.

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.