En ingeniería informática , un lenguaje de descripción de hardware ( HDL ) es un lenguaje informático especializado que se utiliza para describir la estructura y el comportamiento de circuitos electrónicos , más comúnmente para diseñar ASIC y programar FPGA .
Un lenguaje de descripción de hardware permite una descripción formal y precisa de un circuito electrónico que permite el análisis y la simulación automatizados del circuito. También permite la síntesis de una descripción HDL en una netlist (una especificación de componentes electrónicos físicos y cómo están conectados entre sí), que luego se puede colocar y enrutar para producir el conjunto de máscaras utilizadas para crear un circuito integrado .
Un lenguaje de descripción de hardware se parece mucho a un lenguaje de programación como C o ALGOL ; es una descripción textual que consta de expresiones, declaraciones y estructuras de control. Una diferencia importante entre la mayoría de los lenguajes de programación y los HDL es que los HDL incluyen explícitamente la noción de tiempo.
Los HDL forman una parte integral de los sistemas de automatización de diseño electrónico (EDA), especialmente para circuitos complejos, como circuitos integrados de aplicaciones específicas , microprocesadores y dispositivos lógicos programables .
Debido a la creciente complejidad de los circuitos electrónicos digitales desde la década de 1970 (ver la ley de Moore ), los diseñadores de circuitos necesitaban que las descripciones de la lógica digital se realizaran a un alto nivel sin estar vinculados a una tecnología electrónica específica, como ECL , TTL o CMOS . Los HDL se crearon para implementar la abstracción del nivel de transferencia de registros , un modelo del flujo de datos y la sincronización de un circuito. [1]
Hay dos lenguajes principales de descripción de hardware: VHDL y Verilog . En ellos existen diferentes tipos de descripción: "flujo de datos, conductual y estructural". Ejemplo de flujo de datos de VHDL:
BIBLIOTECA IEEE ; UTILICE IEEE.STD_LOGIC_1164. TODO ; ENTIDAD not1 ES PUERTO ( a : EN STD_LOGIC ; b : SALIDA STD_LOGIC ; ); FINAL no1 ; ARQUITECTURA conductual DE not1 ES COMENZAR b <= NO a ; FIN comportamental ;
Los HDL son expresiones estándar basadas en texto de la estructura de los sistemas electrónicos y su comportamiento a lo largo del tiempo. Al igual que los lenguajes de programación concurrentes , la sintaxis y la semántica HDL incluyen notaciones explícitas para expresar la concurrencia . Sin embargo, a diferencia de la mayoría de los lenguajes de programación de software , los HDL también incluyen una noción explícita de tiempo, que es un atributo principal del hardware. Los lenguajes cuya única característica es expresar la conectividad de circuitos entre una jerarquía de bloques se clasifican propiamente como lenguajes netlist utilizados en el diseño eléctrico asistido por computadora . HDL se puede utilizar para expresar diseños en arquitecturas estructurales, de comportamiento o de nivel de transferencia de registros para la misma funcionalidad de circuito; en los dos últimos casos, el sintetizador decide la arquitectura y el diseño de la puerta lógica.
Los HDL se utilizan para escribir especificaciones ejecutables para hardware. Un programa diseñado para implementar la semántica subyacente de las declaraciones del lenguaje y simular el progreso del tiempo proporciona al diseñador de hardware la capacidad de modelar una pieza de hardware antes de que se cree físicamente. Es esta ejecutabilidad la que da a los HDL la ilusión de ser lenguajes de programación , cuando se clasifican más precisamente como lenguajes de especificación o lenguajes de modelado . Existen simuladores capaces de soportar modelos de eventos discretos (digitales) y de tiempo continuo (analógicos), y hay disponibles HDL específicos para cada uno.
Ciertamente es posible representar la semántica del hardware usando lenguajes de programación tradicionales como C++ , que operan con semántica de flujo de control en lugar de flujo de datos , aunque para funcionar como tal, los programas deben complementarse con bibliotecas de clases extensas y difíciles de manejar . Sin embargo, en general, los lenguajes de programación de software no incluyen ninguna capacidad para expresar explícitamente el tiempo y, por lo tanto, no pueden funcionar como lenguajes de descripción de hardware. Antes de la introducción de System Verilog en 2002, la integración de C++ con un simulador lógico era una de las pocas formas de utilizar la programación orientada a objetos en la verificación de hardware. System Verilog es el primer HDL importante que ofrece orientación a objetos y recolección de basura.
Usando el subconjunto adecuado de lenguaje de descripción de hardware, un programa llamado sintetizador, o herramienta de síntesis lógica , puede inferir operaciones lógicas de hardware a partir de declaraciones del lenguaje y producir una lista de red equivalente de primitivas [ jerga ] de hardware genéricas para implementar el comportamiento especificado. [ cita necesaria ] Los sintetizadores generalmente ignoran la expresión de cualquier construcción de tiempo en el texto. Los sintetizadores lógicos digitales, por ejemplo, generalmente utilizan flancos de reloj como forma de cronometrar el circuito, ignorando cualquier construcción de temporización. La capacidad de tener un subconjunto sintetizable del lenguaje no constituye en sí mismo un lenguaje de descripción de hardware.
Los primeros lenguajes de descripción de hardware aparecieron a finales de la década de 1960 y parecían lenguajes más tradicionales. [2] El primero que tuvo un efecto duradero fue descrito en 1971 en el texto Computer Structures de C. Gordon Bell y Allen Newell . [3] Este texto introdujo el concepto de nivel de transferencia de registro , utilizado por primera vez en el lenguaje ISP para describir el comportamiento del PDP-8 de Digital Equipment Corporation (DEC) . [4]
El lenguaje se generalizó con la introducción de los módulos de nivel RT (RTM) PDP-16 de DEC y un libro que describe su uso. [5] Siguieron al menos dos implementaciones del lenguaje ISP básico (ISPL e ISPS). [6] [7] ISPS era muy adecuado para describir las relaciones entre las entradas y las salidas del diseño y fue rápidamente adoptado por equipos comerciales en DEC, así como por varios equipos de investigación tanto en los EE. UU. como entre sus aliados de la OTAN. .
Los productos RTM nunca despegaron comercialmente y DEC dejó de comercializarlos a mediados de la década de 1980, a medida que las nuevas técnicas y, en particular, la integración a muy gran escala (VLSI) se hicieron más populares.
Un trabajo separado realizado alrededor de 1979 en la Universidad de Kaiserslautern produjo un lenguaje llamado KARL ("Lenguaje de transferencia de registros de KAiserslautern"), que incluía características de lenguaje de cálculo de diseño que respaldaban la planificación de pisos [ jerga ] con chips VLSI y el diseño de hardware estructurado. Este trabajo también fue la base del lenguaje gráfico interactivo hermano de KARL, ABL, cuyo nombre era una inicial de "Un lenguaje de diagrama de bloques". [8] ABL fue implementado a principios de la década de 1980 por el Centro Studi e Laboratori Telecomunicazioni ( CSELT ) en Torino, Italia, produciendo el editor de diseño gráfico ABLED VLSI. A mediados de la década de 1980, un consorcio internacional financiado por la Comisión de la Unión Europea implementó un marco de diseño VLSI en torno a KARL y ABL. [9]
A finales de la década de 1970, el diseño que utilizaba dispositivos lógicos programables (PLD) se hizo popular, aunque estos diseños se limitaban principalmente al diseño de máquinas de estados finitos . El trabajo de Data General en 1980 utilizó estos mismos dispositivos para diseñar el Data General Eclipse MV/8000 , y comenzó a crecer la necesidad comercial de un lenguaje que pudiera adaptarse bien a ellos. En 1983, Data I/O introdujo ABEL para satisfacer esa necesidad.
En 1985, cuando el diseño pasó a VLSI, Gateway Design Automation introdujo Verilog e Intermetrics lanzó la primera versión completa del lenguaje de descripción de hardware VHSIC (VHDL). VHDL fue desarrollado a instancias del programa VHSIC del Departamento de Defensa de los Estados Unidos , y se basó en el lenguaje de programación Ada , así como en la experiencia adquirida con el desarrollo anterior de ISPS. [10] Inicialmente, Verilog y VHDL se utilizaron para documentar y simular diseños de circuitos ya capturados y descritos en otra forma (como archivos esquemáticos ). La simulación HDL permitió a los ingenieros trabajar en un nivel de abstracción más alto que la simulación a nivel esquemático y, por lo tanto, aumentó la capacidad de diseño de cientos de transistores a miles. [ cita necesaria ] En 1986, con el apoyo del Departamento de Defensa de EE. UU., VHDL fue patrocinado como estándar IEEE (IEEE Std 1076), y en diciembre se aprobó la primera versión estandarizada por IEEE de VHDL, IEEE Std 1076-1987. 1987. Posteriormente, Cadence Design Systems adquirió Gateway Design Automation por los derechos de Verilog-XL, el simulador HDL que se convertiría en el estándar de facto de los simuladores Verilog durante la siguiente década.
La introducción de la síntesis lógica para los HDL empujó a los HDL desde un segundo plano al primer plano del diseño digital. Las herramientas de síntesis compilaron archivos fuente HDL (escritos en un formato restringido llamado RTL) en una descripción de lista de redes fabricable en términos de puertas y transistores . Escribir archivos RTL sintetizables requirió práctica y disciplina por parte del diseñador; En comparación con un diseño esquemático tradicional, las listas de red RTL sintetizadas casi siempre eran más grandes en área y más lentas en rendimiento [ cita requerida ] . El diseño de un circuito realizado por un ingeniero cualificado, utilizando la captura de esquemas/diseño manual que requiere mucha mano de obra, casi siempre superaría a su equivalente sintetizado lógicamente, pero la ventaja de productividad de la síntesis pronto desplazó la captura de esquemas digitales exactamente a aquellas áreas que eran problemáticas para Síntesis RTL: circuitos asincrónicos o de muy alta velocidad, baja potencia.
En unos pocos años, VHDL y Verilog emergieron como los HDL dominantes en la industria electrónica, mientras que los HDL más antiguos y menos capaces desaparecieron gradualmente de su uso. Sin embargo, VHDL y Verilog comparten muchas de las mismas limitaciones, como no ser adecuados para la simulación de circuitos analógicos o de señal mixta . Los HDL especializados (como Confluence) se introdujeron con el objetivo explícito de solucionar limitaciones específicas de Verilog y VHDL, aunque ninguno tuvo la intención de reemplazarlos.
A lo largo de los años, se ha invertido mucho esfuerzo en mejorar los HDL. La última versión de Verilog, formalmente conocida como IEEE 1800-2005 SystemVerilog, introduce muchas características nuevas (clases, variables aleatorias y propiedades/afirmaciones) para abordar la creciente necesidad de una mejor aleatorización del banco de pruebas , jerarquía de diseño y reutilización. También se está desarrollando una futura revisión de VHDL [ ¿cuándo? ] y se espera que coincida con las mejoras de SystemVerilog.
Como resultado de las ganancias de eficiencia obtenidas utilizando HDL, la mayoría del diseño de circuitos digitales modernos gira en torno a él. La mayoría de los diseños comienzan como un conjunto de requisitos o un diagrama arquitectónico de alto nivel. Las estructuras de control y decisión a menudo se crean prototipos en aplicaciones de diagramas de flujo o se ingresan en un editor. El proceso de escribir la descripción HDL depende en gran medida de la naturaleza del circuito y de la preferencia del diseñador por el estilo de codificación. El HDL es simplemente el "lenguaje de captura", que a menudo comienza con una descripción algorítmica de alto nivel, como un modelo matemático de C++. Los diseñadores suelen utilizar lenguajes de programación como Perl para generar automáticamente estructuras de circuitos repetitivos en el lenguaje HDL. Los editores de texto especiales ofrecen funciones para sangría automática, coloración dependiente de la sintaxis y expansión basada en macros de la declaración de entidad/arquitectura/señal.
Luego, el código HDL se somete a una revisión o auditoría del código. En preparación para la síntesis, la descripción de HDL está sujeta a una serie de verificadores automatizados. Los verificadores informan desviaciones de las pautas de código estandarizadas, identifican posibles construcciones de código ambiguas antes de que puedan causar una mala interpretación y verifican errores de codificación lógica comunes, como puertos flotantes o salidas en cortocircuito . Este proceso ayuda a resolver errores antes de sintetizar el código.
En el lenguaje de la industria, el diseño HDL generalmente termina en la etapa de síntesis. Una vez que la herramienta de síntesis ha mapeado la descripción HDL en una lista de red de puerta, la lista de red se pasa a la etapa de back-end. Dependiendo de la tecnología física ( FPGA , matriz de compuertas ASIC , celda estándar ASIC ), los HDL pueden desempeñar o no un papel importante en el flujo de back-end. En general, a medida que el flujo de diseño avanza hacia una forma físicamente realizable, la base de datos de diseño se carga cada vez más con información específica de la tecnología, que no se puede almacenar en una descripción HDL genérica. Finalmente, se fabrica o programa un circuito integrado para su uso.
Esencial para el diseño HDL es la capacidad de simular programas HDL. La simulación permite que una descripción HDL de un diseño (llamada modelo) pase la verificación del diseño , un hito importante que valida la función prevista (especificación) del diseño frente a la implementación del código en la descripción HDL. También permite la exploración arquitectónica. El ingeniero puede experimentar con opciones de diseño escribiendo múltiples variaciones de un diseño base y luego comparando su comportamiento en la simulación. Por tanto, la simulación es fundamental para el éxito del diseño HDL.
Para simular un modelo HDL, un ingeniero escribe un entorno de simulación de alto nivel (llamado banco de pruebas ). Como mínimo, un banco de pruebas contiene una instancia del modelo (llamado dispositivo bajo prueba o DUT), declaraciones de pin/señal para las E/S del modelo y una forma de onda de reloj. El código del banco de pruebas está controlado por eventos: el ingeniero escribe declaraciones HDL para implementar la señal de reinicio (generada por el banco de pruebas), para modelar transacciones de interfaz (como una lectura/escritura del bus host) y para monitorear la salida del DUT. Un simulador HDL (el programa que ejecuta el banco de pruebas) mantiene el reloj del simulador, que es la referencia maestra para todos los eventos en la simulación del banco de pruebas. Los eventos ocurren sólo en los instantes dictados por el HDL del banco de pruebas (como un reinicio codificado en el banco de pruebas), o en reacción (por el modelo) a estímulos y eventos desencadenantes. Los simuladores HDL modernos tienen interfaces gráficas de usuario con todas las funciones , junto con un conjunto de herramientas de depuración. Estos permiten al usuario detener y reiniciar la simulación en cualquier momento, insertar puntos de interrupción del simulador (independientes del código HDL) y monitorear o modificar cualquier elemento en la jerarquía del modelo HDL. Los simuladores modernos también pueden vincular el entorno HDL a bibliotecas compiladas por el usuario, a través de una interfaz PLI /VHPI definida. La vinculación depende del sistema ( x86 , SPARC , etc. ejecutando Windows / Linux / Solaris ), ya que el simulador HDL y las bibliotecas de usuario se compilan y vinculan fuera del entorno HDL.
La verificación del diseño es a menudo la parte del proceso de diseño que consume más tiempo, debido a la desconexión entre la especificación funcional de un dispositivo , la interpretación de la especificación por parte del diseñador y la imprecisión [ cita necesaria ] del lenguaje HDL. La mayor parte del ciclo inicial de prueba/depuración se lleva a cabo en el entorno del simulador HDL , ya que la etapa inicial del diseño está sujeta a cambios de circuito importantes y frecuentes. También se puede crear un prototipo de una descripción HDL y probarla en hardware; a menudo se utilizan dispositivos lógicos programables para este propósito. La creación de prototipos de hardware es comparativamente más cara que la simulación HDL, pero ofrece una visión real del diseño. La creación de prototipos es la mejor manera de comparar la interfaz con otros dispositivos de hardware y prototipos de hardware. Incluso aquellos que se ejecutan en FPGA lentos ofrecen tiempos de simulación mucho más cortos que la simulación HDL pura.
Históricamente, la verificación del diseño era un ciclo laborioso y repetitivo de escribir y ejecutar casos de prueba de simulación contra el diseño bajo prueba. A medida que los diseños de chips se han vuelto más grandes y complejos, la tarea de verificación del diseño ha crecido hasta el punto de que ahora domina la agenda de un equipo de diseño. Buscando formas de mejorar la productividad del diseño, la industria de la automatización del diseño electrónico desarrolló el lenguaje de especificación de propiedades .
En términos de verificación formal , una propiedad es una declaración fáctica sobre el comportamiento esperado o supuesto de otro objeto. Idealmente, para una descripción HDL determinada, se puede demostrar que una propiedad o propiedades son verdaderas o falsas utilizando métodos matemáticos formales. En términos prácticos, muchas propiedades no se pueden probar porque ocupan un espacio de solución ilimitado . Sin embargo, si se le proporciona un conjunto de suposiciones o restricciones operativas, un verificador de propiedades puede probar (o refutar) ciertas propiedades reduciendo el espacio de solución.
Las afirmaciones no modelan la actividad del circuito, sino que capturan y documentan la intención del diseñador en el código HDL. En un entorno de simulación, el simulador evalúa todas las afirmaciones especificadas e informa la ubicación y la gravedad de cualquier infracción. En un entorno de síntesis, la herramienta de síntesis normalmente opera con la política de detener la síntesis ante cualquier violación. La verificación basada en afirmaciones aún está en sus inicios, pero se espera que se convierta en una parte integral del conjunto de herramientas de diseño HDL.
Un HDL es muy similar a un lenguaje de programación de software , pero existen diferencias importantes. La mayoría de los lenguajes de programación son inherentemente procedimentales (de un solo subproceso), con soporte sintáctico y semántico limitado para manejar la concurrencia . Los HDL, por otro lado, se parecen a los lenguajes de programación concurrentes en su capacidad para modelar múltiples procesos paralelos (como flip-flops y sumadores ) que se ejecutan automáticamente de forma independiente unos de otros. Cualquier cambio en la entrada del proceso desencadena automáticamente una actualización en la pila de procesos del simulador.
Tanto los lenguajes de programación como los HDL son procesados por un compilador (a menudo llamado sintetizador en el caso de HDL), pero con diferentes objetivos. Para HDL, "compilar" se refiere a síntesis lógica ; el proceso de transformar el listado de códigos HDL en una lista de acceso de puerta físicamente realizable . La salida de la lista de red puede tomar cualquiera de muchas formas: una lista de red de "simulación" con información de retardo de puerta, una lista de red de "transferencia" para la colocación y el enrutamiento post-síntesis en una matriz semiconductora, o un formato de intercambio de diseño electrónico (EDIF) genérico estándar de la industria. ) (para su posterior conversión a un archivo de formato JEDEC ).
Por otro lado, un compilador de software convierte el listado del código fuente en un código objeto específico del microprocesador para su ejecución en el microprocesador de destino. A medida que los HDL y los lenguajes de programación toman prestados conceptos y características entre sí, la frontera entre ellos se vuelve menos clara. Sin embargo, los HDL puros no son adecuados para el desarrollo de software de aplicaciones de propósito general [ ¿por qué? ] del mismo modo que los lenguajes de programación de propósito general son indeseables para modelar hardware.
Sin embargo, a medida que los sistemas electrónicos se vuelven cada vez más complejos y los sistemas reconfigurables se vuelven cada vez más comunes, existe un creciente deseo en la industria de un lenguaje único que pueda realizar algunas tareas tanto de diseño de hardware como de programación de software. SystemC es un ejemplo de ello: el hardware del sistema integrado se puede modelar como bloques arquitectónicos no detallados ( cajas negras con entradas de señales y controladores de salida modelados). La aplicación de destino está escrita en C o C++ y compilada de forma nativa para el sistema de desarrollo del host; en lugar de apuntar a la CPU integrada, lo que requiere una simulación de host de la CPU integrada o una CPU emulada.
El alto nivel de abstracción de los modelos SystemC se adapta bien a la exploración temprana de la arquitectura , ya que las modificaciones arquitectónicas se pueden evaluar fácilmente sin preocuparse por los problemas de implementación a nivel de señal. Sin embargo, el modelo de subprocesos utilizado en SystemC se basa en la memoria compartida , lo que hace que el lenguaje no maneje bien la ejecución paralela o los modelos de bajo nivel.
En su nivel de abstracción, los HDL han sido comparados con los lenguajes ensambladores . [ cita necesaria ] Hay intentos de elevar el nivel de abstracción del diseño de hardware para reducir la complejidad de la programación en HDL, creando un subcampo llamado síntesis de alto nivel .
Empresas como Cadence , Synopsys y Agility Design Solutions están promoviendo SystemC como una forma de combinar lenguajes de alto nivel con modelos de concurrencia para permitir ciclos de diseño para FPGA más rápidos de lo que es posible utilizando HDL tradicionales. Los enfoques basados en C o C++ estándar (con bibliotecas u otras extensiones que permiten la programación paralela) se encuentran en las herramientas Catapult C de Mentor Graphics y las herramientas Impulse C de Impulse Accelerated Technologies.
Una iniciativa similar de Intel es el uso de Data Parallel C++, relacionado con SYCL , como lenguaje de síntesis de alto nivel.
CoreFire Design Suite [11] de Annapolis Micro Systems, Inc. y LabVIEW FPGA de National Instruments proporcionan un enfoque de flujo de datos gráfico para la entrada de diseño de alto nivel y lenguajes como SystemVerilog , SystemVHDL y Handel-C buscan lograr el mismo objetivo, pero tienen como objetivo hacer que los ingenieros de hardware existentes sean más productivos, en lugar de hacer que los FPGA sean más accesibles para los ingenieros de software existentes .
También es posible diseñar módulos de hardware usando MATLAB y Simulink utilizando la herramienta MathWorks HDL Coder [12] o DSP Builder para Intel FPGA [13] o Xilinx System Generator (XSG) de Xilinx . [14]
Las dos variedades de HDL más utilizadas y con mayor soporte en la industria son Verilog y VHDL .
Existen varios proyectos para definir la conectividad de placas de circuito impreso utilizando métodos de entrada de texto basados en el lenguaje. Entre ellos, han surgido nuevos enfoques que se centran en mejorar la legibilidad, la reutilización y la validación. Estas metodologías modernas emplean lenguajes de diseño de código abierto diseñados específicamente para la electrónica, adoptando un marcado declarativo para especificar qué deben lograr los circuitos. Este cambio integra los principios de desarrollo de software en el diseño de hardware, simplificando el proceso y enfatizando la automatización, la reutilización y la validación.
{{cite journal}}
: Citar diario requiere |journal=
( ayuda ){{cite journal}}
: Citar diario requiere |journal=
( ayuda ){{cite journal}}
: Citar diario requiere |journal=
( ayuda )