Articulo de referencia

Verilog

Verilog , estandarizado como IEEE 1364 , es un lenguaje de descripción de hardware (HDL) utilizado para modelar sistemas electrónicos . Se usa con mayor frecuencia en el diseño ...

Verilog , estandarizado como IEEE 1364 , es un lenguaje de descripción de hardware (HDL) utilizado para modelar sistemas electrónicos . Se usa con mayor frecuencia en el diseño y verificación de circuitos digitales, con el nivel de abstracción más alto en el nivel de transferencia de registros . También se utiliza en la verificación de circuitos analógicos y de señales mixtas , así como en el diseño de circuitos genéticos . [ 1 ]

En 2009, el estándar Verilog (IEEE 1364-2005) se fusionó con el estándar SystemVerilog , dando origen al estándar IEEE 1800-2009. Desde entonces, Verilog forma parte oficialmente del lenguaje SystemVerilog. La versión actual es el estándar IEEE 1800-2023. [ 2 ]

Descripción general

Los lenguajes de descripción de hardware como Verilog utilizan una sintaxis similar a la del software, pero a diferencia de los lenguajes de programación, modelan el hardware físico, incluyendo la operación concurrente, la temporización de señales y el comportamiento eléctrico. Existen dos tipos de operadores de asignación : una asignación bloqueante (=) y una asignación no bloqueante (<=). La asignación no bloqueante permite a los diseñadores describir una actualización de la máquina de estados sin necesidad de declarar ni utilizar variables de almacenamiento temporal . Dado que estos conceptos forman parte de la semántica del lenguaje Verilog, los diseñadores podían escribir rápidamente descripciones de circuitos grandes de forma relativamente compacta y concisa. En el momento de su introducción (1984), Verilog representó una enorme mejora en la productividad de los diseñadores de circuitos que ya utilizaban software de captura de esquemas gráficos y programas de software específicos para documentar y simular circuitos electrónicos .

Los diseñadores de Verilog buscaban un lenguaje con una sintaxis similar a la del lenguaje de programación C , que ya se utilizaba ampliamente en el desarrollo de software de ingeniería . Al igual que C, Verilog distingue entre mayúsculas y minúsculas y cuenta con un preprocesador básico (aunque menos sofisticado que el de ANSI C/C++). Sus palabras clave de control de flujo (if/else, for, while, case, etc.) son equivalentes, y su precedencia de operadores es compatible con C. Las diferencias sintácticas incluyen: anchos de bits requeridos para las declaraciones de variables, delimitación de bloques procedimentales (Verilog usa begin/end en lugar de llaves {}), y muchas otras diferencias menores. Verilog requiere que las variables tengan un tamaño definido. En C, estos tamaños se infieren del "tipo" de la variable (por ejemplo, un tipo entero puede ser de 32 bits).

Un diseño Verilog consta de una jerarquía de módulos . Los módulos encapsulan la jerarquía del diseño y se comunican con otros módulos mediante un conjunto de puertos de entrada, salida y bidireccionales declarados . Internamente, un módulo puede contener cualquier combinación de lo siguiente: declaraciones de red/variables (wire, reg, integer, etc.), bloques de instrucciones concurrentes y secuenciales , e instancias de otros módulos (subjerarquías). Las instrucciones secuenciales se colocan dentro de un bloque begin/end y se ejecutan en orden secuencial dentro del bloque. Sin embargo, los bloques en sí se ejecutan concurrentemente, lo que convierte a Verilog en un lenguaje de flujo de datos .

El concepto de "cable" en Verilog consta de valores de señal (de cuatro estados: "1, 0, flotante, indefinido") y de intensidades de señal (fuerte, débil, etc.). Este sistema permite modelar de forma abstracta líneas de señal compartidas, donde múltiples fuentes controlan una red común. Cuando un cable tiene varios controladores, su valor (legible) se determina mediante una función de los controladores y sus intensidades.

