Avisar de contenido inadecuado

Dispositivos Logicos Programables (parte 3)

{
}

DISPOSITIVOS LOGICOS PROGRAMABLES

 

LENGUAJES DE PROGRAMACIÓN

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

Los sistemas pueden ser descritos:

Nivel estructural empleando elementos de librería o bien elementos previamente creados, se realiza la interconexión de unos con otros. Sería similar a una captura esquem´atica donde la función del diseñadores instanciar bloques y conectarlos entre sí.

Nivel de comportamiento el diseñador describe la transferencia de información entre registros (nivel RTL: Register Transfer Level).

Estos dos niveles de descripción pueden mezclarse, dando lugar a los denominados diseños mixtos. Existen multitud de lenguajes HDL en el mercado (de hecho inicialmente cada fabricante disponía de su propio lenguaje), sin embargo la necesidad de unificación ha hecho que en la actualidad sólo existan dos grandes lenguajes: VHDL y Verilog . Ambos están acogidos a estándares IEEE (VHDL en 1987 y Verilog en 1995). Existen defensores y detractores de cada uno de ellos. Con carácter general se dice que es más fácil aprender Verilog al ser un lenguaje más compacto.

Verilog nació en 1985 como un lenguaje propietario de una compañía (Cadence Design System), pero en 1990 se formó OVI (Open Verilog International) haciendo dicho lenguaje de dominio público, permitiendo a otras empresas que pudieran emplear Verilog como lenguaje, con objeto de aumentar la difusión de dicho lenguaje.

 

HISTORIA DEL LENGUAJE VERILOG

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

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.

 

ESTRUCTURA DEL SOFTWARE VERILOG

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.

Este lenguaje nos permite la descripción del diseño a diferentes niveles, denominados niveles de abstracción.

Nivel de puerta.

 Corresponde a una descripción a bajo nivel del diseño, también denominada modelo estructural. El diseñador describe el diseño mediante el uso de primitivas lógicas (AND, OR, NOT, etc...), conexiones lógicas y añadiendo las propiedades de tiempo de las diferentes primitivas. Todas las señales son discretas, pudiendo tomar únicamente los valores ‘0', ‘1', ‘X' o ‘Z' (siendo ‘X' estado indefinido y ‘Z' estado de alta impedancia).

La figura siguiente representa la descripción de un multiplexor a nivel de puertas. Este nivel de descripción no resulta ni mucho menos adecuado por lo que no se volverá a tratar a lo largo del presente texto.

  

fig_44

Figura 44, Descripción a nivel de puerta de un multiplexor.


Nivel de transferencia de registro o nivel RTL.

 Los diseños descritos a nivel RTL especifican las características de un circuito mediante operaciones y la transferencia de datos entre registros. Mediante el uso de especificaciones de tiempo las operaciones se realizan en instantes determinados. La especificación de un diseño a nivel RTL le confiere la propiedad de diseño sintetizable, por lo que hoy en día una moderna definición de diseño a nivel RTL es todo código sintetizable se denomina código RTL.

La figura siguiente corresponde a la descripción a nivel RTL de un flip-flop. Este nivel de descripción, por la propiedad de ser sintetizable, será el nivel utilizado por excelencia en el diseño HDL.

 

 fig_45

Figura 45, Descripción a nivel RTL de un flip-flop.


Nivel de comportamiento (Behavioral level)

 La principal característica de este nivel es su total independencia de la estructura del diseño. El diseñador, más que definir la estructura, define el comportamiento del diseño. En este nivel, el diseño se define mediante algoritmos en paralelo. Cada uno de estos algoritmos consiste en un conjunto de instrucciones que se ejecutan de forma secuencial. La descripción a este nivel pude hacer uso de sentencias o estructuras no sintetizables, y su uso se justifica en la realización de los denominados testbenches.

 

DISEÑO CON VERILOG

En el contexto de VERILOG un módulo describe a un componente básico dentro de un diseño, puede ser un elemento o un conjunto de elementos que conforman un diseño superior (high-level). Un módulo provee su funcionalidad a un nivel más superior mediante sus puertos de interfaz (inputs, outputs), pero esconde su estructura interna, permitiendo al diseñador cambiar internamente al módulo sin afectar el resto del diseño.

 Existen dos formas de describir un circuito. Por un lado se puede describir un circuito indicando los diferentes componentes que lo forman y su interconexión, de esta manera tenemos especificado un circuito y se sabe como funciona; esta es la forma habitual en que se han venido describiendo circuitos y las herramientas utilizadas para ello han sido las de captura de esquemas y las descripciones netlist.

