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.