Un subconjunto de instrucciones en el lenguaje Verilog es sintetizable . Los módulos Verilog que cumplen con un estilo de codificación sintetizable, conocido como RTL ( nivel de transferencia de registros ), pueden implementarse físicamente mediante software de síntesis. Este software transforma algorítmicamente el código fuente Verilog (abstracto) en una lista de conexiones , una descripción lógicamente equivalente que consta únicamente de primitivas lógicas elementales (AND, OR, NOT, biestables, etc.) disponibles en una tecnología FPGA o VLSI específica . Las manipulaciones posteriores de la lista de conexiones dan como resultado un plano de fabricación de circuitos (como un conjunto de fotomáscaras para un ASIC o un archivo bitstream para una FPGA ).

Historia

Comienzo

Verilog fue creado por Prabhu Goel , Phil Moorby y Chi-Lai Huang entre finales de 1983 y principios de 1984. [ 3 ] Chi-Lai Huang había trabajado previamente en una descripción de hardware, LALSD, un lenguaje desarrollado por el profesor SYH Su , para su trabajo de doctorado. [ 4 ] El titular de los derechos de este proceso, en ese momento propietario, era "Automated Integrated Design Systems" (más tarde renombrado a Gateway Design Automation en 1985). Gateway Design Automation fue adquirido por Cadence Design Systems en 1990. Cadence ahora tiene los derechos de propiedad completos de Verilog de Gateway y Verilog-XL, el simulador HDL que se convertiría en el estándar de facto (de simuladores lógicos Verilog ) durante la década siguiente. Originalmente, Verilog solo estaba destinado a describir y permitir la simulación; la síntesis automatizada de subconjuntos del lenguaje a estructuras físicamente realizables (compuertas, etc.) se desarrolló después de que el lenguaje hubiera alcanzado un uso generalizado.

Verilog es una palabra compuesta por "verificación" y "lógica". [ 5 ]

Verilog-95

Ante el creciente éxito de VHDL en aquel entonces, Cadence decidió poner el lenguaje a disposición para su estandarización abierta . Cadence transfirió Verilog al dominio público bajo la organización Open Verilog International (OVI) (ahora conocida como Accellera ). Posteriormente, Verilog se presentó al IEEE y se convirtió en el estándar IEEE 1364-1995, comúnmente conocido como Verilog-95.

En ese mismo período, Cadence inició la creación de Verilog-A para brindar soporte de estándares a su simulador analógico Spectre . Verilog-A nunca se concibió como un lenguaje independiente, sino como un subconjunto de Verilog-AMS , que a su vez incluía Verilog-95.

Verilog 2001

Se presentaron extensiones a Verilog-95 al IEEE para subsanar las deficiencias que los usuarios habían detectado en el estándar Verilog original. Estas extensiones se convirtieron en el estándar IEEE 1364-2001, conocido como Verilog-2001.

Verilog-2001 supone una mejora significativa respecto a Verilog-95. En primer lugar, añade soporte explícito para redes y variables con signo (en complemento a dos). Anteriormente, los programadores tenían que realizar operaciones con signo mediante manipulaciones de bits complejas (por ejemplo, el bit de acarreo de una simple suma de 8 bits requería una descripción explícita del álgebra booleana para determinar su valor correcto). La misma función en Verilog-2001 se puede describir de forma más concisa mediante uno de los operadores integrados: +, -, /, *, >>>. Una construcción generate-endgenerate (similar a generate-endgenerate de VHDL) permite a Verilog-2001 controlar la instanciación de instancias y sentencias mediante operadores de decisión normales (case-if-else). Mediante generate-endgenerate, Verilog-2001 puede instanciar un array de instancias, controlando la conectividad de cada una de ellas. La E/S de archivos se ha mejorado con varias tareas del sistema nuevas. Y, por último, se introdujeron algunas adiciones de sintaxis para mejorar la legibilidad del código (por ejemplo, always @*, anulación de parámetros con nombre, declaración de encabezado de función/tarea/módulo al estilo C).

Verilog-2001 es la versión de Verilog compatible con la mayoría de los paquetes de software EDA comerciales .

Verilog 2005

