Contador de pulsos Tacho VHDL/FPGA

Estoy intentando implementar una interfaz de tacómetro que acepte pulsos digitales como entrada. Simplemente cuento los flancos ascendentes de clk (50Mhz) entre cada flanco ascendente de los pulsos de taco (1Mhz). He encontrado ejemplos en la web que logran lo que necesito hacer, pero en un intento por no cometer los mismos errores en el futuro, me gustaría entender por qué esta solución no funciona.

Cuando digo que no funciona, me refiero a que la simulación funcional posterior a la síntesis no produce los resultados que esperaría. La simulación de comportamiento genera los valores que esperaba.

En resumen, la síntesis parece estar ignorando mi intento de restablecer una variable a 0 (consulte el comentario 'esto no parece ejecutarse' a continuación). La salida tacho_count aumenta sin restablecerse. Consulte los diagramas de simulación a continuación.

entity tacho_interface is
    Generic ( 
        FREQ_DIVISOR : integer := 6;
        MIN_RPM : integer := 200
    );
    Port ( 
        enable : in STD_LOGIC;
        clk : in STD_LOGIC;
        pump_tacho : in STD_LOGIC;
        tacho_count : out STD_LOGIC_VECTOR(31 downto 0);
        error: out STD_LOGIC := '0'
    );
end tacho_interface;

architecture Behavioral of tacho_interface is
begin

process
variable last_tacho : std_logic := '1';
variable tracking_cntr : integer := 0;
begin
    if (clk'event and clk = '1') then
        if (pump_tacho = '1' and pump_tacho /= last_tacho) then
            tacho_count <= std_logic_vector(to_unsigned(tracking_cntr * FREQ_DIVISOR, tacho_count'length));
            wait for 0ns;                
            tracking_cntr := 0; --this does not execute
        end if;
        last_tacho := pump_tacho;
        tracking_cntr := tracking_cntr + 1;
    end if;
    wait on clk;
end process;

end Behavioral;

Simulación posterior a la síntesis que ilustra el problema (acumulación sin restablecer a 0)

ingrese la descripción de la imagen aquí

Simulación de comportamiento que ilustra lo que esperaba

ingrese la descripción de la imagen aquí

¿Es 'esperar por 0nS' sintetizable?
Utilice señales, no variables. Entre otras razones, los resultados de la simulación y la síntesis aquí diferirán con las variables pero no con las señales.

Respuestas (1)

Las sentencias de retardo no son sintetizables. Echa un vistazo a esto:

https://www.nandland.com/articles/synthesizable-vs-non-synthesizable-code-fpga-asic.html

Bueno saber. Supuse que la herramienta de síntesis habría arrojado un error. Supongo que sería demasiado conveniente.
Deberían, pero de nuevo, ¿cuándo hemos recibido un mensaje de error que nos merecemos?