1、报错原因
错误地使用了verilog中的索引功能。
例如
我声明了一个单bit的wire型变量
wire m_axis_data_tuser;
但我对它进行了索引操作
assign w_index = m_axis_data_tuser[10:0];
或者是我声明的位宽不满足索引位宽的长度
wire [7:0] m_axis_data_tuser;
assign w_index = m_axis_data_tuser[10:0];
2、解决办法
对要进行索引的wire型变量给定合适的位宽。
3、常见出错案例
当我们例化模块时,常常会直接复制过来IP核给的模板,而里面的许多output接口,我们忘记了对其进行wire定义。此时编译器会自动把他们设置为单bit的wire型变量。
这个时候我们对其进行索引操作时,就会报此类错误。
举例:
xfft_0 your_instance_name (
.aclk (clk ),// input wire aclk
.s_axis_config_tdata (8'b1 ),// input wire [7 : 0] s_axis_config_tdata 1 fft 0 ifft
.s_axis_config_tvalid (1'b1 ),// input wire s_axis_config_tvalid
.s_axis_config_tready (s_axis_config_tready ),// output wire s_axis_config_tready
.s_axis_data_tdata ({16'b0,sin_mulit} ),// input wire [31 : 0] s_axis_data_tdata 输入数据
.s_axis_data_tvalid (m_axis_data_tvalid ),// input wire s_axis_data_tvalid 接主机的m_axis_data_tvalid信号
.s_axis_data_tready (s_axis_data_tready ),// output wire s_axis_data_tready
.s_axis_data_tlast (1 ),// input wire s_axis_data_tlast 当这个信号拉高的时候 表示现在fft ip核里面的2048个数就是我要算的数 可以开始计算了
.m_axis_data_tdata (m_axis_data_tdata ),// output wire [31 : 0] m_axis_data_tdata 低16位是实数 高16位是虚数
.m_axis_data_tuser (m_axis_data_tuser ),// output wire [23 : 0] m_axis_data_tuser 低11位是频谱点坐标
.m_axis_data_tvalid (m_axis_data_tvalid_fftout),// output wire m_axis_data_tvalid
.m_axis_data_tready (1'b1 ),// input wire m_axis_data_tready
.m_axis_data_tlast (m_axis_data_tlast ),// output wire m_axis_data_tlast
.m_axis_status_tdata ( ),// output wire [7 : 0] m_axis_status_tdata
.m_axis_status_tvalid ( ),// output wire m_axis_status_tvalid
.m_axis_status_tready ( )// input wire m_axis_status_tready
);
当我们复制过来之后,并没有对m_axis_data_tuser这个output接口定义,此时我们直接对它进行索引操作时,就发生了错误。
assign w_index = m_axis_data_tuser[10:0];