No debe confundirse con SystemVerilog , Verilog 2005 ( norma IEEE 1364-2005) consta de correcciones menores, aclaraciones de especificaciones y algunas características nuevas del lenguaje (como la palabra clave uwire).

Una parte independiente del estándar Verilog, Verilog-AMS , intenta integrar el modelado analógico y de señales mixtas con el Verilog tradicional.

SystemVerilog

La aparición de lenguajes de verificación de hardware como OpenVera y el lenguaje e de Verisity impulsó el desarrollo de Superlog por parte de Co-Design Automation Inc. (adquirida por Synopsys ). Los fundamentos de Superlog y Vera fueron donados a Accellera , que posteriormente se convirtió en el estándar IEEE P1800-2005: SystemVerilog.

SystemVerilog es un superconjunto de Verilog-2005, con muchas características y capacidades nuevas para facilitar la verificación y el modelado del diseño. A partir de 2009, los estándares de lenguaje SystemVerilog y Verilog se fusionaron en SystemVerilog 2009 (Estándar IEEE 1800-2009).

Actualizaciones desde 2009

El estándar SystemVerilog se actualizó posteriormente en 2012, [ 6 ] 2017, [ 7 ] y más recientemente en diciembre de 2023. [ 2 ]

Ejemplo

A continuación se muestra un ejemplo sencillo con dos chanclas :

módulo de nivel superior ( reloj , reinicio ); entrada reloj ; entrada reinicio ;registro flop1 ; registro flop2 ;siempre @ ( posedge reset o posedge clock ) si ( reset ) begin flop1 <= 0 ; flop2 <= 1 ; end else begin flop1 <= flop2 ; flop2 <= flop1 ; end endmodule

El <=operador en Verilog es otro aspecto que lo distingue como lenguaje de descripción de hardware, a diferencia de un lenguaje procedimental convencional. Se conoce como asignación "no bloqueante". Su acción no se registra hasta que se ejecuta el bloque always. Esto significa que el orden de las asignaciones es irrelevante y producirá el mismo resultado: los flip-flops 1 y 2 intercambiarán valores en cada ciclo de reloj.

El otro operador de asignación =se denomina asignación bloqueante. Cuando =se utiliza la asignación, a efectos lógicos, la variable de destino se actualiza inmediatamente. En el ejemplo anterior, si las instrucciones hubieran utilizado el =operador bloqueante en lugar de <=, flop1 y flop2 no se habrían intercambiado. En cambio, como en la programación tradicional, el compilador habría entendido que simplemente debía asignar a flop1 el valor de flop2 (e ignorar la lógica redundante para asignar a flop2 el valor de flop1).

A continuación se muestra un ejemplo de circuito contador :

module Div20x ( rst , clk , cet , cep , count , tc ); // TÍTULO 'Contador divisor por 20 con habilitaciones' // enable CEP es solo una habilitación de reloj // enable CET es una habilitación de reloj y // habilita la salida TC // un contador usando el lenguaje Verilogtamaño del parámetro = 5 ; longitud del parámetro = 20 ;entrada rst ; // Estas entradas/salidas representan entrada clk ; // conexiones al módulo. entrada cet ; entrada cep ;salida [ tamaño - 1 : 0 ] recuento ; salida tc ;reg [ tamaño - 1 : 0 ] count ; // Las señales asignadas // dentro de un always // (o initial)block // deben ser de tipo regcable tc ; // Las demás señales son de tipo cable// La instrucción always que aparece a continuación es una instrucción de ejecución paralela que // se ejecuta cada vez que las señales // rst o clk pasan de nivel bajo a nivel alto.always @ ( posedge clk or posedge rst ) if ( rst ) // Esto provoca el reinicio del contador count <= { size { 1 'b0 }}; else if ( cet && cep ) // Habilita ambos true begin if ( count == length - 1 ) count <= { size { 1 'b0 }}; else count <= count + 1 'b1 ; end// el valor de tc se asigna continuamente // el valor de la expresión asignar tc = ( cet && ( count == length - 1 ));fin del módulo

