![](/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.