Как выбрать переменную часть Verilog с% по обе стороны от двоеточия? - PullRequest
1 голос
/ 12 февраля 2020

Я понимаю, что для выбора переменной части не может быть переменной по обе стороны от двоеточия:

a_vect[ 8*i +: 8] // == a_vect[(8*i+7) : 8*i]

Однако мне нужно преобразовать этот код:

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

Как мне справиться с "% 64" по обе стороны от толстой кишки?

Ответы [ 3 ]

2 голосов
/ 12 февраля 2020

+3 не приведет к переносу мода, поэтому просто удалите его:

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

(Если это так, оригинальный код все равно не будет работать.)

1 голос
/ 13 февраля 2020

В качестве альтернативы вы можете использовать операцию сдвига:

temp = (a_vect >> ((i*16)%64));

Если временная переменная не определена как 4-битная, используйте:

temp = (a_vect >> ((i*16)%64)) & 4'hF;
0 голосов
/ 14 февраля 2020
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]
...