Un ejemplo de retrasos:

... reg a , b , c , d ; cable e ; ... always @( b or e ) begin a = b & e ; b = a | b ; # 5 c = b ; d = # 6 c ^ e ; end

La cláusula `always` anterior ilustra el otro tipo de método de uso, es decir, se ejecuta cada vez que cambia alguna de las entidades de la lista ( b o e ). Cuando una de estas cambia, a se le asigna inmediatamente un nuevo valor y, debido a la asignación bloqueante, a b se le asigna un nuevo valor posteriormente (teniendo en cuenta el nuevo valor de a ). Tras un retraso de 5 unidades de tiempo, a c se le asigna el valor de b y el valor de c ^ e se almacena en un espacio invisible. Luego, tras 6 unidades de tiempo más, a d se le asigna el valor que se había almacenado.

Las señales que se generan dentro de un proceso (un bloque initial o always) deben ser de tipo reg . Las señales que se generan fuera de un proceso deben ser de tipo wire . La palabra clave reg no implica necesariamente un registro de hardware.

Definición de constantes

La definición de constantes en Verilog admite la adición de un parámetro de ancho. La sintaxis básica es:

< tamaño >'< base >< valor >

Dónde:

  • tamaño: El ancho en bits de la constante (opcional, pero muy recomendable)
  • base: El especificador de base: b(binario), o(octal), d(decimal), h(hexadecimal)
  • valor: El valor numérico en la base especificada

Ejemplos:

  • 16'h1A23 o 16'h1a23: se permiten mayúsculas y minúsculas en hexadecimal 1A23 (usando 16 bits).
  • 20'd44 – Decimal 44 (usando 20 bits – la extensión 0 es automática)
  • 4'b1010 – Binario 1010 (usando 4 bits)
  • 6'o77 – Octal 77 (usando 6 bits)

Constructos sintetizables

En Verilog existen varias instrucciones que no tienen equivalente en hardware real, como el comando $display. Sin embargo, los ejemplos que se presentan aquí constituyen el subconjunto clásico (y limitado) del lenguaje que sí tiene una correspondencia directa con compuertas lógicas reales.

// Ejemplos de multiplexores: tres maneras de hacer lo mismo.// El primer ejemplo utiliza la asignación continua wire out ; assign out = sel ? a : b ;// El segundo ejemplo utiliza un procedimiento // para lograr lo mismo.reg out ; always @( a or b or sel ) begin case ( sel ) 1 'b0 : out = b ; 1 'b1 : out = a ; endcase end// Finalmente, puedes usar if/else en una // estructura procedimental. reg out ; always @( a or b or sel ) if ( sel ) out = a ; else out = b ;

La siguiente estructura interesante es un pestillo transparente ; este pasa la entrada a la salida cuando la señal de puerta está configurada en "paso directo" y captura la entrada y la almacena al pasar la señal de puerta a "retención". La salida permanece estable independientemente de la señal de entrada mientras la puerta está configurada en "retención". En el ejemplo siguiente, el nivel de "paso directo" de la puerta se alcanza cuando el valor de la cláusula if es verdadero, es decir, gate = 1. Esto se lee como "si gate es verdadero, la señal din se envía continuamente a latch_out". Una vez que la cláusula if es falsa, el último valor en latch_out permanece y es independiente del valor de din.

// Ejemplo de pestillo transparentereg latch_out ; always @( gate or din ) if ( gate ) latch_out = din ; // Pasar el estado // Tenga en cuenta que el else no es necesario aquí. La variable // latch_out seguirá el valor de din mientras gate esté // en alto. Cuando gate pase a bajo, latch_out permanecerá constante.

El flip-flop es la siguiente plantilla importante; en Verilog, el D-flop es el más simple y se puede modelar como:

reg q ; siempre @( posedge clk ) q <= d ;

Lo más importante a destacar en el ejemplo es el uso de la asignación no bloqueante. Una regla general básica es usar <= cuando hay una instrucción de borde o borde negativo dentro de la cláusula always.

