https://blog.csdn.net/qq_41634276/article/details/80414488
一般認為“>>>”在Verilog里是算術右移指令,但實操中發現它有時會在右移時仍然補零,即使符號位為1。
這是因為“>>>”會先判斷這個操作數是否有符號數。如果是無符號數,則補零,是有符號數,才會補符號位。
而一般使用的reg operand; 這種變量定義法默認所定義的變量為無符號數,因此只補零。
Result = operandB >>> operandA; //錯誤示范, 無符號數算術右移也是補0
解決辦法是利用Verilog的內置函數$signed(),將被移位的操作數轉為有符號數類型。
Result = ($signed(operandB)) >>> operandA; //更正后
總結
1、如果對無符號數據進行移位,算數右移>>>和邏輯右移>>右移效果是等同的,就是把二進制數據向右移位,最高位補零;
2、如果想對有符號數據算術右移時,就直接使用>>>操作符。
3、對於操作a = b << c; 或 a = b <<< c; 如果a的位數大於b,會先對b進行有符號擴展,為了不搞混,建議a,b位數最好一樣。