Mensaje de bucle de retroalimentación combinatoria desconcertante en VHDL con ISE Design Suite

3

Cuando intento sintetizar mi diseño VHDL (usando Xilinx ISE Design Suite), recibo el mensaje:

WARNING:Cpld - The signal(s) 'e' are in combinatorial feedback loops.
   These signals may cause hazards/glitches. Apply the NOREDUCE parameter to the
   hazard reduction circuitry.
   Timing analysis of paths involving this node may be inaccurate or incomplete.

Esto es confuso ya que mi diseño consiste simplemente en un contador 'c' que aumenta con cada tic del reloj y algunas señales que se derivan de él de una manera en la que no creo que pueda existir ningún bucle, para formar una señal de salida . Aquí está el código:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity foo is
    port (
        CLK : in std_logic;
        A : out std_logic_vector(1 downto 0)
    );
end foo;

architecture foo_arch of foo is

signal b : unsigned(1 downto 0);
signal e : std_logic;
signal c : unsigned(1 downto 0) := "00";
begin
   process (CLK, c)
    begin
        if rising_edge(CLK) then
            c <= c + 1;
        end if;
    end process;

    b <= c(1 downto 0) - 1;
    e <= '1' when b(1 downto 0) = 0 else '0';
    A <= std_logic_vector(b(1 downto 0)) when e = '1' else "ZZ";
end foo_arch;

Para que puedas ver

  • b se deriva de c
  • e se deriva de b
  • A (la salida) se deriva de b y e

¿Cuál es el problema? ¿Me estoy volviendo loco? ¿Estoy haciendo algo increíblemente estúpido o el sintetizador está jugando conmigo?

    
pregunta Jiri Svoboda

3 respuestas

1

Parece que esto es un error en la herramienta de síntesis Xilinx ISE VHDL. Pude evitarlo interponiendo un flip-flop tipo D en la señal e. Esto retrasa la señal en un ciclo de reloj, pero, afortunadamente, no importa en mi aplicación.

    
respondido por el Jiri Svoboda
1

Buen ejemplo independiente y estoy de acuerdo con tu análisis ... te estás volviendo loco. No, espera ... en los viejos tiempos, estaría presentando esto como un error probable en webcase. Ahora, puede intentar solicitar comentarios del personal de Xilinx en su propio foro.

Una construcción no demasiado higiénica: la inicialización de c a "00" en la declaración normalmente es compatible con las herramientas de síntesis de Xilinx pero posiblemente no para todas las arquitecturas: sugeriría agregar una entrada de restablecimiento y asignar c <= "00"; una cláusula if Reset , en caso de que XST no obedezca el valor inicial aquí y, por lo tanto, no pueda inferir un estado inicial.

Otras cosas para probar

  • para algunos dispositivos de destino, XST usa un analizador VHDL con un conjunto de errores, para otros dispositivos de destino usa un analizador diferente. Puede alternar entre analizadores (posiblemente no para todos los destinos) al configurar la casilla de verificación "Usar nuevo analizador - Sí" (en Síntesis / Propiedades / Vista avanzada ").
  • Parece que Vivado tiene otro analizador VHDL que puedes probar.
respondido por el Brian Drummond
0

La advertencia surge porque el orden en el que se asignan las señales b, e, A no está definido. En síntesis, es probable que tenga problemas técnicos con este circuito debido a los diferentes retrasos. Esto es una advertencia porque un circuito posterior no puede depender de las dependencias entre estas señales que están en un orden particular. Sin saber qué estás usando, no sé si es correcto o no.

    
respondido por el John

Lea otras preguntas en las etiquetas