Una variante del D-flop es aquella con reinicio asíncrono; existe la convención de que el estado de reinicio será la primera cláusula if dentro de la instrucción.

reg q ; always @( posedge clk or posedge reset ) if ( reset ) q <= 0 ; else q <= d ;

La siguiente variante incluye tanto una condición de reinicio asíncrono como una condición de activación asíncrona; de nuevo entra en juego la convención, es decir, al término de reinicio le sigue el término de activación.

reg q ; always @( posedge clk or posedge reset or posedge set ) if ( reset ) q <= 0 ; else if ( set ) q <= 1 ; else q <= d ;

Nota: Si este modelo se utiliza para simular un flip-flop Set/Reset, pueden producirse errores de simulación. Considere la siguiente secuencia de eventos de prueba: 1) Reset pasa a nivel alto; 2) CLK pasa a nivel alto; 3) Set pasa a nivel alto; 4) CLK vuelve a pasar a nivel alto; 5) Reset pasa a nivel bajo, seguido de 6) Set pasa a nivel bajo. Suponga que no hay violaciones de setup ni hold.

En este ejemplo, la instrucción always @ se ejecutaría primero cuando se produce el flanco ascendente de reset, lo que pondría q en un valor de 0. La siguiente vez que se ejecute el bloque always será con el flanco ascendente de clk, lo que nuevamente mantendrá q en un valor de 0. El bloque always se ejecuta entonces cuando set pasa a nivel alto, lo que, debido a que reset está en nivel alto, obliga a q a permanecer en 0. Esta condición puede ser correcta o no, dependiendo del flip-flop real. Sin embargo, este no es el problema principal de este modelo. Nótese que cuando reset pasa a nivel bajo, set sigue en nivel alto. En un flip-flop real, esto hará que la salida pase a 1. Sin embargo, en este modelo no ocurrirá porque el bloque always se activa con los flancos ascendentes de set y reset, no con los niveles. Puede ser necesario un enfoque diferente para los flip-flops set/reset.

La última variante básica implementa un flip-flop D con un multiplexor que alimenta su entrada. El multiplexor tiene una entrada D y retroalimentación del propio flip-flop. Esto permite una función de carga controlada.

// Estructura básica con una ruta de retroalimentación EXPLÍCITA siempre @( posedge clk ) if ( gate ) q <= d ; else q <= q ; // ruta de retroalimentación explícita// La estructura más común ASUME que la retroalimentación está presente // Esta es una suposición segura ya que así es como el // compilador de hardware la interpretará. Esta estructura // se parece mucho a un pestillo. Las diferencias son el // '''@(posedge clk)''' y el '''<=''' no bloqueante // always @( posedge clk ) if ( gate ) q <= d ; // el multiplexor "else" está "implícito"

Cabe destacar que en esta descripción no se mencionan bloques "iniciales". Existe una diferencia entre las herramientas de síntesis de FPGA y ASIC en esta estructura. Las herramientas de FPGA permiten bloques iniciales donde se establecen valores de registro en lugar de usar una señal de "reinicio". Las herramientas de síntesis de ASIC no admiten esta funcionalidad. Esto se debe a que el estado inicial de una FPGA se descarga en las tablas de memoria de la FPGA. Un ASIC es una implementación de hardware real.

Inicial y siempre

Existen dos formas distintas de declarar un proceso Verilog: las palabras clave ` always` e ` initial` . ` always` indica un proceso de ejecución libre, mientras que ` initial` indica un proceso que se ejecuta exactamente una vez. Ambas construcciones comienzan su ejecución en el tiempo 0 del simulador y se ejecutan hasta el final del bloque. Una vez que un bloque `always` ha llegado a su fin, se reprograma (de nuevo). Es un error común creer que un bloque `initial` se ejecuta antes que un bloque `always`. De hecho, es mejor considerar el bloque `initial` como un caso especial del bloque ` always` , que finaliza después de completarse por primera vez.

