如何使用冒号两侧的%进行Verilog变量部分选择?

如何使用冒号两侧的%进行Verilog变量部分选择?,verilog,system-verilog,Verilog,System Verilog,我理解,对于可变部分选择,冒号两侧不能有一个变量: a_vect[ 8*i +: 8] // == a_vect[(8*i+7) : 8*i] 但是,我需要转换此代码: a_vect[(i*16+3)%64 : (i*16)%64] 如何处理冒号两侧的%64 +3不会导致mod缠绕,因此只需将其移除: a_vect[(i*16)%64 +: 4] 如果它这样做了,原始代码无论如何也不会工作。3不会导致mod被包装,所以只需删除它: a_vect[(i*16)%64 +: 4] 如果是这样

我理解,对于可变部分选择,冒号两侧不能有一个变量:

a_vect[ 8*i +: 8] // == a_vect[(8*i+7) : 8*i]
但是,我需要转换此代码:

a_vect[(i*16+3)%64 : (i*16)%64]

如何处理冒号两侧的%64

+3不会导致mod缠绕,因此只需将其移除:

a_vect[(i*16)%64 +: 4]

如果它这样做了,原始代码无论如何也不会工作。

3不会导致mod被包装,所以只需删除它:

a_vect[(i*16)%64 +: 4]

如果是这样,原始代码无论如何也不会工作。

或者,您可以使用shift操作:

temp = (a_vect >> ((i*16)%64));
如果temp变量未定义为4位,请使用:

temp = (a_vect >> ((i*16)%64)) & 4'hF;

或者,您可以使用shift操作:

temp = (a_vect >> ((i*16)%64));
如果temp变量未定义为4位,请使用:

temp = (a_vect >> ((i*16)%64)) & 4'hF;
详细阐述时

i=0 ==> a_vect[3:0]
i=1 ==> a_vect[19:16]
i=2 ==> a_vect[35:32]
i=3 ==> a_vect[51:48]
i=4 ==> a_vect[3:0]
你可以用这种类型

  for(genvar i=0;i<64;i+16)
        a_vect[i+:4]
详细阐述时

i=0 ==> a_vect[3:0]
i=1 ==> a_vect[19:16]
i=2 ==> a_vect[35:32]
i=3 ==> a_vect[51:48]
i=4 ==> a_vect[3:0]
你可以用这种类型

  for(genvar i=0;i<64;i+16)
        a_vect[i+:4]