referencia ilegal de una señal durante una elaboración estática, vhdl

2

Tengo una entidad dentro de dicha entidad que declara un componente y, por supuesto, necesito establecer el mapa de puertos en el componente.

básicamente he hecho algo como

port map (x => '0' & signal_id, ...

digamos que %código% mientras x : in std_logic_vector(n - 1 downto 0)

así que básicamente quería realizar un mapeo de una señal de tamaño signal signal_id : std_logic_vector(n - 2 downto 0) con una señal de tamaño n - 1 , así que intenté realizar un relleno agregando un cero. Sin embargo, cuando intento ejecutar ncvhdl dice:

port map(x => '0' & signal_id,
                                |
ncvhdl_p: *E,ILSGRD (test.vhd,159|32): illegal reference of a signal (SIGNAL_ID) during static elaboration [12.3].

¿Cuál es el significado de la elaboración estática en este caso? He intentado comprobar si hubo un error de sintaxis, sin embargo, en el libro de Ashenden he visto que la expresión como mapeo en un mapa de puerto es legal.

¿Puede alguien explicarme lo que está pasando?

    
pregunta user8469759

1 respuesta

2

Es útil cuando se le pregunta a VHDL que proporcione un ejemplo mínimo, completo y verificable que apunte a un error.

Aquí hay una solución:

library ieee;
use ieee.std_logic_1164.all;

entity some_entity is
    generic (n: natural := 9);
    port (
        x:    in  std_logic_vector (n-1 downto 0)
    );  
end entity;

architecture foo of some_entity is
begin
end architecture;

library ieee;
use ieee.std_logic_1164.all;

entity some_entity_tb is
end entity;

architecture foo of some_entity_tb is
    constant n: natural := 9;
    signal signal_id:   std_logic_vector (n - 2 downto 0);
begin
INSTANTIATED:
    entity work.some_entity
        generic map (n)
        port map (
            x(n-2 downto 0) => signal_id,
            x(n-1) => '0'
        );
end architecture;

El bit completo analiza y some_entity_tb elabora y ejecuta (sin hacer nada útil que no sea probar la conectividad).

En VHDL (incl. -93) tiene la capacidad de asociar elementos (miembros) de un puerto de matriz formal por separado.

IEEE Std 1076-1993 4.3.2.2 Listas de asociación, párrafo 14:

  

Un formal puede ser un objeto de interfaz declarado explícitamente o un miembro (consulte la Sección 3) de dicho objeto de interfaz. En el primer caso, se dice que tal formal está asociado en su totalidad. En los últimos casos, la asociación nombrada debe usarse para asociar lo formal y lo real; los subelementos de tal formal se dice que están asociados individualmente. Además, cada subelemento escalar del objeto de interfaz declarado explícitamente debe asociarse exactamente una vez con un real (o subelemento del mismo) en la misma lista de asociaciones, y todas las asociaciones deben aparecer en una secuencia contigua dentro de esa lista de asociaciones. Cada elemento de asociación que asocia una porción o un subelemento (o una porción del mismo) de un objeto de interfaz debe identificar lo formal con un nombre estático local.

Y para explicar dónde está el mensaje de error:

ncvhdl_p: *E,ILSGRD (test.vhd,159|32): illegal reference of a signal (SIGNAL_ID) during static elaboration [12.3].

vino de:

IEEE Std 1076-1993, 12.3 Elaboración de una parte declarativa, párrafo 3:

  

En ciertos casos, la elaboración de un elemento declarativo implica la evaluación de las expresiones que aparecen dentro del elemento declarativo. El valor de cualquier objeto denotado por un primario en dicha expresión debe definirse en el momento en que se lee el primario (ver 4.3.2). Además, si un primario en dicha expresión es una llamada de función, entonces el valor de cualquier objeto denotado por o que aparece como parte de un designador real en la llamada de función debe definirse en el momento en que se evalúa la expresión.

Le dice que no puede asignar una expresión como real a una formal a menos que se conozca el valor del objeto signal_id en el momento de la elaboración y no se conozca el valor de una señal hasta después de la elaboración:

  

NOTA: es una consecuencia de esta regla que no se puede hacer referencia al nombre de una señal declarada dentro de un bloque en expresiones que aparecen en elementos declarativos dentro de ese bloque, un bloque interno o una declaración de proceso; ni se puede pasar como un parámetro a una función llamada durante la elaboración del bloque. Estas restricciones existen porque el valor de una señal no se define hasta después de que se elabora la jerarquía de diseño. Sin embargo, se puede usar un nombre de parámetro de señal dentro de expresiones en elementos declarativos dentro de una parte declarativa de subprograma, siempre que el subprograma solo se llame después de que comience la simulación, porque el valor de cada señal se definirá para ese momento.

    
respondido por el user8352

Lea otras preguntas en las etiquetas