//Ejemplos: initial begin a = 1 ; // Asigna un valor al registro a en el tiempo 0 # 1 ; // Espera 1 unidad de tiempo b = a ; // Asigna el valor del registro a al registro b endalways @( a or b ) // Cada vez que a o b CAMBIAN, ejecuta el proceso begin if ( a ) c = b ; else d = ~ b ; end // Terminado este bloque, ahora regresa al principio (es decir, al control de eventos @)always @( posedge a ) // Se ejecuta siempre que el registro a tenga un cambio de bajo a alto a <= b ;

Estos son los usos clásicos de estas dos palabras clave, pero existen dos usos adicionales importantes. El más común es usar la palabra clave `always` sin la lista de sensibilidad `@(...)` . Es posible usar `always` como se muestra a continuación:

always begin // Siempre comienza a ejecutarse en el tiempo 0 y NUNCA se detiene clk = 0 ; // Establece clk en 0 # 1 ; // Espera 1 unidad de tiempo clk = 1 ; // Establece clk en 1 # 1 ; // Espera 1 unidad de tiempo end // Continúa ejecutándose, por lo que continúa desde el principio del begin

La palabra clave always actúa de forma similar a la construcción while(1) {..} del lenguaje C en el sentido de que se ejecutará indefinidamente.

La otra excepción interesante es el uso de la palabra clave inicial con la adición de la palabra clave forever .

El ejemplo que aparece a continuación es funcionalmente idéntico al ejemplo anterior que dice "siempre" .

inicial para siempre // Comienza en el tiempo 0 y repite el inicio/fin para siempre begin clk = 0 ; // Establece clk en 0 # 1 ; // Espera 1 unidad de tiempo clk = 1 ; // Establece clk en 1 # 1 ; // Espera 1 unidad de tiempo end

Bifurcar/unir

Verilog utiliza el par fork/join para crear procesos paralelos. Todas las instrucciones (o bloques) entre un par fork/join comienzan a ejecutarse simultáneamente cuando el flujo de ejecución llega a fork . La ejecución continúa después de join una vez que se completa la instrucción o bloque de mayor duración entre fork y join .

bifurcación inicial $write ( "A" ); // Imprimir carácter A $write ( "B" ); // Imprimir carácter B begin # 1 ; // Esperar 1 unidad de tiempo $write ( "C" ); // Imprimir carácter C end join

Tal como está escrito, es posible que se impriman las secuencias "ABC" o "BAC". El orden de simulación entre la primera y la segunda instrucción $write depende de la implementación del simulador y puede ser aleatorio intencionadamente. Esto permite que la simulación contenga tanto condiciones de carrera accidentales como comportamientos no deterministas deliberados.

Nótese que VHDL no puede generar dinámicamente múltiples procesos como Verilog. [ 8 ]

Condiciones de la carrera

En Verilog, el orden de ejecución no siempre está garantizado. Esto se puede ilustrar mejor con un ejemplo clásico. Considere el siguiente fragmento de código:

inicial a = 0 ;b inicial = a ;initial begin # 1 ; $display ( "Valor a=%d Valor de b=%d" , a , b ); end

Dependiendo del orden de ejecución de los bloques iniciales, podría ser cero y cero, o bien cero y algún otro valor arbitrario no inicializado. La $displayinstrucción siempre se ejecutará después de que ambos bloques de asignación hayan finalizado, debido al retardo #1.

Operadores

Nota: Estos operadores no se muestran en orden de precedencia.

Lógica de cuatro valores

El estándar IEEE 1364 define una lógica de cuatro valores con cuatro estados: 0, 1, Z ( alta impedancia ) y X (valor lógico desconocido). Para el lenguaje VHDL, su competidor, existe un estándar específico para lógica multivaluada, el IEEE 1164 , con nueve niveles. [ 9 ]

Tareas del sistema

