加权平均电路的Verilog代码

Verilog code for wighted average circuit

我正在尝试合成一个加权求和电路,它基本上会实现以下等式,

out=out+a[i]*w[i] ,其中 i=0,1..n

我写了下面的代码,但是在design vision环境中综合产生如下错误

ELAB-368 (error) %s Net '%s', or a directly connected net, is driven by more than one source, and at least one source is a constant net.

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

不胜感激。

谢谢 法哈娜

您不能为此使用生成循环。 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 不支持 port-list 上的 multi-dimensional 数组(例如 input [7:0] a[3:0])。 Verilog 仅支持矢量类型端口(又名单维打包数组)。 SystemVerilog 确实支持端口上的 multi-dimensional 数组,但某些工具可能对支持有限制,因此请参阅您的手册和实验。

此外,您的模块 header 无法缩放。 a & b 将始终是 4 个 8 位条目,并且 out 可能会溢出。我建议使用以下模块 header:

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

除了 Greg 的回答之外,该工具还对信号 out 的两个不同分配进行了吐槽。 第一的 assign out=0; 第二 out=out+a[i]*b[i];