![](/img/trans.png)
[英]Verilog error: Register is illegal in left-hand side of continuous assignment
[英]The left-hand-side of continuous assignment is illegal
我的輸入由參數化的單位數組成。 我需要的輸出是刪除每個單元的第一位。 例如,如果輸入每個具有3位大小的單位,並且輸入值為011011
,則輸出應為1111
這是我為此使用的解決方案:
parameter data_in_size = 11;
parameter data_out_size = 10;
parameter units = 4;
parameter skip_bits = 1;
input [data_in_size * units - 1 : 0] data_in;
output [data_in_size * units - 1 : 0] data_out;
genvar i;
generate
for (i = 0; i < units; i = i + 1) begin
assign data_out[data_out_size * i +: data_out_size] = data_in [(data_in_size * i + skip_bits) +: data_out_size];
end
endgenerate
但我收到以下錯誤The left-hand-side of continuous assignment is illegal
我如何解決此錯誤,為什么會得到它?
您的代碼運行良好。 可能是模擬器 問題 。
但是我想重點關注代碼中的邏輯實現 。 邏輯似乎是錯誤的。
第一個錯誤似乎是在data_out
聲明和切片邏輯中 : data_in [(data_in_size * i + skip_bits) +: data_out_size]
必須替換為: data_in [(data_in_size * i + skip_bits) +: data_in_size]
假設i=0; data_out_size=3; data_in_size=4
i=0; data_out_size=3; data_in_size=4
i=0; data_out_size=3; data_in_size=4
則LHS評估為data_out[2:0] = data_in[4:1]
。 當i=1
, data_out[5:3] = data_in[8:5]
。 如您所見,位切片似乎是不正確的 。 由於LSB被切片。
我認為您可能需要具有以下邏輯來進行位切片 :
assign data_out[data_out_size * i +: data_out_size] = data_in[(data_in_size * i) +: (data_in_size - skip_bits)];
這將對每個單位塊的MSB位進行切片,其余位保持原樣。
我在此處的EdaPlayground模擬了您的代碼。 例如,您將具有以下data_out和data_in值。 請注意每個單元的切片MSB。
data_int = 1100101010010101
data_out = 100010001101
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.