Tengo un montón de código de Verilog (del sistema) que usa sentencias de inicialización. Este es el código para un FPGA de Altera. Pruebo el código usando bancos de pruebas automatizados en la versión de modelsim que se envía con quartus, y todo funciona bien. Sin embargo, he estado tratando de mover algunos de nuestros bancos de pruebas al simulador de cadencia, y eso es una queja. Un ejemplo simple de código que falla es el siguiente:
reg [15:0] counter = 0;
always_ff @(posedge clk) begin
counter = counter + 1'b1;
display("counter: %4X", counter);
end
Esto da un error en el simulador de cadencia que indica que no está permitido que el contador tenga varios controladores porque se usa en un bloque always_ff.
¿Este error es correcto? Dos herramientas dicen que el código está bien, y una falla. Las reglas que he encontrado para always_ff establecen que "una variable asignada en un always_ff, always_comb, o always_latch no puede ser asignada por ningún otro proceso". Esto tiene sentido, pero parece extraño que el valor inicial se considere un proceso, y en cualquier caso haría que esas características de lenguaje sean incompatibles entre sí.
Entonces, ¿hay una manera correcta de usar inicializadores a lo largo del sistema lateral verilog nuevo estilo siempre procesos * *? ¿Depende este comportamiento de la versión del sistema verilog standard para que pueda decirle a mis herramientas cuál usar? ¿O mis opciones de usar solo líneas de restablecimiento explícito, o atenerse al estilo antiguo siempre bloquean?