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

miércoles, 21 de agosto de 2013

Como 'ver' los 'delta delay' en ModelSim

Introducción 

Para algunas personas el concepto de delta delay en HDLs es uno de los mas difíciles de 'digerir' (entender). No es el objetivo de este articulo escribir acerca del concepto de 'delta delay' y sus derivados .... (hay demasiada literatura al respecto), lo que SI quiero hacerles llegar es que ModelSim tiene herramientas disponibles de modo que de manera sencilla se puede 'ver' el delta delay en forma gráfica o tabular. 

Como 'ver' los delta delays en ModelSim

Explicaré los pocos pasos necesarios a seguir para saber y ver cuantos delta times suceden hasta que una señal obtiene un valor estable. 
Primero, les detallo el simple código VHDL a usar para la demostración.

 1 library ieee;
 2 use eee.std_logic_1164.all;
 3
 4 entity aoi is
 5 port(A, B, C, D: in std_logic;
 6      E         : out std_logic);
 7 end aoi;
 8
 9 architecture beha4 of aoi is
10 signal O1, O2, O3:std_logic;
11
12 begin
13 b4: process(A, B, C, D, O1, O2, O3)
14  begin
15   E  <= not O3;
16   O1 <= A and B;  
17   O2 <= C and D;  
18   O3 <= O1 or O2;
19 end process b4;
20 end dflow1;

A continuación el simple test bench usado. 

 1 library ieee;
 2 use eee.std_logic_1164.all;
 3
 4 entity aoi_tb is
 5 end aoi_tb;
 6
 7 architecture test of aoi_tb is
 8 signal O1, O2, O3   : std_logic;
 9 signal a, b, c, d, e: std_logic;
10 component  aoi is
11   port(A, B, C, D: in std_logic; E: out std_logic);
12 end component;
13
14 begin
15    a <= '0', '1' after 6 ns;
16    b <= '0', '1' after 5 ns, '0' after 8 ns;
17    c <= '0', '1' after 7 ns;
18    d <= '0';
19
20 uut: aoi  port map(
21   E => e, a => a ,b => b ,c => c, d => d
22   );
23 end test;
24

Bien, entonces una vez que ejecutas el test bench en el entorno ModelSim se abre la ventana 'Wave', que muestra la forma de ondas de las senales del modulo que se esta simulando. Un punto a considerar es que normalmente por defecto se muestran solo por puertos de Entrada y Salida del modulo, por lo que hará falta agregar las señales internas necesarias a la ventana 'Wave' para poder ver los delta delay respectivos. 
Despues de ejecutar el test bench del ejemplo descrito la ventana Wave que se obtiene es la siguiente



Entonces, supongamos que queremos saber los delta delay asociados al evento en la senal 'B' al tiempo 8 ns. Los pasos a seguir son los siguientes: 
1- Colocar (sumar) un cursor en el tiempo de simulacion 8 ns. 
2- Hace click en el boton "Expanded Time Delta Mode"



3- Hace click en el boton "Expand Time At Active Cursor"



4- Click en "Zoom In At Active Cursor"




5- LiStO !

La siguiente figure resume los pasos detallados arriba  y muestra el resultado obtenido. 


< br/> Otro modo de Ver los Delta Delay

ModelSim ofrece tambien una especie de tabla, llamada en realidad 'List', donde detalla las senales, sus eventos y los respectivos delta delays. Para acceder a la misma hacer 'View->List'. De ese modo se obtiene una table similar a la siguiente.




Finalmente

Si alguna vez tuviste problemas para entender los delta delay, y como realmente 'funcionan', esta herramienta te ayuda mucho a poder dilucidad ese dilema... 

Hasta la próxima.....

martes, 14 de mayo de 2013

ModelSim-Quartus: "Failed to find INSTANCE '/NA'"

Introducción

Como bien es sabido los mensajes de error dados por la herramientas que comúnmente usamos son bastantes encriptados, y por ende no fácil de darnos cuenta cual es el origen del mismo. Uno de estos casos es este mensaje generado por ModelSim cuando tratamos de ejecutar una 'gate level simulation", ya sea automáticamente desde Quartus o desde el mismo ModelSim:



Veremos en esta entrada del blog como se soluciona este error. 


Descripción


