错误代码&错误原因
错误代码:
encoded_data[start_bit*2+1:start_bit*2] <= encoded_bit;

错误原因:
- 传统的 范围选择语法,必须使用固定的起始和结束索引。
- 例如:
encoded_data[3*2+1:3*2] = encoded_bit;
等价于:encoded_data[7:6] = encoded_bit;
- 如下语法也会报错:
start_bit <= 0;
encoded_data[start_bit*2+1:start_bit*2] = encoded_bit;
解决方法
加法切片(Indexed Part-Select with Fixed Width)
start_bit <= bit_cnt * 2;
encoded_data[start_bit +: 2] <= encoded_bit;
语法解释:
- 这是 Verilog-2001 引入的位选择语法,称为 “加法切片”(Indexed Part-Select with Fixed Width),适合需要动态计算起始索引的场景。
start_bit +: 2
表示从 start_bit
开始,连续选择 2 位。
start_bit
是起始索引。+:
表示从起始索引开始向高位方向选择固定宽度的位。- 宽度为 2,(宽度必须为固定长度)。