how to fix this verilog part-select error: Illegal operand for constant expression

how to fix this verilog part-select error: Illegal operand for constant expression

所以我有一个名为 tx_empty 的输入和 255 位数据,我的代码是:

assign lastIndex  = (tx_eop)?  (tx_empty + 3'd4)*8 : lastIndex_xq;
wire [255:0] tmp1 = tx_data_xq[(tx_empty - 5'd16)*8-1 : 0];
wire [255:0] tmp2 = tx_data_xq[255:lastIndex];
wire [255:0] tmp3 = tx_data_xq[lastIndex +: 7'd96];

tx_empty是本模块的输入信号,“lastIndex_xq”只是lastIndex的D寄存器的输出。我想在 tx_eop 高时更改索引值。

tmp3 工作正常,对于 tmp1tmp2,我收到类似“常量表达式的非法操作数”的错误,我知道 tmp2 是错误的,因为我不能有变量在 select 部分中 : 的右侧。但是 tmp1 呢?我必须使用这部分-select 逻辑,还有其他方法吗? 感谢 adv

verilog 不允许您在部分 select 中使用可变宽度。宽度必须始终为常数。在你的情况下不是,因为 tx_emtptylast_index.

但是,您可以使用移位、掩码和循环来处理它。类似于以下内容。

reg [255:0] mask1, mask2;
reg [255:0] tmp1, tmp2;
always @* begin
    // create mask of '1' of the required width
    mask1 = (256'b1 << (tx_empty - 5'd16)*8) - 1;
    tmp1 = tx_data_xq & mask1;
    mask2 = ~((256'b1 << lastIndex) - 1);
    tmp2 = (tx_data_xq & mask2) >> lastIndex;
end