Verilog中的移位运算符
“>>”
不区分无符号和有符号移位,即对有符号和无符号数进行">>"操作结果一致。
- 对有符号数使用">>“进行右移,高位补"0”;
- 对无符号数使用">>“进行右移,高位补"0”;
“>>>”
区分无符号和有符号移位,即对有符号和无符号数进行">>>"操作结果不一样。
- 对有符号数使用">>>"进行右移,高位补符号位;
- 对无符号数使用">>>“进行右移,高位补"0”;
测试代码
module tb ();reg signed [7:0] a;reg [7:0] b;reg [7:0] c_signed; //有符号移位reg [7:0] d_unsigned; //无符号移位initial begina = 8'b1111_0000;b = 8'b1111_0000;c_signed = 'd0;d_unsigned = 'd0;#10 c_signed = a <<< 1'b1;d_unsigned = b <<< 1'b1;#10 c_signed = a >>> 1'b1;d_unsigned = b >>> 1'b1;#10 c_signed = a << 1'b1;d_unsigned = b << 1'b1;#10 c_signed = a >> 1'b1;d_unsigned = b >> 1'b1;// 拼接符得到的数为无符号数,>>>和>>结果一致#10 c_signed = {4'b1111,4'b0000} >>> 1;d_unsigned = {4'b1111,4'b0000} >> 1;// 需要保存给有符号变量a,再进行移位操作#10 a = {4'b1111,4'b0000};c_signed = a >>> 1;d_unsigned = a >> 1;#10 $finish;endendmodule
仿真波形如下
综上所述,需要注意的是">>>“和”>>“,两者区分有符号和无符号变量,对于有符号数,”>>>“保留符号位右移,”>>“不保留符号位右移。
此外,用拼接符得到的数如{4’b1111,4’b0000}为无符号数,”>>>“和”>>“效果一致,如果需要保留符号位需要将{4’b1111,4’b0000}复制给一个有符号数,再进行”>>>"移位。