我有一个9位带符号的线,名为sin_hall2。

该语句返回true。 sin_hall2 [8:0]> 9'd1。

当我查看仿真时,sin_hall2 = -169。我假设这是verilog处理负数比较的方式,但是我在做什么错。当我执行sin_hall2 [8:0]> 9'sh001时,我会收到相同的结果。

最佳答案

带符号的数字使用二进制补码格式。也就是说,如果将其解释为无符号数字,它们将显示为大数字,即无符号数字范围的下半部分。

如果比较的任何部分是未签名的,则比较是未签名的。 选择位宽度,即使整个范围都是未签名的

reg signed [8:0] sin_hall2;

initial begin
  sin_hall2 = -9'd169 ;
  $display( "Comparison unsigned : %b ", sin_hall2 > 9'd1 );
  $display( "Comparison cast     : %b ", sin_hall2 > $signed(9'd1) );
  $display( "Comparison signed   : %b ", sin_hall2 > 9'sd1 );
  $display( "Comparison signed [8:0]: %b ", sin_hall2[8:0] > 9'sd1 );
end

返回值:
# Comparison unsigned : 1
# Comparison cast     : 0
# Comparison signed   : 0
# Comparison signed [8:0]: 1

Example on EDA Playground

10-01 21:28