繁体   English   中英

封锁作业的左侧无效

[英]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类型。 过程分配语句将值分配给regintegerrealtime变量,而不能将值分配给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模块在时钟边缘工作。 这将有助于对顺序逻辑进行建模。 (注意,在顺序逻辑的情况下,非阻塞分配的使用<= )。

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

另外,您需要更正以下代码:-

coeff[i] = 0;

这是位分配,应明确指定为编码实践。

coeff[i] = 'h0;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM