Unterschied zwischen >> und >>> in Verilog?

Was ist der Unterschied zwischen >>und >>>in verilog/system verilog? Ich weiß, dass ==nur auf 1 und 0 ===getestet wird, während auf 1, 0, X, Z getestet wird. Inwiefern ist das also dem Shift-Operator ähnlich?

Antworten (2)

Es ist nicht ähnlich zu ==/ ===, wenn der linke Operand vorzeichenbehaftet ist, dann >>>führt es eine Vorzeichenerweiterung durch.

reg signed [9:0] b = 10'sb11_0101_0101;
reg signed [9:0] a_signed;
reg        [9:0] a_unsigned; 

always_comb begin
  a_signed   = b >>> 2;
  a_unsigned = b >>  2;
end

Ergebnis:

#a_signed   1111010101
#a_unsigned 0011010101

Beispiel auf EDA Playground .

Wow, das ist genau das Gegenteil der Bedeutungen von Java >>und >>>Operatoren ... böse.
Verilog war 10 Jahre vor Java. :P
@ dave_59, aber vorzeichenbehaftete Werte (abgesehen vom 32-Bit- integerTyp) und die arithmetischen Verschiebungsoperatoren wurden erst in Verilog-2001 in Verilog eingeführt.
Verilog musste bereits >>1985 logische Verschiebung bedeuten (entnommen von Pascal, das von 1970 stammt). Also musste es >>>für die arithmetische Verschiebung verwendet werden.

Gemäß IEEE1800-2012 >>handelt es sich um eine binäre logische Verschiebung, während >>>es sich um eine binäre arithmetische Verschiebung handelt.

Grundsätzlich verwendet die arithmetische Verschiebung den Kontext, um die Füllbits zu bestimmen, also:

  • arithmetische Rechtsverschiebung ( >>>) - Verschiebe die angegebene Anzahl von Bits nach rechts, fülle mit dem Wert des Vorzeichenbits, wenn der Ausdruck mit Vorzeichen versehen ist , andernfalls fülle mit Null,
  • arithmetische Verschiebung nach links ( <<<) - Verschieben Sie die angegebene Anzahl von Bits nach links, füllen Sie sie mit Null auf.

Andererseits füllt die logische Verschiebung ( <<, >>) die frei gewordenen Bitpositionen immer mit Nullen.

Zum Beispiel:

a = 5'b10100;
b = a <<< 2; //b == 5'b10000
c = a >>> 2; //c == 5'b11101, 'cause sign bit was `1`
d = a <<  2; //d == 5'b10000
e = a >>  2; //e == 5'b00101
Die Ergebnisse dieses Beispiels hängen von der Deklaration von ab c: Wenn Sie verwenden reg [4:0] c, erhalten Sie 5'b00101, nicht 5'b11101. Eine Aktualisierung des Beispiels zur Verdeutlichung der Typen wäre meiner Meinung nach nützlich.