Strings konkattinieren

OP #7419393
Lesenswert?

Hallo zusammen,

ich möchte in meiner Testbench mir gern einen String zusammenbauen und diesen anschließend mit einem Report Statement ausgeben. Leider stehe ich gerade auf dem Schlauch, wie ich das am Besten anstelle. So schon mal nicht ;-)

1
process
2
  constant c_MyValue : integer := 42;
3
  variable v_MyString : string(1 to 1024);
4
begin
5
  v_MyString := "Hello ";
6
  wait for 10 ns;
7
  v_MyString := v_MyString & "World ";
8
  wait for 10 ns;
9
  v_MyString := v_MyString & to_string(c_MyValue);
10
  wait;
11
end process;
OP #7419529
Lesenswert?

Aktuell nutze ich Questsasim mit VHDL2008, wobei das ein VHDL-typisches Problem ist und m.E. simulatorunabhängig.

In der Zeile 7 würde der Simulator melden, dass der Range nicht passt (links 1024, rechts 1024 + 7 oder 8 (also die Länge von "World "). Ich hab schon überlegt, ob mir eine line weiterhilft, da kann ich ja mittels write werte anhängen, allerdings weiß ich nicht, wie ich eine line in einen String konvertieren kann, damit er mittels Report ausgegeben werden kann.

integer'image() funktioniert auch, wobei ich mir mit VHDL2008 die to_string() Funktion angewöhnt habe.

P.S. in meinem Beispiel fehlt am Ende das report statement:

1
  [...]
2
  v_MyString := v_MyString & to_string(c_MyValue);
3
  report v_MyString severity note;
4
  wait;
5
end process;
#7419544
Lesenswert?

Fpga I. schrieb:

So schon mal nicht ;-)

so ginge es:

1
process(all)
2
    constant c_MyValue : integer := 42;
3
    type string_access is access string;
4
    variable v_MyString : string_access;
5
begin
6
    v_MyString := new string'("Hello ");
7
    v_MyString := new string'(v_MyString.all & "World ");
8
    v_MyString := new string'(v_MyString.all & to_string(c_MyValue));
9
    report(v_MyString.all) severity note;
10
end process;

(wobei das so natürlich ein paar Speicherleichen produziert, die Du selber aufräumen darfst).

Aber warum nicht einfach so:

1
report("Hello " & "World" & to_string(c_MyValue)) severity note;

???

OP #7419600
Lesenswert?

Vielen Dank, das werde ich mal ausprobieren. Ist access string das VHDL Equivalent zu einem Pointer?

Markus F. schrieb:

Aber warum nicht einfach so: report("Hello " & "World" & to_string(c_MyValue)) severity note;

In meinem Test sammle ich zu verschiedenen Zeitpunkten Informationen, die im report statement als eine Zeile ausgegeben werden sollen. Zum Zeitpunkt des Reset Statements weiß ich aber nicht mehr, wie viele und welche Informationen im Laufe des Testcases gesammelt habe. Daher der Wunsch, eine report Zeile stückweise zusammensetzen zu können.

#7421843
Lesenswert?

1
  process
2
    constant c_MyValue : integer := 42;
3
    variable v_MyString : string(1 to 1024);
4
  begin
5
    v_MyString := (1 to 1024 - 6 => ' ') & "Hello ";
6
    wait for 10 ns;
7
    v_MyString := v_MyString(7 to 1024) & "World ";
8
    wait for 10 ns;
9
    v_MyString := v_MyString(to_string(c_MyValue)'Length + 1 to 1024) & to_string(c_MyValue);
10
    wait for 10 ns;
11
    report v_MyString;
12
    wait;
13
  end process;

Simuliert wunderprächtigst. Der String ist eben fest 1024 Zeichen lang. Wenn man da hinten was anhängen will, dann muss man den String schieben und vorne was weglassen.

#7422003
Lesenswert?

Gustl B. schrieb:

Simuliert wunderprächtigst. Der String ist eben fest 1024 Zeichen lang. Wenn man da hinten was anhängen will, dann muss man den String schieben und vorne was weglassen.

Na ja. Wir haben das Jahr 2023, ganze Zeitschriftenartikel, Diplomarbeiten und Abiturprüfungen werden von AIs geschrieben, aber unsereins soll Buchstaben abzählen wie vor 100 Jahren?

Ich würde - wenn ich so was machen wollte - wenigstens so was: https://github.com/kevinpt/vhdl-extras verwenden. Dort gibt es eine (soweit das in VHDL eben geht) VHDL-Implementierung des unbounded strings Pakets "Ada.Strings.Unbounded".

Auch nicht unbedingt Raketentechnik, aber das bringt uns wenigstens auf den Stand der Siebziger.

#7422404
Lesenswert?

Wenn du schon feste Strings hast wie hier das "Hello " dann kannst du beim Tippen mitzählen. Oder den String als Konstante ablegen. Oder beim Report den noch undefinierten String mit einem & an den konstanten String ranhängen. Ich finde es macht wenig Sinn da einen langen String mit 1024 Zeichen haben zu wollen. Wo ist der Mehrwert? Ich würde immer dort wo Informationen anfallen die ich haben will diese sofort reporten. Im Terminal sind das dann viele Zeilen, aber das kann man ja schön formatieren.

#7422690
Lesenswert?

Stefan F. schrieb:

Auch richtig geschrieben ist das eins der schrecklichen IT-Denglisch Wörter, die im Wortschatz normaler Menschen gänzlich fehlen.

Wer sie gleichwohl benutzt, wird trotzdem nicht inkarzeriert.

Aber "normale Menschen" verständigen sich vermutlich ohnehin eher auf Chinesisch. Hindi, Spanisch oder Punjabi. Oder Pidgin-Englisch.

Motopick schrieb:

Mann benutzt ja auch 'disjunkt',

wenn, dann diskret, selbst Frauen ...

'adjazent'

im Grenzbereich

oder 'imbazil'.

Allenfalls zur Selbstdarstellung.

#7423101
Lesenswert?

Oha, dass muss ich googeln.

Wenn du schon dabei bist: "fuesilieren".

Und den lateinischen Wortstamm vom "konkatinieren" kannst du dabei auch gleich nachschlagen. Es ist mitnichten Denglisch.

Einem String wird dabei eigentlich zu viel der Ehre zuteil. Die beiden Teile werden ja nur "zusammengepappt". Im Gegensatz zu einer Liste die danach u.U. Vorwaerts- und Rueckwaertsverkettung kennt.

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