Как инициализировать параметризованный параметр массива, используя цикл / генерировать в Verilog?

Я хочу инициализировать параметризованный параметр массива следующим образом:

parameter n = 4;
parameter [(log2(n)-1):0] state [(n-1):0] = '{2'h3, 2'h2, 2'h1, 2'h0}; // for n=4

Это назначение отлично работает, если n=4. Когда n=8, он должен инициализироваться как

{3'h7, 3'h6, 3'h5, 3'h4, 3'h3, 3'h2, 3'h1, 3'h0}

Я хочу инициализировать это так:

for(i=0,i<n,i=i+1)
    state[i] = i;

Теперь, что я должен использовать для этой инициализации? Могу ли я сделать это с помощью Generate? Здесь log2 - это функция.

1 ответ

Решение

Во-первых, вы используете SystemVerilog, суперсет и преемник Verilog. Verilog не поддерживает массивизированные параметры (с векторами все в порядке), и Verilog не может назначить целый распакованный массив ('{} это SystemVerilog).

С SystemVerilog вы можете автоматически масштабировать значения STATE со следующим:

parameter N = 4;
parameter [(log2(N)-1):0] STATE [N] = state_val();

typedef [(log2(N)-1):0] state_t [N];
function state_t state_val();
  for(int i=0; i<N; i++)
    state_value[i] = i;
endfunction : state_val

Примечание. В большинстве рекомендаций по стилю кодирования рекомендуется использовать верхний регистр для параметров и нижний регистр для переменных; это позволяет легче читать. Вот почему я изменился n а также state в N а также STATE в моем ответе.

Другие вопросы по тегам