Qual é a diferença entre >>
e >>>
no verilog / system verilog? Eu sei que ==
testa apenas 1 e 0, enquanto ===
testa 1, 0, X, Z. Então, como isso é semelhante ao operador de turno?
8
Qual é a diferença entre >>
e >>>
no verilog / system verilog? Eu sei que ==
testa apenas 1 e 0, enquanto ===
testa 1, 0, X, Z. Então, como isso é semelhante ao operador de turno?
Não é semelhante a ==
/ ===
, se o operando esquerdo estiver assinado, ele >>>
executará a extensão do sinal.
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
Resultado:
#a_signed 1111010101
#a_unsigned 0011010101
Exemplo no EDA Playground .
>>
e dos>>>
operadores ... perversos.integer
tipo de 32 bits ) e os operadores de deslocamento aritmético foram introduzidos apenas no Verilog no Verilog-2001.>>
que significar mudança lógica em 1985 (tirada de Pascal, que é de 1970). Portanto, tinha que usar>>>
para a mudança aritmética.De acordo com IEEE1800-2012,
>>
é uma mudança lógica binária, enquanto>>>
é uma mudança aritmética binária.Basicamente, o deslocamento aritmético usa o contexto para determinar os bits de preenchimento, portanto:
>>>
) - shift direita número especificado de bits, preencha com o valor do sinal de bit se a expressão for assinada , caso contrário, preencha com zero,<<<
) - shift esquerda número especificado de bits, preencha com zero.Por outro lado, o deslocamento lógico (
<<
,>>
) sempre preenche as posições de bits desocupadas com zeros.Por exemplo:
fonte
c
: se você usarreg [4:0] c
, receberá5'b00101
, não5'b11101
. Atualizar o exemplo para esclarecer os tipos seria útil, eu acho.