VHDL: declaración de una matriz vacía (en un banco de pruebas)

2

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)?

    
pregunta georgjz

1 respuesta

5

No necesitas declarar int_set , usa integer_vector en su lugar. Puede usar 'length para probar una matriz vacía .

Una matriz vacía se denomina matriz nula , porque tiene un rango nulo . Se puede construir un rango nulo y, por lo tanto, una matriz nula utilizando, por ejemplo, %código%. Alternativamente, se puede usar una dirección ascendente ( 0 downto 1 ).

  

5.2.1 General
  [...]
  Un rango especifica un subconjunto de valores de un tipo escalar. Se dice que un rango es un rango nulo si el subconjunto especificado está vacío.

     

El rango de L a R se llama rango ascendente; si L > R, entonces el rango es un rango nulo . El rango de L a R se llama rango descendente; si L < R, entonces el rango es un rango nulo . L se llama el límite izquierdo del rango, y R se llama el límite derecho del rango. El límite inferior de un rango es el límite izquierdo si el rango es ascendente o el límite derecho si el rango es descendente. El límite superior de un rango es el límite derecho si el rango es ascendente o el límite izquierdo si el rango es descendente. Se dice que el valor V pertenece al rango si las relaciones (límite inferior < = V) y (V < = límite superior) son ambas verdaderas. Los operadores & gt ;, < y < = en las definiciones anteriores son los operadores predefinidos del tipo escalar aplicable.
  [...]

     

5.3.2.2 Restricciones de índice y rangos discretos
  [...]
  Una restricción de matriz de la primera forma es compatible con el tipo si, y solo si, la restricción definida por cada rango discreto es compatible con el subtipo de índice correspondiente y la restricción del elemento de matriz, si está presente, es compatible con el subtipo de elemento del tipo . Si alguno de los rangos discretos define un rango nulo, cualquier matriz así restringida es una matriz nula , sin elementos. Un valor de matriz satisface una restricción de índice si, en cada posición de índice, el valor de matriz y la restricción de índice tienen el mismo rango de índice. (Sin embargo, tenga en cuenta que la asignación y algunas otras operaciones en arreglos implican una conversión implícita de subtipo).   [...]

     

8.5 Nombres de segmentos
  [...]
  Los límites del rango discreto definen los de la división y serán del tipo del índice de la matriz. La división es una división nula si el rango discreto es un rango nulo. Es un error si la dirección del rango discreto no es la misma que la del rango de índice de la matriz denotada por el prefijo del nombre del segmento.

     

Para la evaluación de un nombre que es un sector, se evalúan el prefijo y el rango discreto. Es un error si alguno de los límites del rango discreto no pertenece al rango de índice de la matriz de prefijo, a menos que   slice es una división nula. (Los límites de un sector nulo no tienen por qué pertenecer al subtipo del índice.)
  [...]

Dicha matriz nula se puede inicializar / asignar con 1 to 0 .

Ejemplo para su vector entero:

constant Empty : integer_vector(0 downto 1) := (others => 0);

Por cierto: VHDL ya define una función 'máximo' que calcula el mayor entero en una matriz.

    
respondido por el Paebbels

Lea otras preguntas en las etiquetas