[英]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
類型。 過程分配語句將值分配給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_comb
always @(*)
(或SystemVerilog中的always_comb
)用於組合邏輯中的自動靈敏度列表 。
附帶說明一下,作為模塊的時鍾輸入 ,您可能會感到有點clk
,並使always
模塊在時鍾的邊緣工作。 這將有助於對順序邏輯進行建模。 (注意,在順序邏輯的情況下,非阻塞分配的使用<=
)。
另外,您需要更正以下代碼:-
coeff[i] = 0;
這是位分配,應明確指定為編碼實踐。
coeff[i] = 'h0;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.