Система Verilog выдает проблемы с part_select / generate простой цикл в блоке always_comb - PullRequest
0 голосов
/ 02 ноября 2018

Попытка написать простой N-битный арбитр с приоритетом (который будет расставлять приоритеты req [0]> req [1]> req [2] ... req [N].

Рабочий код:

assign grant_simple[0] = req_in[0];

  generate

     for (i=1; i<N; i++)
assign  grant_simple[i] = req_in[i] & (!(|req_in[i-1:0]));

  endgenerate 

Но я попытался без генерации и использования блока always_comb следующим образом.

assign grant_simple [0] = req_in [0];

always_comb begin 

     for (int i=1; i<N; i++)
      grant_simple[i] = req_in[i] & (!(|req_in[i-1:0]));
  end //always

Это дает мне ошибку.

Ошибка - [IRIPS] Недопустимый диапазон в выборе части design.sv, 18 Диапазон выбора детали недопустим: req_in [(i - 1): 0]

Ошибка - [TCF-CETE] Невозможно оценить выражение design.sv, 18 "(я - 1)" Невозможно оценить выражение в выражении левого среза. Выражение должно быть постоянной времени компиляции.

Я пытался заменить [i-1:0] на i-:1, но я не думаю, что это делает то же самое. Ищите четкое объяснение того, почему генерировать нормально с [i-1:0], а не с циклом for без генерации. Как использовать нарезку битов в этом случае для системного verilog?

...