[英]Illegal left hand side of blocking assignment
我是Verilog的新手。 我正在为10x16舍入移位寄存器编写代码。 您可以协助我解决错误,以及是否可以进行任何优化吗?
module shift_reg_v(
output [15:0] word_out
);
integer i;
integer j;
reg [159:0] coeff;
reg [15:0] word;
initial
begin
for (i=0;i<160;i=i+1)
begin
coeff[i] = 0;
end
for (i=0;i<16;i=i+1)
begin
word[i] = 0;
end
end
always
begin
for (j=0;j < 10;j = j+1)
begin
for (i=0;i < 16;i = i+1)
begin
if (j==0)
begin
word[i] = coeff[(16*(j+1))+i];
end
else
begin
coeff[(16*j)+i] = coeff[(16*(j+1))+i];
end
end
end
coeff[159:144] = word[15:0];
word_out[15:0] = word[15:0];
end
endmodule
程序在输出行显示2个错误: word_out[15:0] = word[15:0];
指错误:
错误 -[IBLHS-NONREG]非法行为左侧a.sv,42
非注册类型在此分配的左侧无效
令人讨厌的表达式是:word_out [15:0]
源信息:word_out [15:0] = word [15:0];
任何程序分配声明的LHS必须为reg
类型。 过程分配语句将值分配给reg
, integer
, real
或time
变量,而不能将值分配给wire
。 请注意, reg
可以根据某些触发事件来保存或存储某些值,而wire
无法存储任何值。
使word_out
作为reg
如下:
module shift_reg_v(
output reg [15:0] word_out
);
参考警告:
警告 -[PALF]电位始终循环发现a.sv,24
该块始终没有事件控制或延迟语句 ,它可能会导致模拟中的无限循环 。
此外,您对于always
执行块还没有任何敏感性。 这可能会导致无限循环。 没有 always
阻止的触发控制 。 此后,该块将无限执行。
将always_comb
always @(*)
(或SystemVerilog中的always_comb
)用于组合逻辑中的自动灵敏度列表 。
附带说明一下,作为模块的时钟输入 ,您可能会感到有点clk
,并使always
模块在时钟的边缘工作。 这将有助于对顺序逻辑进行建模。 (注意,在顺序逻辑的情况下,非阻塞分配的使用<=
)。
另外,您需要更正以下代码:-
coeff[i] = 0;
这是位分配,应明确指定为编码实践。
coeff[i] = 'h0;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.