连续分配的左侧是非法的

时间:2016-01-06 19:05:30

标签: verilog

我的输入包含参数化的单位数。我需要的输出是删除每个单元的第一位。 例如,如果输入的单位大小为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

我如何解决这个错误以及为什么我会得到它?

1 个答案:

答案 0 :(得分:2)

您的代码运行良好。可能是模拟器 问题

但我想关注代码中的逻辑实现。逻辑似乎是错误的。

第一个错误似乎出现在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,则LHS评估为data_out[2:0] = data_in[4:1]。在i=1data_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 here模拟了您的代码。例如,您将拥有以下data_out和data_in值。请注意每个单元的切片MSB。

data_int = 1100101010010101
data_out = 100010001101