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...