Cómo evitar los pestillos durante la síntesis

9

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?

W5VO
fuente
Si alguien pudiera obtener lo que intento preguntar,
No estaba seguro de lo que querías decir con tu ejemplo. Verifique para asegurarse de que la nueva redacción coincida con su intención original.
W5VO
@fatai, ya comenté, hay un método específico para eliminar su cuenta disponible en meta.stackexchange.com. Me uní a la última pregunta en la que me marcaron. Los moderadores en el sitio no tienen este poder, nunca. Esto requiere contactar al equipo de desarrollo.
Kortuk

Respuestas:

13

Para evitar bloqueos, debe asegurarse de que todas sus salidas estén asignadas a todas las ramas posibles del código.

por ejemplo,

if a = '1' then
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

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:

if a = '1' then
   b <= prev_b;
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

...

if rising_edge (clk)
    prev_b <= b;
end if;

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.

fbo
fuente
No creo que su enfoque b <= bevite un pestillo, ya que aún requiere preservar el estado de la señal.
Tomi Junnila
Puede que tengas razón; Estoy demasiado acostumbrado a la lógica sincronizada. Voy a editar
fbo
6

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.

Martin Thompson
fuente
5

Cuatro reglas para evitar los pestillos:

  • No leas las señales a las que escribes.
  • Tenga una lista de sensibilidad correcta (todas las señales que lea deben estar en la lista de sensibilidad)
  • Asegúrese de que todas las señales a las que está asignada su escritura en cada ruta. (por ejemplo: en cada rama de una declaración if-else)
  • Para los procesos que usan variables, asegúrese de que cada variable tenga un valor predeterminado inicializado antes de leerla (en otra variable o señal).

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.

Philippe
fuente
+1 Bonito conjunto de reglas. ¿Estaría de acuerdo en que su regla n. ° 2 (sobre la lista de sensibilidad) es realmente importante para garantizar resultados consistentes entre la síntesis y las simulaciones, pero realmente no hace una diferencia sobre la inferencia de los pestillos?
Rick
@rick AFAIK, no hay garantía de lo que hará una herramienta de síntesis con listas de sensibilidad incompletas. El estándar IEEE para la síntesis de VHDL (1076.6-1999) establece que: "La lista de sensibilidad del proceso contendrá todas las señales leídas dentro de la declaración del proceso. Los procesos con listas de sensibilidad incompletas no son compatibles". Dicho esto, sé que ciertas herramientas de síntesis (¿tal vez todas?) Aceptan listas de sensibilidad incompletas, pero simplemente ignoran todas las listas de sensibilidad. Si confiara en ese comportamiento en lugar del estándar IEEE más estricto, supongo que su declaración sería correcta.
Philippe
Gracias, eso suena bien, haría que mi modelo no cumpla con ese estándar. Simplemente despertó mi curiosidad porque todas las herramientas de síntesis que he visto hasta ahora ignoran la lista de sensibilidad, pero he escuchado rumores de que algunas podrían inferir bloqueos.
Rick
3

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):

COMBO: process(a)
begin
    b <= (others => '0'); -- Assign default value to b
    if a = '1' then
        b(0) <= '1';
    else
        b(1 downto 0) <= "00";
    end if;
end process COMBO;
Tomi Junnila
fuente
1
Este es un buen método que uso a menudo. Sin embargo, a veces, una advertencia de bloqueo puede indicarle que olvidó asignar algunos bits, mientras que este método puede hacer que sea más difícil encontrar el error. Por ejemplo, si estaba asignando todos los bits de una señal amplia por separado y accidentalmente contados erróneamente.
fbo
2
Solo en un proceso combinatorio. En un proceso cronometrado, infieres un flipflop, que puede ser exactamente lo que deseas.
Martin Thompson