在verilog中>>和>>>之间的区别?

电器工程 验证日志 系统verilog 数据操作员
2022-01-16 18:24:21

verilog/system verilog>>和in有什么区别?>>>我知道==只测试 1 和 0,而===测试 1、0、X、Z。那么这与移位运算符有何相似之处?

2个回答

它与==/不同===,如果左侧操作数有符号则>>>执行符号扩展。

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

结果:

#a_signed   1111010101
#a_unsigned 0011010101

EDA Playground上的示例

根据 IEEE1800-2012>>是二进制逻辑移位,>>>而是二进制算术移位。

基本上,算术移位使用上下文来确定填充位,因此:

  • 算术右移 ( >>>) - 右移指定位数,如果表达式有符号,则填充符号位的值,否则填充零,
  • 算术左移 ( <<<) - 左移指定位数,用零填充。

另一方面,逻辑移位 ( <<, >>) 总是用零填充空出的位位置。

例如:

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