¿Por qué la declaración de la función VHDL no acepta límites para el tipo de retorno, por ejemplo? std_logic_vector?

3

Sé que en VHDL cada llamada de función se crea como un circuito combinacional separado. Estoy escribiendo una función que toma un valor de 4 bits y devuelve un valor de 7 bits de una tabla de consulta. La declaración en el encabezado del paquete se ve así:

function my_function (lv: std_logic_vector (3 downto 0)) devolver std_logic_vector (6 downto 0);

El compilador está generando error. Me parece que la declaración de función no puede incluir el tamaño del vector lógico. ¿Por qué? ¿Se aplica lo mismo a los enteros en los que se da el rango del valor del entero?

    
pregunta quantum231

2 respuestas

6

Esto es principalmente para Jonathan Drolet, pero también hay una lección aquí. Tenga en cuenta que el argumento de parámetro para my_function proporciona una marca de tipo con una indicación de subtipo. Esto es válido en VHDL.

library ieee;
use ieee.std_logic_1164.all;

entity myfunc is
end entity;

architecture foo of myfunc is
    function my_function(lv: std_logic_vector(3 downto 0)) 
            return std_logic_vector is  
    begin 
    return lv & "000";
    end function;

    constant fumble:  std_logic_vector (3 downto 0) := x"E";
    signal humble:    std_logic_vector (6 downto 0);
begin
    humble <= my_function(fumble);

end architecture;

Este código analiza, elabora y simula.

Tenga en cuenta que la marca de retorno es un subtipo sin restricciones y el valor del resultado se asigna a una señal declarada con una indicación de subtipo (que proporciona una restricción de índice).

Existen reglas específicas para determinar el valor efectivo de una señal que requiere que se comprueben los límites después de una conversión implícita de subtipo. Proporcionar un valor de retorno que no coincida con los límites de humble daría lugar a un error de tiempo de ejecución que hace que la simulación finalice sin completarse con éxito.

En otras palabras, una restricción no es necesaria aquí. La indicación de subtipo de valor de retorno se deriva internamente, y como se muestra en esto desde el parámetro de entrada.

    
respondido por el user8352
3

No puedo decirte por qué, pero puedo decirte que esto es correcto, no puedes especificar el tamaño de std_logic_vector en función.

Cree un subtipo del tamaño apropiado:

subtype my_function_input is std_logic_vector(3 downto 0);

function my_function(lv: my_function_input) return std_logic_vector;

o verifique el rango de entrada cuando ingresa la función. Algo como:

function my_function(lv : std_logic_vector) return std_logic_vector is
begin
    assert lv'high = 3 and lv'low = 0
    report "Wrong input size, my_function requires 3 downto 0."
    severity failure;
    ....

El compilador de Xilinx comprueba las aserciones en la síntesis y lo detiene si la separación es un error (y probablemente un error). Espero que otro sintetizador tenga el mismo comportamiento.

    
respondido por el Jonathan Drolet

Lea otras preguntas en las etiquetas