La pregunta es bastante simple: ¿es posible declarar una matriz vacía en VHDL?
Aquí está mi problema: estoy tratando de escribir un módulo (para un ejercicio en el libro de Peter Ashenden), que encontrará el mayor entero en una matriz de enteros sin restricciones y detectará matrices vacías :
type int_set is array(integer range <>) of integer;
Mi módulo se ve así:
entity maximum is
port ( vector_in : in int_set;
data_out : out integer;
valid_in : out std_ulogic ); -- will be false, when vector_in is empty
end entity maximum;
-- behavioral body
architecture behav of maximum is
begin
maximum_behavioral : process ( vector_in ) is
variable temp_max : integer := integer'low;
begin
-- reset temp variable
temp_max := integer'low;
-- test for empty array
if vector_in'length = 0 then
valid_in <= '0';
else
for i in vector_in'range loop
if vector_in(i) > temp_max then
temp_max := vector_in(i);
end if;
end loop;
data_out <= temp_max;
valid_in <= '1';
end if;
end process maximum_behavioral;
end architecture behav;
Ahora en mi banco de pruebas tengo varios arreglos / conjuntos para probar mi módulo:
entity int_max_tb is
end entity int_max_tb;
architecture test_int_max of int_max_tb is
signal data_in : int_set(0 to 4);
signal data_out : integer;
signal valid_in : std_ulogic;
begin
max_dut : entity work.maximum(behav)
port map ( data_in, data_out, valid_in );
stimulus : process is
-- test arrays/sets
constant set1 : int_set := (4, 5, 6, 5, 3);
constant set2 : int_set := (7, 6, 5, 10, 4);
constant set3 : int_set := (-7, -6, -5, -10, -4);
begin
data_in <= set1; wait for 10 ns;
data_in <= set2; wait for 10 ns;
data_in <= set3; wait for 10 ns;
wait;
end process stimulus;
end architecture test_int_max;
Hasta ahora, esto funciona bien y produce los resultados que espero. Pero ahora quiero probarlo contra una matriz vacía. Añadiendo algo en la línea de
constant set4 : int_set(0 to 4);
-- and later on
data_in <= set4;
obviamente no funcionará, ya que una constante debe inicializarse con algunos valores. Cambiar de constant
a variable
funcionará, pero el resultado será una matriz con cinco elementos, cada uno del valor integer'low
. De nuevo, este es el comportamiento esperado.
Específicamente, el ejercicio pregunta: ¿Cómo debe comportarse el módulo si la matriz real asociada con el puerto de entrada está vacía (es decir, de longitud cero)?
A partir de esta declaración, asumo que es posible declarar (o hacer que algo de código produzca) una matriz vacía. Pero la respuesta a esto también podría ser simplemente que un módulo no necesita detectar una matriz vacía, ya que una vez que se declara un objeto de una matriz sin restricciones, debo proporcionar restricciones que especifiquen los límites del índice de ese objeto (y asignará valores predeterminados a los elementos si no se especifica).
De esta pregunta inferiré que es posible tener matrices de longitud cero si uno usa genéricos (que no soy, hasta ahora).
En conclusión: ¿puedo declarar una matriz vacía / de longitud cero en VHDL (sin genéricos) o simplemente no es posible (lo que estoy pensando ahora mismo, tomado los argumentos de los dos párrafos justo encima de este)?