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.