阻止分配的非法左手边

Ash*_*ain 0 verilog

我是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
Run Code Online (Sandbox Code Playgroud)

该程序在输出行显示2个错误: word_out[15:0] = word[15:0];

sha*_*111 6

参考错误:

错误 - [IBLHS-NONREG]非法行为左侧a.sv,42
非reg类型在此分配的左侧无效
违规表达式为:word_out [15:0]
源信息:word_out [15:0 ] =字[15:0];

任何程序转让声明LHS必须是类型.程序赋值语句赋值,,,或变量,不能赋值.请注意,根据某些触发事件,可以保存或存储某些值,而不能存储任何值.regregintegerrealtimewireregwire

word_outreg如下:

module shift_reg_v(
    output reg [15:0] word_out
);
Run Code Online (Sandbox Code Playgroud)

参考警告:

警告 - [PALF]潜在的循环总是找到a.sv,24
这个始终块没有事件控制或延迟语句,它可能会导致模拟中的无限循环.

此外,您还没有always块执行给出任何敏感性.这可能会导致无限循环.有没有触发控制always块.此后,该块将无限执行.

在组合逻辑中使用always @(*)(或always_comb在SystemVerilog中)自动灵敏度列表.

作为旁注,您可能有一个clk,作为模块的时钟输入,并使always块工作在时钟边缘.这将有助于建模顺序逻辑.(注意在<=顺序逻辑的情况下使用非阻塞分配).

请参阅此PDF以了解reg和nets之间的区别.此外,这个始终阻止可能很有用.