Переменная среза вектор Systemverilog - PullRequest
0 голосов
/ 31 января 2019

Я борюсь с ошибкой «Диапазон должен быть постоянным», когда я думаю, что это так!

Операция, которую я должен реализовать, такова:

Учитывая 8 битов со знаком / без знакавектор и переменная точка, например: b7b6b5b4b3b2.b1b0 или b7b6b5b4b3.b2b1b0

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

b7b6b5b4b3b2 + b1b5 для первого слова, b4bb для первого слова+ b2 для второго случая.

Количество дробных битов задается портом с именем "port_scale" wide C_SHIFT_BITS.

Это мой код, я хочу сгенерировать все комбинации:

C_SHIFT_BITS = 4; 

always_comb begin
   for (int k=1; k<2**(C_SHIFT_BITS-1); k++) begin
       dout_temp[k-1][8:0] = din[(k-1)+:8-k] + din[(k-1)+:1]
   end
   for (int k=1; k<2**(C_SHIFT_BITS-1); k++) begin
       if (port_scale == k) begin
          dout = dout_temp[k][8:0];
       end
   end
end

У вас есть другое решение или способ кодировать это, чтобы сделать его общим?Я бы не стал кодировать массивный оператор case, поскольку параметр C_SHIFT_BITS может быть любым числом, меньшим ширины din.Цикл for должен обойти недопустимый din [port_scale ...], но он не работает должным образом.

Спасибо

1 Ответ

0 голосов
/ 31 января 2019

Я думаю, вам просто нужно сдвинуться на k

 dout_temp[k-1][8:0] = (din >> k-1) + din[k];

Также вы можете избавиться от второго цикла и сделать

  dout = dout_temp[port_scale][8:0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...