viernes, 7 de diciembre de 2007

Verilog


Carlos Rivera

C.I. 17008752

Carlos1783@hotmail.com

Dpto. de Electrónica UNEXPO Vice-Rectorado Puerto Ordaz.

Andres Guzman

C.I. 12337128

A_Guzman74@Hotmail.com.

Dpto. de Electrónica UNEXPO Vice-Rectorado Puerto Ordaz.




Publicado el 7 - 12 - 2007


¿Que es Verilog?

Verilog es un lenguaje de descripción de hardware (HDL, del Inglés Hardware Description Language) usado para modelar sistemas electrónicos. El lenguaje, algunas veces llamado Verilog HDL, soporta el diseño, prueba e implementación de circuitos analógicos, digitales y de señal mixta a diferentes niveles de abstracción. Cabe destacar que es lo más extensamente posible HDL usado con una comunidad de usuario más del active de 50.000 diseñadores.

¿Historia?

A finales de 1980, los diseñadores comenzaron a dejar de utilizar lenguajes de propietarios como el “n dot”, Hilo y Verilog avanzaron hacia el Standard H.D.L del departamento de defensa de los Estados Unidos conocido como el lenguaje de descripción de hardware VHSIC.

Verilog fue inventado por Phil Moorby en 1985, mientras trabajaba en Automated Integrated Design Systems, más tarde renombrada Gateway Design Automation. El objetivo de Verilog era ser un lenguaje de modelado de hardware. Gateway Design Automation fue comprada por Cadence Design Systems en 1990. Cadence ahora tiene todos los derechos sobre los simuladores lógicos de Verilog y Verilog-XL hechos por Gateway.

Como resultado, el Mercado de Verilog creció substancialmente. En 1994, el mercado de herramientas relacionadas de Verilog estaba sobre los 75.000.000 $, transformándose en el lenguaje de descripción del mercado más comercial y de mayor relevancia.

Como estándar internacional, el Mercado de Verilog continuó en crecimiento. En 1998, el mercado de los simuladores de Verilog estaba por encima de los 150.000.000 $ y continuaba dominando.

Con el incremento en el éxito de VHDL y quizás por la presión del mercado; Cadence decidió hacer el lenguaje abierto y disponible para estandarización (OVI), actualmente conocida como Accellera. Verilog fue después enviado a la IEEE que lo convirtió en el estándar IEEE 1364-1995, habitualmente referido como Verilog 95.

Cuando OVI (Open Verilog International) fue formado en 1991, un número de pequeñas compañías comenzaron a trabajar con el simulador de Verilog, incluyendo la simulación cronológica, Frontline Design Systems y otros. El primero de aquellos, llegó al mercado en 1992 y ahora son simuladores maduros de Verilog disponible desde distintas fuentes.

Varias extensiones de Verilog 95 fueron enviadas a la IEEE para cubrir las deficiencias que los usuarios habían encontrado en el estándar original de Verilog. Estas extensiones se volvieron el estándar IEEE 1364-2001 conocido como Verilog 2001.

Posteriormente el advenimiento de los lenguajes de verificación de alto nivel como OpenVera y el lenguaje E de Verisity, impulsaron el desarrollo de Superlog, por Co-Design Automation Inc. Co-Design fue más tarde comprada por Synopsis. Las bases de Superlog y Vera han sido donadas a Accellera. Todo ello ha sido transformado y actualizado en forma de SystemVerilog, que probablemente se convierta en el próximo estándar de la IEEE.

El grupo trabajador de IEEE, liberó al público el Standard revisado en Marzo del 2002 conocido como IEEE 1364-200. Esta versión tuvo muchos errores los cuales fueron revisados y corregidos en la versión del 2003, conocida en la IEEE 1364-2001 revisión C.

Subsecuentemente, un Nuevo grupo de trabajadores se formó, IEE P1800, para construir el lenguaje 1364 IEEE con la contribución adicional de Accellera. A mediados del 2004 el comité IEEE 1364 desaparece y se mantienen en los estándares tomados del grupo de trabajo IEEE 1800.