La segunda forma consiste en describir un circuito indicando lo que hace o como funciona, es decir, describiendo su comportamiento. Naturalmente esta forma de describir un circuito es mucho mejor para un diseñador puesto que lo que realmente lo que interesa es el funcionamiento del circuito más que sus componentes. Por otro lado, al encontrarse lejos de lo que un circuito es realmente puede plantear algunos problemas a la hora de realizar un circuito a partir de la descripción de su comportamiento.

En la figura siguiente se muestra un esquema de las etapas para realizar un diseño con el lenguaje Verilog.

 

fig_46 

Figura 46, Etapas del Diseño Digital

 

El flujo de diseño de un sistema seria:

División del diseño principal en módulos separados. La modularidad es uno de los conceptos principales de todo diseño. Normalmente se diferencia entre dos metodologías de diseño: top-down y botton-up. La metodología top-down consiste en que un diseño complejo se divide en diseños más sencillos que se puedan diseñar (o describir) más fácilmente. La metodología botton-up consiste en construir un diseño complejo a partir de módulos, ya diseñados, más simples. En la práctica, un diseño usa generalmente ambas metodologías.

Entrada de diseños, pueden usarse diversos métodos tal como VHDL como se vio anteriormente.

Simulación funcional, es decir, comprobaremos que lo escrito en el punto anterior realmente funciona como queremos, si no lo hace tendremos que modificarlo. En este tipo de simulación se comprueba que el código VHDL o Verilog (u otro tipo de lenguaje HDL) ejecuta correctamente lo que se pretende.

Síntesis. En este paso se adapta el diseño anterior (que sabemos que funciona) a un hardware en concreto, ya sea una FPGA o un ASIC. Hay sentencias del lenguaje que no son sintetizables, como por ejemplo divisiones o exponenciaciones con números no constantes. El hecho de que no todas las expresiones en VHDL sean sintetizables es que el VHDL es un lenguaje genérico para modelado de sistemas (no sólo para diseño de circuitos digitales), por lo que hay expresiones que no pueden ser transformadas a circuitos digitales. Durante la síntesis se tiene en cuenta la estructura interna del dispositivo, y se definen restricciones, como la asignación de pins. El sintetizador optimiza las expresiones lógicas con objeto de que ocupen menor área, o bien son eliminados las expresiones lógicas que no son usadas por el circuito.

Simulación post-síntesis. En este tipo de simulación se comprueba que el sintetizador ha realizado correctamente la síntesis del circuito, al transformar el código HDL en bloques lógicos conectados entre sí. Este paso es necesario ya que, a veces, los sintetizadores producen resultados de síntesis incorrectos, o bien realiza simplificaciones del circuito al optimizarlo.

Placement y routing. El proceso de placement consiste en situar los bloques digitales obtenidos en la síntesis de forma óptima, de forma que aquellos bloques que se encuentran muy interconectados entre si se sitúen próximamente. El proceso de routing consiste en rutar adecuadamente los bloques entre si, intentando minimizar retardos de propagación para maximizar la frecuencia máxima de funcionamiento del dispositivo.

Back-annotation. Una vez ha sido completado el placement & routing, se extraen los retardos de los bloques y sus interconexiones, con objeto de poder realizar una simulación temporal (también llamada simulación post-layout). Estos retardos son anotados en un fichero SDF (Standart Delay Format) que asocia a cada bloque o interconexión un retardo mínimo/típico/máximo.

Simulación temporal. A pesar de la simulación anterior puede que el diseño no funcione cuando se programa, una de las causas puede ser por los retardos internos del chip. Con esta simulación se puede comprobar, y si hay errores se tiene que volver a uno de los anteriores pasos.

Programación en el dispositivo. Se implementa el diseño en el dispositivo final y se comprueba el resultado.

REFERENCIAS

http://electronicaintegrada.blogspot.com/2008/02/cpld-verilog.html

 http://www.iuma.ulpgc.es/~nunez/clases-micros-para-com/verilog/Verilog%20Tutorial%20v1.pdf

http://es.wikipedia.org/wiki/Verilog

http://aristotelesanato.blogspot.com/2008_01_01_archive.html

 

{
}

Álbum de fotos de Dispositivos Logicos Programables (parte 3)

3 de 3

Ver fotos de Dispositivos Logicos Programables (parte 3)

{
}

Deja tu comentario Dispositivos Logicos Programables (parte 3)

Identifícate en OboLog, o crea tu blog gratis si aún no estás registrado.

Avatar Tu nombre