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.