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.... :( :)

No hay comentarios:

Publicar un comentario