Funciones de VHDL con genérica o "variable de tiempo de ejecución", problemas de síntesis

4

He estado pensando acerca de las funciones en VHDL. Si tenemos una función, podríamos tener una función donde pasamos un "genérico" (es decir, un parámetro fijo conocido en el momento de la compilación) y una variable / señal (cuyo contenido se conoce en el momento de la "ejecución").

Entonces, lo que estaba considerando era ... si en una función pasamos como entrada un "parámetro genérico" y solo ese parámetro significa que básicamente esa función es una expresión cuyo resultado es determinista, de lo contrario porque la entrada podría variar en cualquier momento.

¿Cómo tal situación afecta una síntesis? ¿Sintetizaría el compilador un registro con el resultado de la evaluación de la expresión? ¿O trataría de sintetizar alguna lógica adicional también?

Como instancia, supongamos que tenemos una entidad (habrá algún error de sintaxis a propósito)

entity ent
 generic(n : unsigned);
 port(x : in unsigned; ...);
end entity;

architecture arch of ent is
  function my_f(i : unsigned) return unsigned is
    variable k : unsigned;
  begin
    -- something
    return k;
  end function;
begin
  --body
  -- end body
end architecture arch;

¿Cuál es la diferencia (en términos de síntesis si la hay) si hago una llamada como

y <= my_f(n); -- i'm using a generic

en lugar de

y <= my_f(x); -- i'm using the input

El parámetro n no cambiaría en el tiempo de ejecución, en cambio, x (como estímulo) podría cambiar en cualquier momento. Entonces, ¿la herramienta de síntesis sintetizaría toda la lógica necesaria para manipular n en el primer caso? ¿O sería inteligente y simplemente evaluaría la función y sustituiría el resultado en una posible asignación?

Esperando que sea mejor ahora.

    
pregunta user8469759

1 respuesta

5

Las herramientas de síntesis trabajan muy duro para evaluar todo lo posible en el momento de la compilación. Para todo lo demás, sintetizan la lógica, incluidas las llamadas a funciones, asumiendo que la función es sintetizable (otras no).

Por lo tanto, la respuesta a tu pregunta es, "depende". No importa si el parámetro real de la función es un genérico o una señal (puerto): si el valor se conoce en el momento de la compilación, la herramienta de síntesis evaluará la función en el momento de la compilación y usará el resultado. La única diferencia es que un genérico se conoce por definición en el momento de la compilación, mientras que una señal puede o no serlo.

Si la función debe evaluarse en tiempo de ejecución, la herramienta de síntesis generará la lógica necesaria para hacerlo, suponiendo que no se hayan utilizado construcciones no sintetizables en el cuerpo de la función.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas