En muchos bancos de prueba veo el siguiente patrón para la generación de reloj:
process
begin
clk <= '0';
wait for 10 NS;
clk <= '1';
wait for 10 NS;
end process;
En otros casos veo:
clk <= not clk after 10 ns;
Se dice que lo último es mejor, porque se programa antes de que se ejecute cualquier proceso y, por lo tanto, las señales que se cambian de forma síncrona con el borde del clk se manejan correctamente. Las siguientes secciones del LRM pueden parecer compatibles con esta teoría:
Página 169: 12.6.4 El ciclo de simulación Un ciclo de simulación consta de los siguientes pasos:
- b) Se actualiza cada señal explícita activa en el modelo. (Los eventos pueden se producen en las señales como resultado.)
Estas deben ser las señales con un nuevo valor proyectado, como las señales retrasadas por el after
.
- d) Para cada proceso P, si P es actualmente sensible a una señal S y si se ha producido un evento en S en este ciclo de simulación, luego P se reanuda.
Esa sería la mayor parte de la lógica a simular
- e) Cada proceso no pospuesto que se ha reanudado en la simulación actual el ciclo se ejecuta hasta que se suspende.
Y ahora se ejecutan todos los procesos que están suspendidos por wait for
.
TL; DR:
- ¿El método
after
siempre es superior al métodowait for
? - ¿Ayuda a evitar que los problemas configuren de forma síncrona las señales de entrada?