Las tareas del sistema permiten gestionar operaciones de entrada/salida sencillas y diversas funciones de medición de diseño durante la simulación. Todas las tareas del sistema llevan el prefijo $ para distinguirlas de las tareas y funciones del usuario. Esta sección presenta una breve lista de las tareas más utilizadas. No se trata de una lista exhaustiva.

  • $display – Imprime en pantalla una línea seguida de un salto de línea automático.
  • $write – Imprime en pantalla una línea sin el salto de línea.
  • $swrite – Imprime en una variable una línea sin el salto de línea.
  • $sscanf – Lee de una variable una cadena con formato especificado. (*Verilog-2001)
  • $fopen – Abre un identificador a un archivo (lectura o escritura)
  • $fdisplay – Imprime una línea de un archivo seguida de un salto de línea automático.
  • $fwrite – Imprime en un archivo una línea sin el salto de línea.
  • $fscanf – Lee desde un archivo una cadena con un formato especificado. (*Verilog-2001)
  • $fclose – Cierra y libera un identificador de archivo abierto.
  • $readmemh – Lee el contenido de un archivo hexadecimal y lo almacena en una matriz de memoria.
  • $readmemb – Lee el contenido de un archivo binario y lo almacena en una matriz de memoria.
  • $monitor – Imprime todas las variables listadas cuando cambia su valor.
  • $time – Valor del tiempo de simulación actual.
  • $dumpfile – Declara el nombre del archivo de salida en formato VCD ( Value Change Dump ).
  • $dumpvars – Activar y volcar las variables.
  • $dumpports – Activa y vuelca las variables en formato Extended-VCD.
  • $random – Devuelve un valor aleatorio.

Interfaz de lenguaje de programación (PLI)

La PLI proporciona al programador un mecanismo para transferir el control de Verilog a una función de programa escrita en lenguaje C. Está oficialmente descontinuada por la norma IEEE Std 1364-2005 en favor de la interfaz procedimental de Verilog , más reciente , que reemplaza por completo a la PLI.

El PLI (ahora VPI) permite que Verilog interactúe con otros programas escritos en lenguaje C, como entornos de prueba , simuladores de conjuntos de instrucciones de microcontroladores , depuradores , etc. Por ejemplo, proporciona las funciones C tf_putlongp()[ 10 ] y tf_getlongp()[ 11 ] , que se utilizan para escribir y leer, respectivamente, el argumento entero de 64 bits de la tarea o función Verilog actual. Para enteros de 32 bits, se utilizan tf_putp()[ 12 ] y tf_getp()[ 13 ] .

Software de simulación

Para obtener información sobre simuladores de Verilog, consulte la lista de simuladores de Verilog .

Véase también

Material adicional

Idiomas similares

  • VHDL – Lenguaje de descripción de hardware , el principal competidor de Verilog y SystemVerilog. 
  • Verilog-A – Lenguaje de modelado para circuitos analógicos y 
  • Verilog-AMS : lenguaje de descripción de hardware basado en Verilog para circuitos integrados de señal mixta. 
  • SystemVerilog : lenguaje para la descripción y verificación de hardware. 
  • SystemC : extensiones de C++ para simular sistemas embebidos que proporcionan semántica basada en eventos HDL. 
  • e (lenguaje de verificación) – Lenguaje de verificación de hardware 
  • Lenguaje de especificación de propiedades – Lógica temporal 
  • Chisel : lenguaje de descripción de hardware (HDL) de código abierto construido sobre Scala. 

