Mostrando entradas con la etiqueta metavalue. Mostrar todas las entradas
Mostrando entradas con la etiqueta metavalue. Mostrar todas las entradas

viernes, 30 de enero de 2015

"Warning: NUMERIC_STD, "=": metavalue detected, returning FALSE" en ISim de Xilinx

Introducción

Cuando puedo evito usar ISim entre otras cosas por su pobre soporte, y también por sus encriptados mensajes de Warnings y Errors. En el último proyecto que trabajé no tenía opción, y cuando iba todo bien obtuve este famoso mensaje de advertencia "Warning: NUMERIC_STD, "=": metavalue detected, returning FALSE". Y digo famoso, porque busque en la web y encontré muchas entradas pero en casí ninguna me daba una idea de que pasaba y menos aún como solucionarlo. Bueno, acá les cuento lo que esto significa y por lo menos una manera concreta de encontrar una pista de donde o porque se genera este Warning. 

Qué es "Metavalue Detected" ?

Este mensaje significa que el simulador a encontrado como resultado un valor no numérico, que puede ser por ejemplo "UUUU" o "XXXX", o algún otro valor. 
Comúnmente este resultado se da durante el proceso de inicializacion del sistema bajo test, y dependiendo del tipo de test se puede repetir  este mensaje periódicamente. A modo de ejemplo les muestro en la siguiente figura los mensajes que obtenía en mi simulación. 


Cómo encontrar el problema ?

Tal como se puede ver de la figura mostrada anteriormente no se ve nada 'raro' en la forma de onda de las distintas señales mostradas, por lo que la solución no está a 'simple vista'. 
Un modo de encontrar el origen de este mensaje, por lo menos en este caso en particular, es tratar de ver las distintas señales internas del sistema descripto en VHDL. Para ello se debe ir al panel denominado "Instance and Processes", y hacer click en la flechita que está al lado del test bench, en el caso que muestro en la figura anterior, hacer click en la flecha al lado de top_tb. Aparecerá el nombre de la instancia del componente bajo test en el test bench, en este caso le llamé 'uut'. Vuelvo hacer click en la flechita que está al lado de 'uut', y se detallan ahora los distintos sub-componentes del sistema. La siguiente figura detalla lo explicado. 


El siguiente paso es seleccionar cada sub-componente e ir agregando las distintas señales del mismo a la ventana de formas de ondas (Wave Window). Para ello se selecciona el sub-componente, al hacer simple click sobre el nombre del mismo y luego en el panel 'Objects' aparecen las señales de E/S y las señales internas, Se seleccionan todas las señales, porque no sabemos cual es la que funciona incorrectamente, y se agregan a la Wave Window. En la siguiente figura se detallan los pasos explicados. 


En el caso detallado en la figura de arriba, agrego todas la señales del sub-componente cont_4bits_1 a la Wave Window. Puedo también agregar las señales de los otros componentes, freq_div_1 y bcd_7seg_1, Pero dio la casualidad que al agregar estas señales encontré parte del problema, cómo?... pues, una vez agregadas las señales del sub-componente, ejecuto la simulación nuevamente y inmediatamente visualizo algo que me llamó la atención,.... qué fé? .. pues descubranlo Uds. mismos en la siguiente figura: 


Que ven de raro???? .......

Si, que las dos ultimas señales, count e i_count, no están definidas ('U' = undefined).... Encontramos algo !.... 

Posibles Soluciones

Ahora bien llegado a este punto, los pasos a seguir son dos: 
1) revisar el VHDL/Verilog del sub-componente cont_4bits_1, y verificar sobre todo la inicialización de los vectores count e i_count.  
2) revisar el test bench y verificar el valor dado a la señal que inicializa el sistema, comúnmente llamada reset. En alguno de los dos lados esta el origen del Warning, y la solución al alcance de la mano..... ! ... (en mi caso en particular no tenía bien definido el reset en el test bench.... ) ....

Finalmente una nota para quienes usen ModelSim, van a leer en varios foros que ModelSim tiene una opción para que este tipo de Warnings (basados en 'metavalues') sean ignorados, por supuesto que no comparto esa opinión, por que siempre es bueno saber el origen del Warning, en mi caso en particular si hubiera usado ModelSim y hubiera usado la opción de ignorar esos Warning, nunca hubiese encontrado el problema que encontré con el reset. . . 

Bueno, espero que les sea útil... avisen si es así !

Hasta pronto...

sábado, 28 de agosto de 2010

Warning: NUMERIC_STD.TO_INTEGER: metavalue detected, returning 0

Este es un mensaje que dependiendo en que tiempo de la simulación ocurra puede ser grave o no.
Veamos...
Primero, normalmente este mensaje significa que la función to_integer recibe un 'metavalue' del vector que le pasa el número (vector) binario a convertir a entero. 'metavalue' significa otro valor que no es '1' ni '0', por ejemplo puede ser 'X', 'U'.
La función to_integer comúnmente se usa en contadores o para leer o escribir en memoria. Por ejemplo la lectura de un data de una memoria se puede describir del siguiente modo:


  data_from_mem <= data_mem(to_integer(unsigned(address));


Este mensaje de Warning es común durante la primer parte de la simulación, llamada inicialización. Durante este tiempo los valores 'X' tardan un cierto tiempo (dependiendo del caso, pero aproximadamente entre 10-15 ns) en propagarse y obtener un valor lógico '0' o '1' estable. Por lo que durante este tiempo le están llegando los 'X' a la función to_integer, que no sabe que hacer con ellos y lo avisa con el Warning.


Cuidado ! ... Sin embargo, si este Warning aparece después del periodo de inicialización, es decir todas las señales de3 sistema ya tienen un valor logico '0' o '1' estable, lo mas probable es que sea realmente un bug en el diseño . . . -> a encontrar el problema.... :)


Finalmente, si te molesta el Warning.... se puede desactivarlo y de este modo hacer que no aparezca el mensaje del problema encontrado durante la conversión de la función to_integer. Para ello el famoso archivo modelsim.ini tiene una variable llamada NumerisStdNoWarnings. Seteando esta variable en '1' hace que los Warning relacionados con funciones y procedimientos del paquete numeric_std sean obviados.
Por ejemplo la siguientes líneas puedes encontrarlas en el modelsim.ini:

; Turn off warnings from the IEEE numeric_std and numeric_bit packages.
; NumericStdNoWarnings = 1

El ';' significa un comentario. Entonces, como se puede ver, por defecto la variable para evitar los Warnings, NumeriStdWarnings, no está activada ('1'). Para deshabilitar los Warnings solo deberías borrar el ';' que antecede a la variable.
Otra vez Cuidado! . . . porque puede ser que desactives el mensaje de Warning, te olvides y en otro diseño que a lo mejor realmente tienes problemas puede que queden ocultos por haber desactivado los Warnings. Para estos casos otra opción es tener un modelsim.ini por proyecto, pero ese ya es otro tema...


Si quieres jugar con el archivo modelsim.ini lo puedes encontrar en los siguientes directorios:
Entorno ISE:
..\Modeltech_XE_Starter
Entorno Libero:
..\Libero_vx.x\Model
Entorno Diammond:
?? (alguien lo tiene? pasemelo pls...)
Entorno Quartus:
??

Hasta la próxima...