我已经为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]; 我怎么解决这个问题?
答案 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块。上面的代码为我编译。