Verilog代码错误:范围必须以常量表达式

时间:2017-05-04 00:18:24

标签: floating-point verilog multiplying

我已经为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

它给出了一个错误:范围必须由该行的常量表达式限制:c = p [i:i-51]; 我怎么解决这个问题?

1 个答案:

答案 0 :(得分:0)

您不能选择可变的零件/切片(可变宽度)。从变量c的角度考虑赋值。 c是52位宽,因此需要为其分配52位p。循环只需要选择52位。这就是变量部分选择运算符的用途。这里有一个很好的解释: Indexing vectors and arrays with +:

看起来像:

c=p[i+:52]

这意味着,从p开始选择(较低位)我上升到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

此外,您需要在第二个循环中的'if'之后使用'begin',并在'end'之后关闭always块。上面的代码为我编译。