verilog - 数组乘法与输入的综合误差
问题描述
您好,我正在尝试项目代码的一小部分,其中等式将输入与数组的所有值相乘,然后将它们相加到一个最终输出中。
module arraywithinput(input in,
output reg [11:0] out0
);
reg [7:0] xin[3:0];
initial
begin
xin[0]=7;
xin[1]=6;
xin[2]=5;
xin[3]=2;
end
integer i;
always@(*)
begin
for (i=0; i<4; i=i+1)
out0<=out0+(in*xin[i]);
end
endmodule
我在始终阻止敏感度列表中收到 Unexpected xin 事件的合成错误。为了实现这种情况,我可能做错了什么。
解决方案
初始块不是可综合的结构,仅用于测试台。此外,不建议将 NBA 放在 always@* 块中。Mult/Div 是计算密集型和使用大量资源的,最好使用一些算法,如重复加法、booth 等来实现乘法。
我已经修改了你的代码。我使用了时钟信号。
module arraywithinput(input in,
input clk,
output [11:0] out0
);
reg [7:0]xin[3:0];
reg [11:0] out0_r[3:0];
always@(*)
begin
xin[0]=7;
xin[1]=6;
xin[2]=5;
xin[3]=2;
end
integer i;
always@(posedge clk)
begin
out0_r[0] <= (in*xin[0]);
for (i=1; i<4; i=i+1)
out0_r[i] <= out0_r[i-1] + (in*xin[i]);
end
assign out0 = out0_w[3]; //Please note that output will be stable after 4 cycles.
endmodule