Quiero diseñar un bloque de lógica combinacional usando VHDL, pero ocasionalmente el resultado sintetizado contiene un bloqueo involuntario.
¿Qué pautas de codificación debo seguir para evitar que el sintetizador infiera pestillos?
Ejemplo: en un segmento pequeño de código, ¿debo usar declaraciones if-else?
Respuestas:
Para evitar bloqueos, debe asegurarse de que todas sus salidas estén asignadas a todas las ramas posibles del código.
por ejemplo,
generaría un pestillo, porque en la primera condición, el valor de b (1) no se especifica, por lo que el compilador decidió que deseaba mantener el valor anterior de b (1) allí. Una forma de escribir esto que no generaría un pestillo es:
Aquí usted declara explícitamente que b debe retener su valor anterior y luego sobrescribe b (0) con el nuevo valor.
Otra forma es dar un valor predeterminado ba, como en la respuesta de @ TomiJ.
Si publica el código en el que se está bloqueando, podríamos ayudarlo a encontrar el motivo específico.
fuente
b <= b
evite un pestillo, ya que aún requiere preservar el estado de la señal.Si está utilizando procesos para la lógica combinacional (y lo desaconsejo por esta razón), asegúrese de que cada ruta del proceso asigne algo a cada señal que impulsa el proceso. Ninguna de las salidas puede depender de ninguna de las salidas de la "última vez" que se ejecutó el proceso.
De lo contrario, infiere un pestillo porque la próxima vez que se programe el proceso tiene que mantener el valor de la señal que no obtuvo un nuevo valor la última vez.
Prefiero mantener la lógica puramente combinacional como asignaciones continuas, y usar procesos para la lógica sincronizada, entonces no obtengo bloqueos.
fuente
Cuatro reglas para evitar los pestillos:
Además, si tiene varios procesos combinacionales, asegúrese de no crear un bucle.
Varios estilos de codificación pueden ayudarlo a cumplir con estas reglas, por ejemplo, el estilo en la respuesta de @ TomiJ. Como señala @Martin Thompson, puede ser mejor evitar la lógica combinacional por completo. Ponga todo en un proceso cronometrado en su lugar.
fuente
Como han señalado @fbo y @Martin Thompson, debe asegurarse de que a cada señal impulsada por el proceso se le asigne algún valor en cada rama del proceso, y ese valor no debe depender del estado anterior de ninguna de las salidas del proceso
La forma más fácil de garantizar esto es asignar un valor predeterminado a cada salida al comienzo del proceso, por ejemplo (cooptar el ejemplo de fbo):
fuente