Advertencia de puerto no conectado en el puerto de reinicio en el registro asíncrono en Vivado

1

He estado intentando sintetizar este modelo de registro. Su simulación en ModelSim está correctamente bien. Sin embargo, cuando la síntesis, siempre produce advertencias:

[sintetizador 8-3331] el registro de diseño1 tiene el primer puerto desconectado

[sintetizador 8-3331] el registro de diseño1 tiene un puerto no conectado end_data

Aquí está el código:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity register1 is
    port(
        rst      : in  std_logic;
        end_data : in  std_logic;
        clk      : in  std_logic;
        D        : in  std_logic_vector(7 downto 0);
        Q        : out std_logic_vector(7 downto 0)
    );
end entity register1;

architecture RTL of register1 is
begin
    process(clk)
    begin
        if rising_edge(clk) then
            if rst = '1' or end_data = '1' then
                Q <= "UUUUUUUU";
            else
                Q <= D;
            end if;
        end if;
    end process;

end architecture RTL;

No sé qué está mal. ¿Podría ser mi estilo de codificación?

Espero que ustedes me puedan ayudar. Ha sido muy irritante.

    
pregunta Liam NguyenQuang

2 respuestas

0

A nivel de hardware, nada está mal y puedes ignorar esas advertencias de forma segura.

La asignación de "UUUUUUUU" no hace nada en hardware, por lo que le da a la herramienta de síntesis un permiso explícito para guardar hardware haciendo lo más barato posible. Como resultado, dos señales de entrada rst y end_data no se utilizan.

Luego, la herramienta de sintetizador emite advertencias, porque las entradas no utilizadas, como todo código muerto, son un olor de código y apuntan a un posible problema de diseño. Entonces, léalos, compréndalos y si son "falsos positivos" (el valor de restablecimiento no importa), ignórelos.

Pero sus comentarios revelan un problema de diseño: desea distinguir entre entradas válidas y no válidas, lo que generalmente no es posible en el hardware: una FF puede contener '0' o '1' y eso es todo, no hay otras opciones (excepto 'Z' , que está restringido a los pines de E / S, y tal vez, a otros roles en los ASIC)

Entonces, en el nivel de hardware 'lo que quieres hacer es imposible: incluso si pudieras asignar "UUUUUUUU" estaría representado por un patrón de '0' y '1' y, por lo tanto, tu comparador de igualdad devolvería True para algunos datos válidos específicos.

Por lo tanto, sus opciones se limitan a encontrar un valor en banda que el registro nunca se asignará (como -1 para un número positivo, como se ve a menudo en la programación en C), o agregar un bit "Válido" como sugiere Jeff .

En el nivel conceptual, los metavalues 'X' 'U' y así sucesivamente son para permitirle encontrar y corregir estos problemas en la simulación.

Por lo tanto, cuando sintetiza su diseño, todos se han resuelto, y la síntesis tiene permiso para optimizar el diseño y guardar recursos de hardware donde sea posible. Entonces, lo que el sintetizador hace con estos valores es esencialmente indefinido, y eso está bien.

    
respondido por el Brian Drummond
0

De hecho, el código se vuelve un poco más simple si agrega una salida valid :

entity register1 is
    port(
        rst      : in  std_logic;
        end_data : in  std_logic;
        clk      : in  std_logic;
        D        : in  std_logic_vector(7 downto 0);
        valid    : out std_logic;
        Q        : out std_logic_vector(7 downto 0)
    );
end entity register1;

architecture RTL of register1 is
begin
    process(clk)
    begin
        if rising_edge(clk) then
            valid <= not (rst or end_data);
            Q <= D;
        end if;
    end process;

end architecture RTL;
    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas