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

domingo, 15 de agosto de 2010

Imprimiendo mensajes con Assert/Report

A partir de VHDL'93 report se puede usar como una instrucción sola (sin assert) para imprimir objetos del tipo string. Así por ejemplo se puede reportar el comienzo de un test del siguiente modo:

report "--- Comienzo del Test ---";

Esto es similar, pero no equivalente, a escribir:

1 assert FALSE
2    report
 "--- Comienzo del Test ---";

En primer lugar report es una instrucción secuencial. Por lo que debería ser usada dentro de un proceso. Por defecto el nivel de severidad de report es NOTE. Por otro lado, assert puede ser una instrucción concurrente o secuencial. En el caso de ser usada como concurrente es equivalente a ser usada en un proceso con una instrucción wait al final del mismo (no lista sensitiva). Este proceso se ejecutará solo una vez durante el comienzo de la simulación y esperará indefinidamente en el wait. El nivel de severidad por defecto para assert es ERROR.
Los strings que se imprimen usando report se pueden leer en la ventana de transcript del simulador. Por ejemplo para ModelSim es la ventana que ocupa la parte inferior del simulador.
Ahora bien, tal como lo especifica el IEEE estandard 1076-1993, LRM §8.3, report solo puede imprimir objetos tipo STRING. Por lo que es muy util y bonito a la hora de imprimir mensajes, pero bastante 'inútil' para otro tipo de objetos. Por ejemplo para imprimir un std_logic_vector.
Recordemos que un 'string' de std_logic_vector (algunas veces llamado bit string) NO es lo mismo que un objeto tipo string. Por ejemplo: 

1 signal slv: std_logic_vector(7 downto 0) := "01010101";
2 signal str: std_logic_vector(7 downto 0) := "01010101";

Para estos dos objetos el compilador sabe que son diferentes tipos, pues fueron declarados diferentes, aun cuando ambos valores parecen similares. Cada uno de estos arreglos tienen diferente tipos de elementos. Tipo string es un arreglo de character, mientras std_logic_vector as un arrreglo de std_logic. Tal como se detalla en sus declaraciones:
 
1 type std_logic_vector is array (natural range <  >) of std_logic;
2 type string is array (positive range <  >) of character;

Ya que
report solo puede imprimir strings, para imprimir otro tipo de objeto es necesaria la conversión a string. El atributo pre-definido IMAGE (LRM §14.1) convierte cualquier tipo o sub-tipo escalar a string. Así:

1 report integer'image(cuenta);

Imprime el valor del entero cuenta. Mientras que:


1 report std_logic'image(flag);


imprimirá el valor de flag del tipo std_logic.


A veces se desea imprimir no solo el valor del objeto, sino tambien el nombre del mismo. Para ello se usa el operador concatenación & (ampersand):

1 process
2    begin
3      if (cuenta = max_cuenta) then -- max_cuenta = 16
4        report "El valor del contador es: " & integer'image(cuenta);
5      end if;
6      wait;
7 end process;

En el simulador se vería el siguiente mensaje:

1 # ** Note:  El valor del contador es: 16
2 #    Time: 20 ns  Iteration: 3  Instance: /tb_test

Tal como se ha explicado anteriormente 'image solo convierte tipo o sub-tipos escalares a tipo string. De modo que si por ejemplo se desea imprimir un objeto tipo std_logic_vector, o un array no es posible hacerlo usando el atributo 'image. En estos casos es necesario escribir una función que convierta por ejemplo de std_logic_vector a string. En realidad haciendo una búsqueda en google se pueden encontrar estas funciones de conversión. Por ejemplo usando una función conversión a string de std_logic_vector llamada slv2string, la instrucción report quedaría escrita de la siguiente forma:

1 report "El vector direccion de memoria es: " & slv2string(address);

Bueno, bueno.......


Esto es todo por hoy.... en realidad escribí mucho y no es lo mejor... :) , más aún siendo Domingo.... :( :)

viernes, 6 de agosto de 2010

Hay solución para el 'feo' text editor del ISE... menos mal :) ..!

A quién le gusta el editor de VHDL/Verilog que viene con el ISE? ? ?  Por suerte lo puedes cambiar y usar el editor de tu preferencia. En este link encontrarás como hacerlo, eso sí, fíjate bien cual línea de comando debes usar dependiendo del editor...


http://www.xilinx.com/support/answers/13713.htm