算术右移

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位数最好一样。

posted @ 2020-03-11 10:25  friedCoder  阅读(1807)  评论(0编辑  收藏  举报