Estaba revisando un diseño de referencia de la Wiki de Altera y encontré el siguiente código:
always @* begin
in_ready <= out_ready || ~out_valid;
end
Tengo entendido que tener un flip-flop como el que ayuda a obtener un tiempo más determinista, la herramienta de síntesis puede rehusarse a sintetizar si el out_ready || ~out_valid
de demora combinatoria excede el límite y no se cumplen los requisitos de tiempo, etc. Aparte de eso, eso debería ser En equivalente a la siguiente descripción combinatoria:
assign in_ready = (out_ready || ~out_valid);
Lo que me hizo pensar en eso es el código más grande que estoy preparando. A veces, la lógica combinatoria se usa para controlar la salida "lista" de algunos módulos, pero a veces este estilo. Realmente no puedo detectar una diferencia funcional y ver una explicación obvia.
He leído en alguna parte que la lógica combinatoria no es bienvenida en los FPGA debido a problemas de tiempo y siempre se prefiere el diseño sincronizado, y este proyecto se enfoca específicamente en los FPGA. Pero la mezcla es lo que me confunde. Así que dos preguntas surgieron en mi cabeza:
- ¿Cuándo y por qué una solución debería preferirse a otra?
- ¿Hay alguna diferencia en el comportamiento (o análisis del diseño) cuando la salida del módulo es "reg" frente a cuando es un "cable"?
Cualquier ayuda es apreciada. Gracias.