Referencias

  1. Nielsen AA, Der BS, Shin J, Vaidyanathan P, Paralanov V, Strychalski EA, Ross D, Densmore D, Voigt CA (2016). "Automatización del diseño de circuitos genéticos" . Science . 352 (6281) aac7341. doi : 10.1126/science.aac7341 . PMID 27034378 . 
  2. 1 2 IEEE 1800-2023, Borrador de norma aprobado por IEEE para SystemVerilog: lenguaje unificado para el diseño, especificación y verificación de hardware , IEEE , 2023
  3. "El inventor de Verilog se alza con el premio Kaufman de EDA" . EE Times . 7 de noviembre de 2005.
  4. Huang, Chi-Lai; Su, SYH "Enfoques para el diseño de sistemas lógicos asistidos por computadora utilizando el lenguaje de descripción de hardware". Actas del Simposio Internacional de Computación de 1980, Taipéi, Taiwán, diciembre de 1980. págs. 772–790. OCLC 696254754 .  
  5. "Historia oral de Philip Raymond "Phil" Moorby" (PDF) . Museo de Historia de la Computación. 22 de abril de 2013. págs. 23–25 . 
  6. IEEE 1800-2012 , IEEE , 2012
  7. IEEE 1800-2017 , IEEE , 2017
  8. Cummings, Clifford E. (2003). "SystemVerilog: ¿Es esta la fusión de Verilog y VHDL?" (PDF) . SNUG Boston 2003.
  9. Miller, D. Michael; Thornton, Mitchell A. (2008). Lógica multivaluada: conceptos y representaciones . Synthesis Lectures on Digital Circuits and Systems. Vol. 12. Morgan & Claypool. ISBN  978-1-59829-190-2.
  10. "Estándar IEEE Verilog® Lenguaje de descripción de hardware" (PDF) . pág. 652(25.38) . Consultado el 12 de noviembre de 2023 . 
  11. "Estándar IEEE Verilog® Lenguaje de descripción de hardware" (PDF) . pág. 628(25.28) . Consultado el 12 de noviembre de 2023 . 
  12. "Estándar IEEE Verilog® Lenguaje de descripción de hardware" (PDF) . pág. 653(25.39) . Consultado el 25 de noviembre de 2023 . 
  13. "Estándar IEEE Verilog® Lenguaje de descripción de hardware" (PDF) . pág. 631(25.21) . Consultado el 25 de noviembre de 2023 . 
Notas
  • Estándar IEEE para el lenguaje de descripción de hardware Verilog . 2006. doi : 10.1109/IEEESTD.2006.99495 . ISBN 0-7381-4850-4.
  • Lenguaje de descripción de hardware Verilog estándar IEEE . 2001. doi : 10.1109/IEEESTD.2001.93352 . ISBN 0-7381-2826-0.
  • IEC 61691-4 Ed.1 (IEEE STD 1364(TM)-2001): Lenguajes de comportamiento - Parte 4: Verilog(C) Lenguaje de descripción de hardware . 2004. doi : 10.1109/IEEESTD.2004.95753 . ISBN 2-8318-7675-3.
  • Lenguaje de descripción de hardware estándar IEEE basado en el lenguaje de descripción de hardware Verilog® . 1996. doi : 10.1109/IEEESTD.1996.81542 . ISBN 978-0-7381-3065-1.
  • Thomas, Donald E.; Moorby, Phillip R. (2013). El lenguaje de descripción de hardware Verilog® (3.ª  ed.). Springer. ISBN 978-1475724646.
  • Curso ECE576 de Cornell que ilustra las estructuras de síntesis.
  • Bergeron, Janick (2012). Writing Testbenchs: Functional Verification of HDL Models (2.ª  ed.). Springer. ISBN 978-1-4615-0302-6.(La Biblia de los bancos de pruebas HDL)

Desarrollo de estándares

  • "Estándar IEEE para el lenguaje de descripción de hardware Verilog". IEEE STD 1364-2005 (Revisión de IEEE STD 1364-2001) : 1–590 . Abril de 2006. doi : 10.1109/IEEESTD.2006.99495 . ISBN 978-0-7381-4851-9.– El estándar oficial para Verilog 2005 (no es gratuito).
  • IEEE P1364 – Grupo de trabajo para Verilog (inactivo)
  • IEEE P1800 . Archivado el 12 de marzo de 2016 en Wayback Machine – Grupo de trabajo para SystemVerilog (sustituye al anterior).
  • Sintaxis de Verilog : una descripción de la sintaxis de 1995 en formato Backus-Naur . Esta descripción es anterior al estándar IEEE-1364.

extensiones de idioma

  • Verilog AUTOs : un metacommentario de código abierto utilizado por la industria de la propiedad intelectual para simplificar el mantenimiento del código Verilog.