【发布时间】:2020-02-12 14:40:05
【问题描述】:
我知道对于可变部分选择,冒号两边不能有变量:
a_vect[ 8*i +: 8] // == a_vect[(8*i+7) : 8*i]
但是,我需要转换这段代码:
a_vect[(i*16+3)%64 : (i*16)%64]
冒号两边的“%64”怎么处理?
【问题讨论】:
我知道对于可变部分选择,冒号两边不能有变量:
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]
(如果是这样,原始代码无论如何都不会工作。)
【讨论】:
或者,您可以使用移位操作:
temp = (a_vect >> ((i*16)%64));
如果临时变量未定义为 4 位,请使用:
temp = (a_vect >> ((i*16)%64)) & 4'hF;
【讨论】:
a_vect[(i*16+3)%64 : (i*16)%64]
详细说明
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]
【讨论】: