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
工作正常,对于 tmp1
和 tmp2
,我收到类似“常量表达式的非法操作数”的错误,我知道 tmp2 是错误的,因为我不能有变量在 select 部分中 :
的右侧。但是 tmp1 呢?我必须使用这部分-select 逻辑,还有其他方法吗?
感谢 adv
verilog 不允许您在部分 select 中使用可变宽度。宽度必须始终为常数。在你的情况下不是,因为 tx_emtpty 和 last_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
所以我有一个名为 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
工作正常,对于 tmp1
和 tmp2
,我收到类似“常量表达式的非法操作数”的错误,我知道 tmp2 是错误的,因为我不能有变量在 select 部分中 :
的右侧。但是 tmp1 呢?我必须使用这部分-select 逻辑,还有其他方法吗?
感谢 adv
verilog 不允许您在部分 select 中使用可变宽度。宽度必须始终为常数。在你的情况下不是,因为 tx_emtpty 和 last_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