La simulación a nivel de compuertas, gate level simulation (también conocida como post-place and route simulation) es un paso importante para asegurarnos que el sistema implementado en el FPGA cumple satisfactoriamente los requerimientos de tiempo después de colocar (place) y rutear (route) la logica de nuestro sistema en el FPGA. Para ejecutar la simulación a nivel de compuertas, es necesario generar un archivo de simulación (netlist) con todos los retardos (logics y de ruteo) y simular el sistema con ese archivo (netlist).
Quartus tiene una manera de configurar la simulación a ejecutar de un modo bastante detallado. Para la simulación a nivel RTL el procedimiento fue explicado en este blog anteriormente.  
Para ejecutar la simulación a nivel de compuerta (gate level simulation) Quartus genera a partir del .vhd a simular y de la información provista por la herramienta de place & route (especialmente con los retardos, delays, incorporados) un archivo con extensión .sdo, (standard delay output,  usualmente llamado standard delay format, .sdf), que contiene toda la información de los delays lógicos y de ruteo, y un archivo .vho, que contiene toda la información del conexionado del sistema a implementar en el FPGA. Ambos archivos contienen todo lo necesario para llevar a cabo la simulación a nivel de compuerta. Para los que les interese pueden abrir los archivos generados en el directorio: 

.../tu_proyecto/simulation/modelsim/nombre_top_entity_.vho
.../tu_proyecto/simulation/modelsim/nombre_top_entity_.sdo

Pasos a Seguir

Si has intentado correr la simulación a nivel de compuertas es porque ya tienes el respectivo test bench escrito. Solo falta decirle a Quartus por medio de lo Altera llama NativeLink que el dispositivo bajo test esta identificado con el nombre de la instancia en el test becnh. 
Para configurar el proceso de correr automáticamente en ModelSim la simulación a nivel de compuertas llevá a cabo los siguientes pasos. 
1- Ir a Assignments -> Settings
2- La ventana de 'Settings' se abrirá. Seleccioná 'Simulation'.
3- Dentro de la ventana de 'Simulation', hace click en el cuadrado de 'Run gate-level simulation automatically after compilation'. 
La siguiente figura muestra los pasos 2 y 3. 



4- En la misma ventana 'Simulation', y en la parte inferior done dice 'Compile test bench', simple click en 'Test Bench'. 
5- La ventana 'Test Benches' se abrirá. Simple click en 'Edit'.



6- Ahora deberá aparecer la ventana titulada 'Edit Test Bench Settings'; mostrando el nombre del test bench que será usado en la simulación. En esta ventana seleccione 'Use test bench to perform VHDL timing simulation'. Y en la parte donde dice 'Design instance name in test bench' debes escribir el nombre de la instancia del componente en el test bench. Por ejemplo en el test bench tengo la siguiente instrucción de instanciación de componente: 



En el caso que estoy detallando, yo use U1 como nombre de la instancia. 
Hay que ser muy cuidadoso de verificar cual es el nombre de la instancia y escribirlo en "Design instance name in test bench". 


7- Click Ok. y cerrar cualquier otra ventana que haya quedado abierta. 
8- Ya puedes efectuar una simulación a nivel de compuertas usando


Nota 1: por favor acordate después de ejecutar una simulación a nivel de compuertas de borrar el archivo vsim.wlf generado por ModelSim, porque es inmensamente grande.
Nota 2: agradezco la inquietud de mis alumnos Mario Ruiz, y Germán González en este post. 
Nota 3: como podrán ver en el calendario me borre por unos meses.... bueno.. anduve haciendo otros trabajos no tan lindos como codificar en VHDL e implementar en FPGA..... así es q estoy muy contento de poder volver a mi temática favorita!!

sábado, 2 de febrero de 2013

Especificando el 'timescale' en Verilog

Introduccion

después de algunos pedidos, empezaré también a escribir blogs con respecto al otro HDL, Verilog. En este caso en particular detallo el uso de la directiva de compilación (compiler directive) "timescale". 

Detalles

La directiva 'timescale' especifica la unidad de tiempo y precisión ha ser usada por la herramienta de simulación. 
La sintaxis es la siguiente: 

'timescale time_units / precision_units

Donde "time_units" es un valor que declara la unidad de tiempo de los retardos en el módulo en el que se especifica este valor. Mientras que "precision_units" es un valor que declara la precisión de la unidad de tiempo ha ser usada por el simulador cuando simule el módulo en el que se especifica este valor. Como regla práctica trate de usar como valor de la precisión un valor cercano al valor de la unidad de tiempo. Ambos valores deben ser números enteros (1, 10, 100), y son seguidos por un string que representa la unidad de tiempo (s, ms, us, ns, ps, fs). 

