supongo que si tengo dos declaraciones de señales de la siguiente manera
signal x:std_logic_vector(1 downto 0) := (others => '0');
signal y:std_logic_vector(1 downto 0);
¿significa que x es estática y y no es estática?
No. Los valores determinados al evaluar señales en expresiones no son estáticos.
La diferencia entre las declaraciones de x
y y
es que x
tiene una expresión de valor por defecto que es diferente de y
. Ambos tienen valores predeterminados, el valor para x
lo proporciona una expresión agregada estática local que depende del rango estático localmente de x
a través de others
y el valor estático local del literal de enumeración '0'
.
De IEEE Std 1076-2008 , 9 Expresiones , 9.1 General :
Una expresión es una fórmula que define el cálculo de un valor.
De 9.4 Expresiones estáticas :
Se dice que ciertas expresiones son estáticas. De manera similar, se dice que ciertos rangos discretos son estáticos, y se dice que las marcas de tipo de ciertos subtipos denotan subtipos estáticos.
Hay dos categorías de expresiones estáticas. Ciertas formas de expresión pueden evaluarse durante el análisis de la unidad de diseño en la que aparecen; se dice que tal expresión es localmente estática. Ciertas formas de expresión pueden evaluarse tan pronto como se elabore la jerarquía de diseño en la que aparecen; se dice que tal expresión es globalmente estática.
Las expresiones encontradas en las dos declaraciones de señales son localmente estáticas, derivadas de literales ( 0
, 1
y '0'
), 0
y 1
que especifican rangos estáticos locales, en x
la opción others
en la expresión agregada para su valor predeterminado, para cada elemento en el rango de índice para x
, se proporciona un '0'
como valor predeterminado.
¿También una llamada a la función vhdl cae en la categoría de una expresión no estática?
Ver 4. Subprogramas y paquetes , 4.1 General , párrafo 2:
Hay dos formas de subprogramas: procedimientos y funciones. Una llamada de procedimiento es una declaración; una llamada de función es una expresión y devuelve un valor. Ciertas funciones, designadas funciones puras, devuelven el mismo valor cada vez que se llaman con los mismos valores que los parámetros reales; el resto, las funciones impuras, pueden devolver un valor diferente cada vez que se llaman, incluso cuando varias llamadas tienen los mismos valores de parámetros reales. ...
Así que una llamada de función es una expresión. Una expresión puede ser localmente estática o globalmente estática:
9.4.2 Primarias localmente estáticas
Se dice que una expresión es localmente estática si y solo si cada operador en la expresión denota un operador definido implícitamente o un operador definido en uno de los paquetes STD_LOGIC_1164, NUMERIC_BIT, NUMERIC_STD, NUMERIC_BIT_UNSIGNED, o NUMERIC_STD_UNSIGNED en la biblioteca IEEE cada primario en la expresión es un primario estático localmente, donde un primario estático localmente se define como uno de los siguientes:
...
e) Una llamada de función cuyo nombre de función denota una operación definida implícitamente o una operación definida
en uno de los paquetes STD_LOGIC_1164, NUMERIC_BIT, NUMERIC_STD, NUMERIC_BIT_UNSIGNED, o NUMERIC_STD_UNSIGNED en la biblioteca IEEE y cuyos parámetros reales son cada uno expresiones locales estáticas
...
9.4.3 Primarias globalmente estáticas
Se dice que una expresión es globalmente estática si y solo si cada operador en la expresión denota una función pura y cada primario en la expresión es un primario globalmente estático, donde un primario globalmente estático es un primario que, si denota un objeto o una función, no denota una entidad nombrada elaborada dinámicamente (ver 14.6) y es uno de los siguientes:
...
i) Una llamada de función cuyo nombre de función denota una función pura y cuyos parámetros reales son cada una de ellas expresiones globalmente estáticas
...
Esencialmente, los parámetros para una llamada de función deben ser localmente estáticos o globalmente estáticos y la función debe ser una función pura para que la expresión determinada por una llamada de función sea estática. (Todos los operadores predefinidos para tipos predefinidos son puros).
Si estos requisitos no se cumplen, la expresión de llamada de función no es estática. Un ejemplo sencillo sería un parámetro que sea una variable o una señal, que requieren una evaluación durante la ejecución.