Las últimas versiones del lenguaje incluyen soporte para modelado analógico y de señal mixta. Todos estos están descritos en Verilog-AMS (http://www.verilog-ams.com).

¿Tipo de Programa y estructura?

Los diseñadores de Verilog querían un lenguaje con una sintaxis similar a la del lenguaje de programación C, de tal manera que le resultara familiar a los ingenieros y así fuera rápidamente aceptada. El lenguaje tiene un preprocesador como C, y la mayoría de palabras reservadas de control como "if", "while", etc, son similares. El mecanismo de formateo en las rutinas de impresión y en los operadores del lenguaje (y su precedencia) son también similares.

A diferencia del lenguaje C, Verilog usa Begin/End en lugar de llaves para definir un bloque de código. Por otro lado la definición de constantes en Verilog requiere la longitud de bits con su base. Verilog no tiene estructuras, apuntadores o funciones recursivas. Finalmente el concepto de tiempo, muy importante en un HDL, no se encuentra en C.

El lenguaje difiere de los lenguajes de programación convencionales, en que la ejecución de las sentencias no es estrictamente lineal. Un diseño en Verilog consiste de una jerarquía de módulos. Los módulos son definidos con conjuntos de puertos de entrada, salida y bidireccionales. Internamente un módulo contiene una lista de cables y registros. Las sentencias concurrentes y secuenciales definen el comportamiento del módulo, describiendo las relaciones entre los puertos, cables y registros. Las sentencias secuenciales son colocadas dentro de un bloque begin/end y ejecutadas en orden secuencial, pero todas las sentencias concurrentes y todos los bloques begin/end son ejecutadas en paralelo en el diseño. Un módulo puede contener una o más instancias de otro módulo para definir un sub-comportamiento.

Un subconjunto de sentencias en el lenguaje es sintetizable. Si los módulos en un diseño contienen sólo sentencias sintetizables, se puede usar software para convertir o sintetizar el diseño en una lista de nodos que describe los componentes básicos y los conectores que deben implementarse en hardware. La lista de nodos puede entonces ser transformada en una forma describiendo las celdas estándar de un circuito integrado, por ejemplo ASIC, o una cadena de bits para un dispositivo de lógica programable (PLD) como puede ser una FPGA o un CPLD.

Operadores Binarios

1. Aritméticos

El operador aparece entre las variables. Si algún bit es x el resultado es x

+ suma

- diferencia

* multiplicaci´on

/ divisi´on

% resto

2. Relacionales

Permiten comparar dos variables, retornando el valor cierto (1) o falso (0). Si algún bit es x el resultado es x

> mayor que

>= mayor o igual que

< menor que

<= menor o igual que

== igual que

!= diferente a

3. Lógicos

Aparece entre dos operadores lógicos y proporciona un valor lógico cierto (1) o falso (0).

! negado (único argumento)

&& AND lógica

jj OR lógico

4. Logica de bit

Permiten efectuar operaciones lógicas con los bits de las variables: negación bit a bit.

& AND bit a bit

j OR bit a bit

ˆ XOR bit a bit

˜& NAND bit a bit

˜j NOR bit a bit ˜ˆ o NOT XOR bit a bit

5. Lógica de reducción

Tienen un ´ unico argumento, siendo su resultado un ´ unico bit

& reducción AND

J reducción OR

ˆ reducción XOR

˜& reducción NAND

˜j reducción NOR

¿Estructuras de control?

Verilog dispone de una elevada cantidad de estructuras de control, similares a las disponibles en otros lenguajes de programación.

  • If

if ( expresión ) command1;

else command2;

Si la expresión se evalúa como cierto(1) se ejecuta command1 en caso contrario se ejecuta command2.

  • Case

case (expresión )

val1: command1;

val2: command2;

default: commandN;

endcase

Se evalúa expresión, en caso de resultar val1 se ejecuta command1, si resulta val2 se ejecuta command2. En caso de no estar reflejado el resultado se ejecuta commandN.

  • For

for( init ; cond ; rep ) command;

Inicialmente se ejecuta el comando init, ejecut´andose a continuaci´on command mientras que la condición cond resulte un valor cierto(1), al final de cada ejecución se ejecuta rep.

  • While

while(cond) command;

Mientras que la condición cond sea cierta (1), se ejecuta el comando command.

  • Repeat

repeat(Ntimes) command;

Repite el comando command tantas veces como indique Ntimes

  • Wait

wait(cond) command;

Mientras que la condición cond sea falsa (0), se ejecuta el comando command.

A menudo se emplea para detener la ejecución secuencial del proceso hasta que se verifique una condición.

¿Como diseñar con Verilog?

Los modelos de sistemas digitales que se muestran a continuación se implementaron con Verilog HDL en el orden de los siguientes pasos:

§ Identificar el problema

§ Escribir el código

§ Hacer la simulación

A modo de que este proceso de diseño se pueda explicar en forma didáctica se modelará una compuerta lógica AND de tres entradas como un ejemplo sencillo.

1. Identificar el problema

Este primer paso es imprescindible para la solución de cualquier problema en general, para el modelado de Hardware con cualquier HDL este no es la excepción. El modelo a implementar es una compuerta lógica AND de tres entradas. Primero se debe identificar las variables de entradas y salidas del sistema.

Entradas

Salidas

A,b.c

y

Tabla 1.1. Entradas y salidas para una compuerta AND de tres entradas

Ahora debemos identificar el comportamiento de la compuerta y esto lo podemos lograr analizando la tabla de verdad para una AND de tres entradas.

Tabla 1.2. Tabla de verdad de una compuerta AND de 3 entradas

a

b

c

y

0

0

0

0

0

0

1

0

0

1

0

0

0

1

1

0

1

0

0

0

1

0

1

0

1

1

0

0

1

1

1

1

Luego de analizar la tabla de verdad se observa que una característica particular para la compuerta AND de tres entradas es que siempre que tiene variaciones en las entradas, de modo tal que en todas ellas exista un valor lógico verdadero (uno), la salida es así mismo un valor lógico verdadero (uno), y que para el resto de variaciones en las entradas la salida es un valor lógico falso (cero).

  1. Escribir el código

Una vez identificado el problema se procede a escribir el código en un HDL teniendo en cuenta los parámetros que define el estándar para ese lenguaje, para este caso en particular se usará Verilog HDL que esta definido por el estándar IEEE-1364.

El código para la implementación de una compuerta AND de tres entradas con Verilog HDL se muestra a continuación.

Linea Código

1 -*- Mode: Verilog -*-

2 // Filename : and_tres.v

3 // Description : Implementacion de una compuerta AND de 3 entradas usando Verilog HDL

4 // Author : Electronix electronica@glud.udistrital.edu.co

5 // Created On : 02.11.2004

6 // Last Modified By: Mauricio Velasquez

7 // Last Modified On: 18.11.2004

8 // Update Count : 0

9 // Status : Unknown, Use with caution!

10

11 module and_tres(a, b, c, y); // Definicion del modulo and_uno

12

13 input a, b, c; // Declaracion de variables de entrada

14 output y; // Declaracion de variables de salida

15 reg y;

16

17 always @ (a or b or c ) // Implementacion de la funcion and para 3

entradas

18 begin

19 y = a && b && c;

20 end

21

22 endmodule // and_uno

En Verilog los sistemas digitales se describen por medio de módulos y dependiendo del tipo de descripción que se este haciendo se pueden interconectar entre si. En el código anterior el módulo and_tres esta descrito desde la línea 11 hasta la línea 22 donde respectivamente cada línea es el inicio y fin del módulo.

De la línea 1 hasta la 9 observamos un comentario que se puede insertar con un atajo de teclado que provee el modo verilog para el poderosísimo editor de texto emacs (es una herramienta muy robusta pues se puede usar como "IDE"[2] para muchos lenguajes brindando que el código se pueda observar en colores para una mayor comprensión, indentación, ect ..), los comentarios en Verilog se utilizan igual que en el lenguaje de programación C.

En la definición del módulo and_tres se deben instanciar entre paréntesis separadas por comas todas las variables usadas por el sistema digital (linea 11). Lo siguiente a realizar es declarar que variables son de entrada y cuales de salida con el fin de que el módulo se pueda comunicar con el exterior, para este caso las variables de entrada (input) son a, b y c (línea 13) y las variable de salida (output) y (línea 14).

Ahora definimos que tipo de variables son las entradas y salidas del sistema (variables internas), en Verilog hay dos tipos de variable wire y reg, una red que permite conexión y un registro que permite almacenar un valor respectivamente; para este ejemplo basta con definir la salida como tipo wire esto se hace en la línea 15.

Y por ultimo se implementa el comportamiento que deseamos que tenga el módulo, para este caso se utiliza un proceso tipo always con una @ seguido y las variables de entrada entre paréntesis con separadas por la palabra or, lo que indica que siempre que cambie el valor de por lo menos una de las variables indicadas entre el paréntesis ejecute las ordenes especificadas para el always (línea 17).

En la línea 18 se indica que y tome el valor de lógico verdadero (uno) si las variables de entrada a, b, y c tienen un valor lógico verdadero (uno). Y en la línea 31 se finaliza el always son la palabrea reservada end.

Integrate Development Environment

Los procesos en Verilog pueden ser de dos tipos initial son aquellos que al ejecutar la ultima línea se da por culminado el proceso y el always, que al ejecutar la ultima línea se repite nuevamente el proceso. Estos procesos son los que le dan una característica fundamental al lenguaje pues a diferencia de muchos lenguajes procedurales comunes como el C que es uno de los inspiradores de este los procesos se pueden ejecutar en paralelo.

3. Hacer la simulación

Es importante saber que para simular un modelo se necesita escribir un modulo de prueba (Test Bench) que permitirá hacer la simulación. Para llegar hasta la simulación se siguieron los siguientes pasos.

1. Escribir un módulo de prueba que genere un archivo tipo VCD (Verilog Change Dump) que almacena el valor de un conjunto de variables cada vez que se produce un cambio en ellas.

2. Con un analizador de formas de onda leer el archivo VCD para visualizar el comportamiento del modelo.

El modulo de prueba

En el módulo de prueba se especifican los parámetros de simulación como tiempo de duración, variación de las variables, etc ...

El código del módulo de prueba para la compuerta lógica AND de tres entradas se muestra a continuación.

1   module and_tres_tb () ;
2       reg a, b, c;
3       wire y;
4
5       initial  begin
6           a=0;
7           b=0; 
8           c=0;
9       end
10  
11     always begin
12         #1 a=~a;
13     end
14   
15     always begin
16         #2 b=~b;
17     end
18   
19     always begin
20       #4 c=~c;
21     end
22   
23     initial begin
24        #600 $finish;
25      
26     end
27   
28      and_tres Uand_tres_tb(a,b, c, y);                      // Generar la función para el test bench
29   
30
31       initial begin
32           $dumpfile ("and_tres.vcd");      // Generar el archivo de tipo VCD
33           $dumpvars;
34       end     
36      
38   endmodule // and_tres_tb
      

En la linea 1 se define el modulo, luego se definen las variables de entradas tipo reg y las variables de salida wire líneas 2 y 3. Dentro de un proceso initial se inicializan las variables con el valor con un valor (líneas 5 a 9). De las líneas 11 a 21 se definen los valores que toman las variables a través del tiempo, indicando respectivamente que a tiene un cambio de pulso cada unidad de tiempo, b cada 2 y c cada 3.

En el proceso indicado de la línea 23 a la 26 se indica que el tiempo de la simulación es de 600 unidades (por defecto un segundo). En la línea 28 se genera una función con parámetros a,b,c,y previamente definidos para el test bench. Por ultimo se genera el archivo tipo VCD con la función del sistema $dumpfile (línea 32) y se indica con la función del sistema $dumpvars que lleve todas las variabes al archivo .vcd que se generará (línea 33).

Compilar el código

Para compilar se utiliza el compilador Icarus Verilog.

           $ iverilog and_tres.v -o and_tres
        

Esto genera un archivo (script) llamado and_tres el cual debera ser ejecutado:

          $ ./and_tres
          VCD info: dumpfile and_tres.vcd opened for output.
        

Esto genera el archivo and.vcd que se usara con gtkwave, que se utilizara para analizar las formas de ondas digitales.