Verilog 连续赋值的左侧是非法的

Verilog 连续赋值的左侧是非法的,verilog,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 [d

我的输入由参数化的单位数组成。我需要的输出是删除每个单元的第一位。 例如,如果输入具有大小为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
参数数据大小=11;
参数数据_out_size=10;
参数单位=4;
参数skip_bits=1;
输入[data_in_size*units-1:0]数据_in;
输出[数据输入大小*单位-1:0]数据输出;
genvar i;
生成
对于(i=0;i
但是我得到以下错误
连续赋值的左侧是非法的


我怎样才能克服这个错误以及为什么会出现这个错误?

您的代码运行得非常好。可能是模拟机的问题

但我想重点介绍代码中的逻辑实现。逻辑似乎是错误的

第一个错误似乎出现在
数据输出
声明和切片逻辑中:
数据输入[(数据输入大小*i+跳过位)+:数据输出大小]
必须替换为:
数据输入大小[(数据输入大小*i+跳过位)+:数据输入大小]

让我们假设
i=0;数据输出大小=3;data\u in\u size=4
然后LHS计算为
data\u out[2:0]=data\u in[4:1]
。当
i=1
时,
data\u out[5:3]=data\u 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位,保持其余位不变

我模拟了你的代码。例如,您将有以下数据输出和数据输入值。请注意每个单元的切片MSB

data_int = 1100101010010101
data_out = 100010001101
我看不出有什么问题(除了数据输出声明中的类型)。