Xilinx Place Error 1136: este diseño contiene una instancia de búfer global que controla los siguientes pines de carga sin reloj

2

Espero que alguien pueda explicar en términos simples por qué podría estar recibiendo este error de la herramienta de mapas Xilinx:

ERROR:Place:1136 - This design contains a global buffer instance,
<reset_IBUF_BUFG>, driving the net, <reset_IBUF_BUFG>, that is driving the
following (first 30) non-clock load pins.
< PIN: clock_core1/pll_base_inst/PLL_ADV.RST; >
This is not a recommended design practice in Spartan-6 due to limitations in
the global routing that may cause excessive delay, skew or unroutable
situations.  It is recommended to only use a BUFG resource to drive clock
loads. If you wish to override this recommendation, you may use the
CLOCK_DEDICATED_ROUTE constraint (given below) in the .ucf file to demote
this message to a WARNING and allow your design to continue.
< PIN "reset_IBUF_BUFG.O" CLOCK_DEDICATED_ROUTE = FALSE; >

Primero un poco de fondo ...

  1. El diseño estaba construyendo y funcionando bien.
  2. Estaba en el proceso de actualizar el controlador de la tarjeta SD del proyecto para admitir las tarjetas SDHC.
  3. Este error apareció repentinamente aunque no estaba haciendo ningún cambio relacionado con la señal de reinicio.
  4. Retrocediendo lentamente a mis cambios, lo reduje al fragmento de código que se muestra a continuación.
  5. Pensando que esto podría estar relacionado con el proyecto más grande en el que estaba trabajando, extraí la entidad del Controlador de tarjeta SD a un proyecto de prueba separado. Me sale el mismo error allí.
  6. No sé de dónde viene IBUF_BUFG en la línea de reinicio, ciertamente no es algo que esté creando explícitamente. Sin embargo, sí tengo la señal de reinicio conduciendo un núcleo de reloj corregido.

Aquí está el fragmento de código que parece desencadenar el error:

when RX_BITS_FINISHED =>
    if do_deselect='1' then
        bit_counter := 2;
        state <= DESELECT;
    else
        state <= return_state;
    end if;

Si comento lo anterior, el error desaparece. Todo lo que se hace referencia aquí son variables o señales privadas al módulo. El bloque when está dentro de un proceso controlado por las señales de reloj y reinicio. No hay nada especial aquí, pero la fuente completa del componente puede ser visto aquí con el fragmento de código anterior en la parte inferior.

De todos modos ... Busqué el error y encontré esta respuesta de Xilinx:

enlace

lo que podría explicar las cosas para algunos, pero no para mí. He leído la solución sugerida y la he trabajado, pero me preocupa que solo estoy ocultando un problema más fundamental con mi diseño.

No entiendo lo que sucede aquí y necesito que alguien me lo explique para que un aficionado / aprendiz pueda entenderlo.

    
pregunta Brad Robinson

2 respuestas

1

Desde ISE, en 'Restricciones del usuario', abra 'Planificación de pines de E / S (PlanAhead) - Post-síntesis'. Esto debería abrir un esquema donde puede seguir la señal que impulsa el reinicio de PLL alrededor de su diseño. Haga doble clic en una red o componente para mostrar todos los elementos a los que se conecta. ¿Esta señal conduce a algún reloj de registro o puertas de cierre? Si es así, debería poder ver en la jerarquía qué parte del código en particular está causando inferencia de reloj.

Mi apuesta es que involuntariamente ha creado un pestillo al especificar una carga asíncrona en uno de sus casos de reinicio.

    
respondido por el scary_jeff
0

Seguimiento: cambiar todos los restablecimientos a síncrono solucionó este problema.

    
respondido por el Brad Robinson

Lea otras preguntas en las etiquetas