Câu trả lời:
Nó không giống với ==
/ ===
, nếu toán hạng bên trái được ký thì >>>
thực hiện mở rộng dấu.
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
Kết quả:
#a_signed 1111010101
#a_unsigned 0011010101
Ví dụ về Sân chơi EDA .
integer
) và các toán tử dịch chuyển số học chỉ được giới thiệu cho Verilog trong Verilog-2001.
>>
nghĩa là thay đổi logic vào năm 1985 (lấy từ Pascal, từ năm 1970). Vì vậy, nó đã phải sử dụng >>>
để thay đổi số học.
Theo IEEE1800-2012 >>
là một sự thay đổi logic nhị phân, trong khi đó >>>
là một sự thay đổi số học nhị phân.
Về cơ bản, sự thay đổi số học sử dụng bối cảnh để xác định các bit điền, vì vậy:
>>>
) - dịch chuyển số bit được chỉ định bên phải, điền vào giá trị của bit dấu nếu biểu thức được ký , nếu không thì điền bằng 0,<<<
) - dịch chuyển số bit được chỉ định bên trái, điền vào số không.Mặt khác, sự thay đổi logic ( <<
, >>
) luôn lấp đầy các vị trí bit bị bỏ trống bằng các số 0.
Ví dụ:
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
: nếu bạn sử dụng reg [4:0] c
, bạn sẽ nhận được 5'b00101
, không 5'b11101
. Cập nhật ví dụ để làm rõ các loại sẽ hữu ích, tôi nghĩ vậy.
>>
và các>>>
toán tử ... xấu xa.