mikrocontroller.net

Forum: FPGA, VHDL & Co. SystemVerilog '(| a[x:0)' - was macht das '|'?


Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich versuche gerade, mir auf eine SystemVerilog-Quelle einen Reim zu 
machen. Da taucht folgendes Konstrukt auf, aus dem ich nicht so recht 
schlau werde:
a[ 'h6] = (| o[7:0]) ? b : c;

Der Fragezeichen-Operator rechts ist klar, aber was bedeutet der 
'|'-Operator in der Klammer?

(a ist ein zweidimensionales Array
logic [NUM_BITS-1:0] a[15:0];
)

Weiß das jemand aus der Hüfte? Danke.

Autor: Samuel C. (neoexacun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kurze Recherche sagt, dass dieser Operator ein OR über alle gegebenen 
Bits macht.

Genannt "Bit Wise OR reduction".

: Bearbeitet durch User
Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Samuel C. schrieb:
> Kurze Recherche sagt, dass dieser Operator ein OR über alle gegebenen
> Bits macht.

Vielen Dank - demnach wäre das o.g. Statement gleichbedeutend mit den 
VHDL-Zeilen:
function or_reduce(vec : std_ulogic_vector) return std_ulogic is
    variable res : std_ulogic := '0';
begin
    for i in vec'range loop res := res or vec(i); end loop;
    return res;
end function or_reduce;

a(16#6#) <= b when ?? or_reduce(o) else c;

: Bearbeitet durch User
Autor: Samuel C. (neoexacun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, diese Funktion wird übrigens schon über std_logic_misc 
bereitgestellt.

Autor: Marcus H. (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus F. schrieb:

> Vielen Dank - demnach wäre das o.g. Statement gleichbedeutend mit den
> VHDL-Zeilen: [...]

Nicht ganz. Wie Du ja am Anfang bereits angemerkt hast, handelt es sich 
um ein zweidimensionales object. Bist Du eigentlich sicher, dass das 
genau so im Quelltext steht? Du hast im Beispiel nämlich eine ungepackte 
Dimension (hinter dem Signalnamen). In dem Kontext is ein reduction 
operator meines Wissens nach nicht legal.

Autor: Marcus H. (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
War schon spät... Du hast uns ja die Deklaration von a gezeigt, nicht 
die von o. Also ja, genau so wie das VHDL.

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Trotzdem danke.

Immerhin weiß ich jetzt, daß es in SystemVerilog "normale" und gepackte 
Arrays gibt (wenn sich  auch das Verständnis, warum man das unbedingt 
braucht noch nicht eingestellt hat).

Autor: Marcus H. (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gepackte dimensionen haben ein definiertes Abbild im Speicher. Kann man 
auch praktisch in einer unit verwenden.
bit [3:0][7:0] fourbytes;
bit [31:0] oneint;

initial begin
    oneint = 32'h8000_0000;
    fourbytes = oneint;
    $display(fourbytes[3][7]); // prints '1'
end
Ungepackte Dimensionen verwendet man daher eher für "lose" 
zusammenhängende Daten.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.