用于加权平均电路的Verilog代码

时间:2016-05-04 02:59:01

标签: verilog system-verilog weighted-average

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

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

2 个答案:

答案 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];