加权平均电路的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];
我正在尝试合成一个加权求和电路,它基本上会实现以下等式,
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];