将定点二进制数与整数进行比较

compare fixed point binary number with an integer

我计算一个 16.16 定点二进制数,然后将结果与一个整数进行比较。 16.16 数平方后变成 64 位二进制数。 我不确切知道我的代码是否正确以及 16.16 定点数的每个正方形是否在范围内。 我也无法设置正确的语句来表示 32.32 定点结果。

伪代码

  reg [31:0] n;      //the 32 Bit number we want to square
  reg [63:0] res;    //out result register after squaring n
  integer i;         

  ...
  res = n * n;      // squaring n
  i   = 1;
   /* compare with some integer - bigger than i */
  if( res[63:32] >= i && res[31:0] > 0)
     begin ...do something ... end

   /* compare with some integer - less/equal than i */
 if( (res[63:32] < i && res[31:0] >= 0) || (res[63:32] <= i && res[31:0] == 0))
     begin ...do something... end
 ...

在测试台中,我试图将结果表示为 32.32 定点二进制数 - 但这种表示在显示时不会给我正确的浮点值:

    res[63:32] + $bitstoreal({1'b0,15'b011111111111111,{fer3[31:0],{81{1'b0}} }) -1;

有一个 讨论定点宽度,...将 32 位乘以 32 位,答案将适合 64 位。 16.16 x 16.16 的正确答案是 32.32.

verilog 到实数的转换可以自动进行,如果正确完成,缩放数字以显示 n * 2**-16 不起作用。 n * 2.0**-16 因为我们使用 2.0 计算是使用浮点而不是整数完成的。

注意:2**n 是 2 的 n 次方。 2^n 在某些语言中,但 ^ 在 verilog 中是 XOR。

使用真实进行比较缩放的快速示例:

reg [31:0] n;    //16.16
reg [63:0] n_sq; //32.32
real n_sq_real;  // Floating Point

always @* begin
  n_sq = n * n;
end

initial begin
  #1ps;
  n = { 16'd2, 16'b1000_0000_0000_0000}; //2.5
  #1ns;

  $display("n %f, n squared %f", (n * 2.0**-16), n_sq * 2.0**-32);

  n_sq_real = n_sq * 2.0**-32 ;

  $display("n_sq_real %f", n_sq_real);
end

Returns:

# n 2.500000, n squared 6.250000
# n_sq_real 6.250000

example on EDA Playground.

如果只是为了与整数进行比较,您可以通过移出小数位来截断数字,即 n_sq * 2.0**-32 变为 n_sq >> 32

或者您可以按小数位数缩放整数。

n_sq >= i<<32 ;

归根结底,verilog 中的定点数只是按 2 的幂缩放的整数,因此一些位可以表示小数信息。