Reglas: 


  • se deben usar valores de 1, 10, 100 para la unidad de tiempo y para la precisión.
  • puede usar 's' para segundos, 'ms' para milisegundos, 'us' para microsegundos, 'ns' para nanosegundos, 'ps' para picosegundos y 'fs' para fentosegundos, para ambos, la unidad de tiempo y la de precisión.
  • la unidad de tiempo debe ser por lo menos tan grande como la unidad de precisión
  • no existe un valor de 'timescale' por defecto; pero los simuladores pueden asignar uno por defecto.
  • para mantener consistencia de los valores de 'timescale', se debe usar una directiva de timescale para TODOS los módulos del diseño.

Esta directiva se escribe fuera de la definición del módulo.

IMPORTANTE: Se debe tener cuidado de que no exista una gran diferencia entre el valor de la unidad de tiempo y el valor de la unidad de precisión  ya el tiempo de simulacion avanza en incrementos de la unidad de precisión. Así  por ejemplo, si escribimos

`timescale 1ns/100ps

el simulador hará 10 pasos para avanzar 1 ns de tiempo de simulación. Si, escribimos

`timescale 1ns/1ps

el simulador hará 1000 pasos para avanzar 1 ns de tiempo de simulación. 
Otro ejemplo: 

`timescale 1ns/10ps
module1 (. . .);
  not #1.23 (. . .) // 1.23ns (12300 simulation time units)
  . . .
endmodule


Use valores de precisión que no sobrecarguen la tarea del simulador. Valores demasiados pequeños  incrementarán sin sentido el tiempo de simulación y el uso de memoria. Un valor práctico es el siguiente: 

`timescale 1ns/1ns


En caso de proyectos con múltiples módulos  el valor de 'timescale' es pasado a todos los módulos que no tienen definido el 'timescale' y que son sub-módulos del mismo. El simulador usualmente da un 'warning' para los módulos que no tienen definido el valor (los valores de 'timescale').

Finalmente un figura es mejor que mil palabras....




Primer blog de Verilog..... !!! pero, por supuesto no el último :) !! 

lunes, 10 de diciembre de 2012

Personalizando el uso de ISim

Introducción


El simulador ISim puede fácilmente ser personalizado a fin de facilitar las tareas de visualización y depuración del diseño bajo test.

Procedimiento


Ejecutar el test bench como normalmente lo ejecuta.
Modifique las señales mostradas en el visualizador de formas de ondas de acuerdo a lo que necesite. Algunas de las opciones que brinda ISim son las siguientes:
  • Mover las señales a fin de juntarlas por funcionalidad. Seleccione la señal a ser movida con un simple click sobre la señal, luego mantenga el botón izquierdo de mouse apretado y arrastre la señal hacia arriba o hacia abajo.
  • Cambiar de color de la forma de onda. ISim ofrece la opción de cambio de color de la forma de onda de cada señal. Para ello simple click en la señal a cambiar el color, para seleccionarla, y luego presione botón derecho, y seleccione Signal Color, y luego el color que quiera usar para esa señal en particular. Este cambio de color es muy útil para señales que en cierto modo son de referencia para otras señales, pudiendo ser identificadas fácilmente en el conjunto de todas las señales.
  • Inserción de divisor de grupo de señales. Una vez realizado el paso 1, es conveniente colocar un titulo que de alguna idea de la funcionalidad de las señales. Para ello coloque el icono del mouse donde desea colocar el titulo del grupo de señales, presione botón derecho del mouse, y seleccione New Divider, y escriba el titulo correspondiente. Puede colocar tantos divisores como necesite.
  • Cambio de número relacionado a buses. Por cada bus se puede  seleccionar distinta representación del número correspondiente. Por ejemplo, se puede seleccionar Hexadecimal, Decimal, etc.
  • New Virtual Bus, permite juntar señales y formar un bus que solo es válido en la simulación.

Una vez realizados todos los cambios que desee, grabe esa configuración haciendo File->Save as. Escriba el nombre correspondiente, y se le agrega la extensión .wcfg.
Ahora bien, para usar esa configuración cada vez que se invoque el simulador debe hacerle saber al simulador que use esa configuración ya grabada en vez de la que usa por defecto. Seleccione Simulate Behavioral Model, y luego presionando botón derecho seleccione Process Properties. Tal como se ve en Figura 1.




Figura 1 - Acceso a las opciones del simulador

Una vez abierta la ventana de propiedades del ISim, haga clikc en la opción Use Custom Waveform Configuration File, y luego en la opción Custom Waveform Configuration File, navegue para agregar el archivo grabado en el paso anterior, tal como se puede observar en Figura 2.

Figura 2 - Configuración del simulador para usar la plantilla creada

A partir de ahora cada vez que se invoque ISim, se abrirá con la configuración grabada. 

Útil? te sirve de algo este blog? Avisame !!!  :)