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

问题描述:

我已经编写了一个52位乘法器的代码,我需要以标准格式(IEEE 754 64位数的浮点标准)给出代码。所以之后我检查了,它有多少位已经超过了64位,所以我会把这个数字放到指数中。Verilog代码错误:范围必须以常量表达式为界

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]; 我该如何解决这个问题?

+0

可能的[Verilog:“...不是一个常量”]的重复(http://*.com/questions/29815974/verilog-is-not-a-constant) – Qiu

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

它看起来像:

c=p[i+:52] 

这意味着从P开始(低位)我马上要到我+ 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'和关闭always块的'end'。上面的代码为我编译。