【问题标题】:Verilog code for wighted average circuit加权平均电路的 Verilog 代码
【发布时间】:2016-05-04 02:59:01
【问题描述】:

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

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

感谢任何方向。

谢谢 法哈纳

【问题讨论】:

  • 什么是bout 分配给 0 并且您也在生成块中驾驶 out。我假设assignassign out=out+a[i]*b[i]; 中有一个错字
  • 抱歉打错了。它不在主代码中。

标签: verilog system-verilog weighted-average


【解决方案1】:

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

此外,您的模块标头无法缩放。 a & 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

【讨论】:

  • 非常感谢。这个建议奏效了。我正在研究 SystemVerilog 环境,我的编译器可以处理多维输入数组。这是一种解脱,否则需要一些额外的编码。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-21
    • 2017-08-06
    • 2017-06-19
    • 2011-12-14
    • 2015-06-02
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多