He estado pensando en las funciones en VHDL. Si tenemos una función podríamos tener tanto una función donde pasamos un "genérico" (es decir, un parámetro fijo conocido en tiempo de compilación) como una variable/señal (cuyo contenido se conoce en tiempo de "ejecución").
Así que lo que estaba considerando era si en una función pasamos como entrada un "parámetro genérico" y sólo dicho parámetro significa que básicamente dicha función es una expresión cuyo resultado es determinista, de lo contrario porque la entrada podría variar en cualquier momento.
¿Cómo afecta esta situación a una síntesis? ¿Sintetizaría el compilador un registro con el resultado de la evaluación de la expresión? o ¿intentaría sintetizar también alguna lógica extra?
Como ejemplo 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 se hace 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 tiempo de ejecución, sino que x
(como estímulo) podría cambiar en cualquier momento. Así que 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?
Espero que ahora esté mejor.