我是verilog的新手。我正在编写10x16 Round-Shift寄存器的代码。你能帮我解决这个错误吗?如果可以做任何优化呢?
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];
答案 0 :(得分:6)
参考错误:
错误 - [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 @(*)
(或SystemVerilog中的always_comb
)自动敏感列表。
作为旁注,您可能会为模块提供clk
时钟输入,并使always
块在时钟边缘。这将有助于建模顺序逻辑。 (注意在顺序逻辑的情况下使用非阻塞分配<=
。
请参阅this PDF了解reg和nets之间的区别。此外,此always block可能有用。
答案 1 :(得分:0)
此外,您需要更正以下代码: -
coeff[i] = 0;
这是一个位分配,应该明确指出作为编码实践。
coeff[i] = 'h0;