Para bucle en 'definir macro

0

Busqué en SO, y en la web, donde no encontré los ans. Tengo el siguiente código, donde Se analizó con éxito 'defina y genere los resultados esperados, pero si el número de veces que se llama la macro es grande, ¿podemos usar construcción de bucle? .

'define myreg(name) \
   addr_''name    

'define para(i) \
  parameter 'myreg(i) = i  

module register;

'para(1);
'para(2);
'para(3);
'para(4);

initial
begin
  $display("ADDR1 = %d, ADDR2 = %d", addr_1, addr_2);
  $display("ADDR3 = %d, ADDR4 = %d", addr_3, addr_4);
  #100 $finish;
end
endmodule

Resultado de la simulación:

// # Loading work.register(fast)
// # run -all
// # ADDR1 =           1, ADDR2 =           2
// # ADDR3 =           3, ADDR4 =           4
// # ** Note: $finish    : reg.v(18)

Ahora, cuando uso for loop , como en el código de abajo,

'define myreg(name) \
   addr_''name    

'define para(i) \
  parameter 'myreg(i) = i  

module register;

genvar i;
generate 
  for (i = 1; i<=4; i=i+1)
  begin
    'para(i);
  end
endgenerate

initial
begin
  $display("ADDR1 = %d, ADDR2 = %d", addr_1, addr_2);
  $display("ADDR3 = %d, ADDR4 = %d", addr_3, addr_4);
  #100 $finish;
end
endmodule

En ese caso, muestra un error al mostrarlo o usarlo, Resultado de la simulación:

// # vsim -lib work register -c -do "run -all; quit -f" -appendlog -l qverilog.log -vopt 
// # ** Note: (vsim-3813) Design is being optimized due to module recompilation...
// # ** Error (suppressible): (vopt-7063) reg.v(24): Failed to find 'addr_1' in hierarchical name '/addr_1'.
// # ** Error (suppressible): (vopt-7063) reg.v(24): Failed to find 'addr_2' in hierarchical name '/addr_2'.
// # ** Error (suppressible): (vopt-7063) reg.v(25): Failed to find 'addr_3' in hierarchical name '/addr_3'.
// # ** Error (suppressible): (vopt-7063) reg.v(25): Failed to find 'addr_4' in hierarchical name '/addr_4'.
// # Optimization failed
// # Error loading design

Se solicita más veces, pero nadie da la solución adecuada, cualquier ayuda es muy apreciada.

    
pregunta Prakash Darji

1 respuesta

1
generate
  for (i = 1; i<=4; i=i+1)
  begin
    addr_i = i;
  end
endgenerate

Las macros se expanden al principio de la compilación. En el momento en que se procesa "generar", el código es equivalente al anterior. El generador generará que se asigne un "addr_i" cuatro veces, pero no "addr_1", "addr_2", etc.

    
respondido por el rioraxe

Lea otras preguntas en las etiquetas