簡體   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