Floating point Verilog代码错误:范围必须由常量表达式限定

Floating point Verilog代码错误:范围必须由常量表达式限定,floating-point,verilog,multiplication,Floating Point,Verilog,Multiplication,我已经为52位乘法器编写了一个代码,我需要以标准形式给出它(IEEE 754浮点标准用于64位数字)。然后我检查,它从64位超过了多少位,这样我就可以把这个数字转换成指数 module mul1(output reg [103:0] p, output reg [51:0] c, input [51:0] x, input [51:0] y); reg [103:0]a; integer i; always @(x , y)

我已经为52位乘法器编写了一个代码,我需要以标准形式给出它(IEEE 754浮点标准用于64位数字)。然后我检查,它从64位超过了多少位,这样我就可以把这个数字转换成指数

module mul1(output reg [103:0] p, 
        output reg [51:0]  c, 
        input [51:0]   x,
        input [51:0]   y); 


reg [103:0]a;
integer i; 

always @(x , y)
begin 
  a=x;
  p=0; // needs to zeroed
  for(i=0;i<104;i=i+1)
  begin
    if(y[i])
      p=p+a; // must be a blocking assignment
    a=a<<1;
  end

  for(i=103;i>=0;i=i-1)
  begin
    if (p[i])
        c=p[i:i-51];
        break;
    end

  end
endmodule
模块mul1(输出寄存器[103:0]p,
输出调节器[51:0]c,
输入[51:0]x,
输入[51:0]y);
reg[103:0]a;
整数i;
始终@(x,y)
开始
a=x;
p=0;//需要归零

对于(i=0;i你不能有一个可变部分/切片选择(可变宽度)。从变量c的角度考虑赋值。c是52位宽,所以你需要给它分配52位p。循环只需要选择哪52位。这就是可变部分选择操作符的作用。这里有一个很好的解释:

它看起来像:

c=p[i+:52]
也就是说,从p开始从(低位)i向上选择i+52-1并分配给c

module mul1(output reg [103:0] p,
        output reg [51:0]  c,
        input [51:0]   x,
        input [51:0]   y);


reg [103:0]a;
integer i;

always @(x , y) begin
  a=x;
  p=0; // needs to zeroed
  for(i=0;i<104;i=i+1) begin
    if(y[i]) begin
      p=p+a; // must be a blocking assignment
    end
    a=a<<1;
  end

  for(i=103;i>=0;i=i-1) begin
    if (p[i]) begin
      c=p[i+:52];
      break;
    end
  end
end
endmodule
模块mul1(输出寄存器[103:0]p,
输出调节器[51:0]c,
输入[51:0]x,
输入[51:0]y);
reg[103:0]a;
整数i;
始终@(x,y)开始
a=x;
p=0;//需要归零

对于(i=0;i你不能有一个可变部分/切片选择(可变宽度)。从变量c的角度考虑赋值。c是52位宽,所以你需要给它分配52位p。循环只需要选择哪52位。这就是可变部分选择操作符的作用。这里有一个很好的解释:

它看起来像:

c=p[i+:52]
也就是说,从p开始从(低位)i向上选择i+52-1并分配给c

module mul1(output reg [103:0] p,
        output reg [51:0]  c,
        input [51:0]   x,
        input [51:0]   y);


reg [103:0]a;
integer i;

always @(x , y) begin
  a=x;
  p=0; // needs to zeroed
  for(i=0;i<104;i=i+1) begin
    if(y[i]) begin
      p=p+a; // must be a blocking assignment
    end
    a=a<<1;
  end

  for(i=103;i>=0;i=i-1) begin
    if (p[i]) begin
      c=p[i+:52];
      break;
    end
  end
end
endmodule
模块mul1(输出寄存器[103:0]p,
输出调节器[51:0]c,
输入[51:0]x,
输入[51:0]y);
reg[103:0]a;
整数i;
始终@(x,y)开始
a=x;
p=0;//需要归零
对于(i=0;i的可能副本