我是Verilog的新手(在较小程度上是编程),并且正在尝试创建一个程序,该程序查找一组数字的绝对值,然后计算移动平均值。流动平均值为5点宽,并且遍历大约40个数字宽的数据集。
我在运行平均值(第14-17行设计,第24-28行测试台)时遇到麻烦,并收到错误“ o2 / out在tb.avg中不是有效的L值”。和“ o2 / out在此处声明为导线”。我该如何解决?
这是我的设计:
module absolute_value(i1,o1);
input signed [11:0] i1;
output signed [11:0] o1;
assign o1 = i1[11] ? -i1 : i1;
endmodule
module moving_average(k1,k2,k3,k3,k4,o2,out);
input k1, k2, k3, k4, k5;
output [11:0] o2;
output [11:0] out;
integer t;
always begin
assign o2 = (k1 + k2 + k3 + k4 + k5) / 5;
assign out = o2;
end
endmodule
这是我的测试台:
module tb;
reg signed [11:0] i1;
wire signed [11:0] o1;
reg k1;
reg k2;
reg k3;
reg k4;
reg k5;
wire [11:0] o2;
wire [11:0] out;
absolute_value abs(i1,o1);
moving_average avg(k1,k2,k3,k4,k5,o2,out);
integer t;
initial begin
for (t = -10; t < 30; t = t + 1) begin
#1
i1 <= t;
$display("i1 = %d, o1 = %d", i1, o1);
assign k5 = k4 ? k4 : o1;
assign k4 = k3 ? k3 : o1;
assign k3 = k2 ? k2 : o1;
assign k2 = k1 ? k1 : o1;
assign k1 = o1;
$display("out = %d", out);
$moniter($time, "i1 = %d, o1 = %d, o2 = %d, out = %d k1 = %d, k2 = %d, k3 = %d, k4 = %d, k5 = %d", i1, o1, o2, out, k1, k2, k3, k4, k5);
end
end
endmodule
我敢打赌,我的程序中也存在其他错误,因此我们将不胜感激。
答案 0 :(得分:1)
如评论中所述:
删除所有内容并保留output [11:0] out
或
更改为:
reg [11:0] o2;
reg [11:0] out;
always @( * )
begin
o2 = (k1 + k2 + k3 + k4 + k5) / 5;
out = o2;
end
第二个错误: 您的端口使用k1,k2, k3,k3 ,k4,并且缺少k5。
第三:请不要使用上世纪的港口风格。我建议您切换到新格式:
module moving_average(
input k1, k2, k3, k4, k5,
output signed [11:0] o2,out
);
或者在第二种情况下:output signed reg [11:0] o2,out
第四:它是$ monitor,而不是$ moniter