Попытка написать простой 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?