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]; 我该如何解决这个问题?
答
您不能有可变部件/切片选择(可变宽度)。从变量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'。上面的代码为我编译。
可能的[Verilog:“...不是一个常量”]的重复(http://stackoverflow.com/questions/29815974/verilog-is-not-a-constant) – Qiu