一般认为“>>>”在Verilog里是算术右移指令,但实操中发现它有时会在右移时仍然补零,即使符号位为1。这是因为“>>>”会先判断这个操作数是否有符号数。如果是无符号数,则补零,是有符号数,才会补符号位。而一般使用的reg operand; 这种变量定义法默认所定义的变量为无符号数,因此只补零。
Result = operandB >>> operandA; //错误示范
解决办法是利用Verilog的内置函数$signed(),将被移位的操作数转为有符号数类型。
Result = ($signed(operandB)) >>> operandA; //更正后
这个办法至少对我的alu有效。
以上。