【发布时间】:2018-07-05 23:12:55
【问题描述】:
我是 Verilog 的新手(在较小程度上是编程),我正在尝试创建一个程序来找到一组数字的绝对值,然后计算运行平均值。运行平均值为 5 个点宽,并且跨越一个大约 40 个数字宽的数据集。
我遇到了运行平均值问题(第 14-17 行设计,24-28 测试台)并且收到错误“o2/out is not a valid l-value in tb.avg”。并且“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
我敢打赌,我的程序中也存在其他错误,因此非常感谢任何帮助。
【问题讨论】:
-
如前所述,
wire类型不是l-value。这意味着您不能分配给它。您尝试分配给它。 -
但即使是注册,仍然存在“o2/out 不是有效的左值”和“o2/out 在此处声明为电线”的错误。
-
您不应在
always块内使用assign。assign已经意味着对正确表达式的持续评估。测试台中的分配也可能有问题。 -
感谢@HansLehnert,但这仍然不能解决我的问题。我将 o2 和 out 更改为
wire并删除了assign语句,但仍然收到“无效的左值”和“此处声明为电汇”错误。我的代码的其他哪些部分可能会产生这些错误? -
这也是错误的,你不能在
always块中分配wire,因为电线没有状态。选项是:(1)将分配移到always块之外(2)将您的输出声明为reg并在always块内使用简单的阻塞分配(即out = o2;)
标签: verilog