Unterschied zwischen >> und >>> in Verilog?

8

Was ist der Unterschied zwischen >>und >>>in Verilog / System Verilog? Ich weiß, dass ==nur für 1 und 0 ===getestet wird , während für 1, 0, X, Z getestet wird. Wie ähnelt das dem Schichtführer?

daut
quelle

Antworten:

13

Es ist nicht ähnlich zu ==/ ===, wenn der linke Operand signiert ist, >>>führt er 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 dem EDA-Spielplatz .

pre_randomize
quelle
2
Wow, das ist genau das Gegenteil der Bedeutung von Java >>und >>>Operatoren ... böse.
Colin D Bennett
2
Verilog war 10 Jahre vor Java. : P
dave_59
1
@ dave_59, aber vorzeichenbehaftete Werte (abgesehen vom 32-Bit- integerTyp) und die arithmetischen Verschiebungsoperatoren wurden erst in Verilog-2001 in Verilog eingeführt.
Das Photon
1
Verilog musste bereits >>1985 eine logische Verschiebung bedeuten (entnommen aus Pascal, das aus dem Jahr 1970 stammt). Also musste es >>>für die arithmetische Verschiebung verwendet werden.
Dave_59
8

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 ( >>>) - Verschiebung der angegebenen Anzahl von Bits nach rechts, mit dem Wert des Vorzeichenbits füllen, wenn der Ausdruck vorzeichenbehaftet ist , andernfalls mit Null füllen,
  • arithmetische Linksverschiebung ( <<<) - Verschiebt die angegebene Anzahl von Bits nach links und füllt sie mit Null.

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
Qiu
quelle
Die Ergebnisse dieses Beispiels hängen von der Deklaration ab c: Wenn Sie verwenden reg [4:0] c, erhalten Sie 5'b00101nicht 5'b11101. Ich denke, es wäre nützlich, das Beispiel zu aktualisieren, um die Typen zu verdeutlichen.
Clément