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.