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


8

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

Answers:


13

它与==/ 不相似===,如果左侧操作数是带符号的,则>>>执行符号扩展。

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游乐场的例子。


2
哇,这与Java >>>>>运算符的含义恰恰相反……邪恶。
Colin D Bennett

2
Verilog比Java早了10年。:P
dave_59 2014年

1
@ dave_59,但是带符号的值(除了32位integer类型)和算术移位运算符仅在Verilog-2001中引入了Verilog。
Photon

1
Verilog >>在1985年就已经意味着逻辑上的转变(取自1970年的Pascal)。因此,它必须>>>用于算术移位。
dave_59 '19

8

根据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

该示例的结果取决于以下声明c:如果使用reg [4:0] c,将得到5'b00101而不是5'b11101。我认为,更新示例以阐明类型将很有用。
克莱门特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.