Как инициализировать параметризованный параметр массива, используя цикл / генерировать в 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
в моем ответе.