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


von Markus F. (mfro)


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:
1
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
1
logic [NUM_BITS-1:0] a[15:0];
)

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

von Samuel C. (neoexacun)


Lesenswert?

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

Genannt "Bit Wise OR reduction".

: Bearbeitet durch User
von Markus F. (mfro)


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:
1
function or_reduce(vec : std_ulogic_vector) return std_ulogic is
2
    variable res : std_ulogic := '0';
3
begin
4
    for i in vec'range loop res := res or vec(i); end loop;
5
    return res;
6
end function or_reduce;
7
8
a(16#6#) <= b when ?? or_reduce(o) else c;

: Bearbeitet durch User
von Samuel C. (neoexacun)


Lesenswert?

Ja, diese Funktion wird übrigens schon über std_logic_misc 
bereitgestellt.

von Marcus H. (mharnisch) Benutzerseite


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.

von Marcus H. (mharnisch) Benutzerseite


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.

von Markus F. (mfro)


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).

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Gepackte dimensionen haben ein definiertes Abbild im Speicher. Kann man 
auch praktisch in einer unit verwenden.
1
bit [3:0][7:0] fourbytes;
2
bit [31:0] oneint;
3
4
initial begin
5
    oneint = 32'h8000_0000;
6
    fourbytes = oneint;
7
    $display(fourbytes[3][7]); // prints '1'
8
end
Ungepackte Dimensionen verwendet man daher eher für "lose" 
zusammenhängende Daten.

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.