我正在尝试合成加权求和电路,它基本上实现了以下等式,
out = out + a [i] * w [i],其中i = 0,1..n
我编写了以下代码,但在设计视觉环境中进行综合会产生如下错误
ELAB-368(错误)%s驱动净'%s'或直接连接的网络 由多个来源,至少一个来源是一个恒定的网络。
module weighted_sum #(parameter n=10)(input [7:0] a[3:0], input [7:0] w[3:0], output [7:0] out);
assign out=0;
genvar i;
generate
for (i=0;i<n;i=i+1) begin:block1
out=out+a[i]*b[i];
end
endgenerate
endmodule
任何方向都表示赞赏。
由于 Farhana
答案 0 :(得分:3)
您无法使用生成循环。 generate用于复制硬件。你想要逻辑,它应该使用always
块:
always_comb begin // SystemVerilog use "always_comb", Verilog use "always @*"
out = 0;
for (int i=0;i<n;i=i+1) begin
out += a[i]*b[i];
end
end
仅供参考,Verilog不支持端口列表(ex input [7:0] a[3:0]
)上的多维数组。 Verilog仅支持矢量类型端口(也称为单维打包数组)。 SystemVerilog确实支持端口上的多维数组,但有些工具可能对支持有限制,因此请参阅手册和实验。
此外,您的模块标头不会缩放。 a
&amp; b
将始终是4个8位条目,out
可能会溢出。我建议使用以下模块标题:
module weighted_sum #(parameter N=10)(
input [7:0] a[N], input [7:0] w[N], // scaling input depth
output logic [14+N:0] out); // scaling for overflow protection
答案 1 :(得分:1)
除了Greg的答案之外,该工具还对信号out
的两个不同任务进行了调整。
第一
assign out=0;
第二
out=out+a[i]*b[i];