SystemVerilog: ¿Cómo asignar diferentes parámetros a los módulos en la misma matriz?

1

En mi diseño, quería usar varios contadores con diferentes valores iniciales al reiniciar. Por lo tanto, definí el módulo contador de la siguiente manera:

module my_counter #(parameter int INIT_VALUE = 0)
    (
        input clock, reset,
        ...

Luego, en el diseño tengo 4 instancias de mycounter que comparten muchas entradas, pero tienen valores iniciales diferentes. Me gustaría convertirlos en una matriz de módulos, pero la mejor manera de hacerlo es:

defparam my_counters[0].INIT_VALUE = 0;
defparam my_counters[1].INIT_VALUE = 1;
defparam my_counters[2].INIT_VALUE = 2;
defparam my_counters[3].INIT_VALUE = 3;
my_counter my_counters[3:0](
    .clock(clock),
    ...

Eso funciona con simulación, pero he escuchado que defparam se considera una forma deficiente. Además, al intentar sintetizar mi diseño, el sintetizador se queja de que Syntax error at or near token '['. está en las líneas con defparam.

¿Cómo podría hacer lo que quería hacer sin mucha duplicación de código?

    

1 respuesta

1

Utiliza un bucle generate

for(genvar ii=0; ii<4; ii++) begin : counter_loop
  my_counter #(.INIT_VALUE(ii)) my_cnt (.clock, .reset ... );
end : counter_loop

Si los valores que desea invalidar no se pueden calcular con una expresión de bucle simple, puede usar una matriz de parámetros.

parameter int ARRAY_VALUE[4] = {1,3,5,10};
for(genvar ii=0; ii<4; ii++) begin : counter_loop
    my_counter #(.INIT_VALUE(ARRAY_VALUE[ii])) my_cnt (.clock, .reset ... );
end : counter_loop
    
respondido por el dave_59

Lea otras preguntas en las etiquetas