阻止分配的非法左手边

时间:2016-05-11 10:23:52

标签: 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

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

2 个答案:

答案 0 :(得分:6)

参考错误:

  

错误 - [IBLHS-NONREG]非法行为左手边   a.sv,42
  非注册类型在此作业的左侧无效   违规表达式为:word_out [15:0]
  来源信息:word_out [15:0] = word [15:0];

任何程序转让声明 LHS 必须为reg类型。过程赋值语句将值分配给regintegerrealtime变量,并且无法将值分配给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;