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?
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 .
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:
>>>
) - 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,<<<
) - 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
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.
Colin D. Bennett
>>
und>>>
Operatoren ... böse.dave_59
Das Photon
integer
Typ) und die arithmetischen Verschiebungsoperatoren wurden erst in Verilog-2001 in Verilog eingeführt.dave_59
>>
1985 logische Verschiebung bedeuten (entnommen von Pascal, das von 1970 stammt). Also musste es>>>
für die arithmetische Verschiebung verwendet werden.