SystemVerilog '(| a[x:0)' - was macht das '|'?

OP #5739589
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.
OP #5739751
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;
Persönliche Seite #5741405
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.
Persönliche Seite #5742593
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.

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