Introducción

Introducción a Verilog

Verilog HDL es uno de los dos lenguajes de descripción de hardware (HDL, del inglés Hardware Description Language) más comunes que utilizan los diseñadores de circuitos integrados (IC), con una sintaxis derivada del lenguaje de programación C. Se corresponde inicialmente con el estándar IEEE 1364-1995, extendido posteriormente en IEEE 1364-2005, y finalmente integrado en SystemVerilog (IEEE 1800-2023).

Un HDL permite la simulación del diseño en etapas tempranas del ciclo de desarrollo para corregir errores o experimentar con diferentes arquitecturas, llevar a cabo la síntesis lógica del mismo y facilitar la documentación del mismo. Los diseños descritos en HDL son independientes de la tecnología, fáciles de diseñar y depurar, y suelen ser más legibles que los esquemas, especialmente para circuitos grandes y complejos, lo que permite además un prototipado rápido y acelerar el tiempo de salida del producto final (TTM, del inglés Time-To-Market).

Verilog se puede utilizar para describir diseños en cuatro niveles de abstracción:

  • Nivel comportamental: descripción algorítmica o arquitectural (similar al código C con instrucciones ifcase y loop).
  • Nivel de transferencia de registros (RTL, del inglés Register Transfer Level): utilizando registros conectados por ecuaciones booleanas.
  • Nivel de puertas: interconexión de puertas lógicas AND, NOR, etc.
  • Nivel de conmutación: interconexión de los transistores MOS que forman las puertas.

Los últimos tres niveles se corresponden con una descripción también denominada estructural, si bien el lenguaje permite llevar a cabo descripciones mixtas que combinan parte comportamental y estructural, así como las construcciones que pueden utilizarse para controlar la entrada y salida de la simulación.

Es común actualmente utilizar descripciones Verilog como entrada para herramientas de síntesis lógica que generan descripciones a nivel de puerta o netlist del circuito, si bien algunas construcciones de Verilog no son sintetizables y es importante diferenciar ambos tipos. También la manera de escribir el código afectará en gran medida al tamaño y la velocidad del circuito sintetizado. Como en la mayoría de los casos se pretenderá sintetizar los circuitos, las construcciones no sintetizables deben usarse sólo para bancos de pruebas (testbenches). Se trata de módulos de programa utilizados para generar las E/S necesarias para simular el resto del diseño normalmente bajo el modelo estímulo/respuesta.

Como en la mayoría de HDLs se distinguen dos tipos/estilos de codificación/modelado/descripción que tienen correspondencia con determinados niveles de abstracción señalados:

  • Estructural, como la descripción del esquemático de un circuito sin almacenamiento, p.ej.:

    assign a = b & c | d; assign d = e & (~c);
  • Procedural, usado para circuitos con almacenamiento o como una descripción dependiente de condiciones o estados, p.ej.:

    always @(posedge clk) count <= count+1;

El estilo procedural es preferido por los diseñadores por la facilidad de codifificación y semejanza con los lenguajes de programación de alto nivel (HLL, del inglés High Level Language), si bien es importante tener en cuenta que la mayoría de construcciones procedurales con asignación implicarán la generación de almacenamiento en síntesis y esto puede no ser deseable en algunos casos donde se desea evitar lógica superflua atendiendo a restricciones de área o de temporización, por lo que se recomienda hacer uso del estilo estructural en circuitos puramente combinacionales.

Verilog HDL Operadores