stringtranslate.com

Verilog

Verilog , estandarizado como IEEE 1364 , es un lenguaje de descripción de hardware (HDL) utilizado para modelar sistemas electrónicos . Se utiliza más comúnmente en el diseño y verificación de circuitos digitales en el nivel de abstracción de transferencia de registros . [ cita requerida ] También se utiliza en la verificación de circuitos analógicos y circuitos de señal mixta , 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 , creando el estándar IEEE 1800-2009. Desde entonces, Verilog ha sido oficialmente parte 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 son similares a los lenguajes de programación de software porque incluyen formas de describir el tiempo de propagación y la intensidad de la señal (sensibilidad). Hay dos tipos de operadores de asignación : una asignación de bloqueo (=) 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 y utilizar variables de almacenamiento temporal . Dado que estos conceptos son parte de la semántica del lenguaje Verilog, los diseñadores podían escribir rápidamente descripciones de circuitos grandes en una forma relativamente compacta y concisa. En el momento de la introducción de Verilog (1984), Verilog representó una enorme mejora de la productividad para los diseñadores de circuitos que ya utilizaban software de captura de esquemas gráficos y programas de software escritos especialmente para documentar y simular circuitos electrónicos .

Los diseñadores de Verilog querían un lenguaje con una sintaxis similar al lenguaje de programación C , que ya se usaba ampliamente en el desarrollo de software de ingeniería . Al igual que C, Verilog distingue entre mayúsculas y minúsculas y tiene un preprocesador básico (aunque menos sofisticado que el de ANSI C/C++). Sus palabras clave de flujo de control (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 declaraciones de variables, demarcación de bloques de procedimiento (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 de Verilog consta de una jerarquía de módulos . Los módulos encapsulan la jerarquía de diseño y se comunican con otros módulos a través de un conjunto de puertos declarados de entrada, salida y bidireccionales. Internamente, un módulo puede contener cualquier combinación de lo siguiente: declaraciones de red/variable (wire, reg, entire, etc.), bloques de instrucciones concurrentes y secuenciales e instancias de otros módulos (subjerarquías). Las instrucciones secuenciales se colocan dentro de un bloque de inicio/fin y se ejecutan en orden secuencial dentro del bloque. Sin embargo, los bloques en sí se ejecutan simultáneamente, lo que convierte a Verilog en un lenguaje de flujo de datos .

El concepto de "cable" de Verilog consta tanto de valores de señal (de 4 estados: "1, 0, flotante, indefinido") como de intensidades de señal (fuerte, débil, etc.). Este sistema permite el modelado abstracto de líneas de señal compartidas, donde múltiples fuentes impulsan una red común. Cuando un cable tiene múltiples controladores, el valor (legible) del cable se resuelve mediante una función de los controladores de origen y sus intensidades.

Un subconjunto de instrucciones en el lenguaje Verilog son sintetizables . Los módulos Verilog que se ajustan a un estilo de codificación sintetizable, conocido como RTL ( nivel de transferencia de registro ), pueden realizarse físicamente mediante software de síntesis. El software de síntesis transforma algorítmicamente la fuente Verilog (abstracta) en una lista de conexiones , una descripción lógicamente equivalente que consiste únicamente en primitivas lógicas elementales (AND, OR, NOT, flip-flops, etc.) que están disponibles en una tecnología FPGA o VLSI específica . Las manipulaciones posteriores de la lista de conexiones conducen finalmente a un plano de fabricación de circuitos (como un conjunto de máscaras fotográficas para un ASIC o un archivo de flujo de bits para un 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 anteriormente 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 como Gateway Design Automation en 1985). Gateway Design Automation fue comprado por Cadence Design Systems en 1990. Cadence ahora tiene todos los derechos de propiedad 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 ) para la próxima década. 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 (puertas, etc.) se desarrolló después de que el lenguaje hubiera alcanzado un uso generalizado.

Verilog es una combinación de las palabras "verificación" y "lógica". [5]

Verilog-95

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

En el mismo período, Cadence inició la creación de Verilog-A para que su simulador analógico Spectre tuviera compatibilidad con estándares . Verilog-A nunca estuvo pensado para ser un lenguaje independiente y es un subconjunto de Verilog-AMS que incluía Verilog-95.

Verilog 2001

Se enviaron extensiones de Verilog-95 al IEEE para cubrir las deficiencias que los usuarios habían encontrado en el estándar Verilog original. Estas extensiones se convirtieron en el estándar IEEE 1364-2001, conocido como Verilog-2001.

Verilog-2001 es una importante actualización de Verilog-95. En primer lugar, añade soporte explícito para redes y variables con signo (complemento a 2). Anteriormente, los autores de código tenían que realizar operaciones con signo utilizando manipulaciones complicadas a nivel de bits (por ejemplo, el bit de ejecución 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 sucinta 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 una matriz de instancias, con control sobre la conectividad de las instancias individuales. La E/S de archivos se ha mejorado con varias tareas nuevas del sistema. Y, por último, se introdujeron algunas adiciones de sintaxis para mejorar la legibilidad del código (por ejemplo, siempre, @*, anulación de parámetro nombrado, declaración de encabezado de función/tarea/módulo de estilo C).

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

Verilog 2005

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

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

Sistema Verilog

La aparición de lenguajes de verificación de hardware como OpenVera y el lenguaje e de Verisity alentó el desarrollo de Superlog por parte de Co-Design Automation Inc (adquirida por Synopsys ). Las bases de Superlog y Vera fueron donadas a Accellera , que luego 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 de diseños. 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 de dos flip-flops :

módulo de nivel superior ( reloj , reinicio ); entrada reloj ; entrada reinicio ;      registro flop1 ; registro flop2 ;    siempre @ ( restablecer posedge o reloj posedge ) si ( restablecer ) comenzar flop1 <= 0 ; flop2 <= 1 ; fin de lo contrario comenzar flop1 <= flop2 ; flop2 <= flop1 ; fin finmódulo                         

El <=operador en Verilog es otro aspecto de su carácter de lenguaje de descripción de hardware en lugar de un lenguaje de procedimiento normal. Esto se conoce como una asignación "sin bloqueo". Su acción no se registra hasta que se ha ejecutado el bloque always. Esto significa que el orden de las asignaciones es irrelevante y producirá el mismo resultado: flop1 y flop2 intercambiarán valores en cada reloj.

El otro operador de asignación =se denomina asignación de bloqueo. Cuando =se utiliza la asignación, a los efectos de la lógica, la variable de destino se actualiza inmediatamente. En el ejemplo anterior, si las instrucciones hubieran utilizado el =operador de bloqueo en lugar de <=, flop1 y flop2 no se habrían intercambiado. En cambio, como en la programación tradicional, el compilador entendería que simplemente debe establecer flop1 igual a flop2 (y posteriormente ignorar la lógica redundante para establecer flop2 igual a flop1).

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

módulo Div20x ( rst , clk , cet , cep , count , tc ); // TÍTULO 'Contador de división por 20 con habilitaciones' // habilitar CEP es solo una habilitación de reloj // habilitar CET es una habilitación de reloj y // habilita la salida TC // un contador que usa el lenguaje Verilog       tamaño del parámetro = 5 ; longitud del parámetro = 20 ;      entrada rst ; // Estas entradas/salidas representan entradas 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 bloque siempre // (o inicial) // deben ser del tipo reg      cable tc ; // Las demás señales son del tipo cable  // La siguiente declaración always es una declaración de ejecución paralela que se ejecuta en cualquier momento en que las señales rst o clk pasan de baja a alta.siempre @ ( posedge clk o posedge rst ) if ( rst ) // Esto provoca el reinicio del cntr 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 ));       módulo final

Un ejemplo de retrasos:

... reg a , b , c , d ; cable e ; ... siempre @( b o e ) comienza a = b & e ; b = a | b ; # 5 c = b ; d = # 6 c ^ e ; fin                              

La cláusula always anterior ilustra el otro tipo de método de uso, es decir, se ejecuta siempre que cambie cualquiera de las entidades de la lista ( b o e ). Cuando una de estas cambia, a a se le asigna inmediatamente un nuevo valor y, debido a la asignación de bloqueo, a b se le asigna un nuevo valor posteriormente (teniendo en cuenta el nuevo valor de a ). Después de un retraso de 5 unidades de tiempo, a c se le asigna el valor de b y el valor de c ^ e se guarda en un almacenamiento invisible. Luego, después de 6 unidades de tiempo más, a d se le asigna el valor que estaba guardado.

Las señales que se controlan desde dentro de un proceso (un bloque inicial o siempre) deben ser del tipo reg . Las señales que se controlan desde fuera de un proceso deben ser del 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:

< Ancho en bits >'< letra base >< número >

Ejemplos:

Construcciones sintetizables

Existen varias instrucciones en Verilog que no tienen analogía en hardware real, como el comando $display. Sin embargo, los ejemplos que se presentan aquí son el subconjunto clásico (y limitado) del lenguaje que tiene una correspondencia directa con puertas reales.

// Ejemplos de Mux: Tres formas de hacer lo mismo.// El primer ejemplo utiliza asignación continua wire out ; asignar salida = sel ? a : b ;        // el segundo ejemplo utiliza un procedimiento // para lograr lo mismo.reg out ; siempre @( a o b o sel ) begin case ( sel ) 1 'b0 : out = b ; 1 'b1 : out = a ; endcase end                  // Finalmente, puedes usar if/else en una // estructura de procedimiento. reg out ; siempre @( a o b o sel ) if ( sel ) out = a ; else out = b ;               

La siguiente estructura interesante es un latch transparente ; pasará la entrada a la salida cuando la señal de la compuerta esté configurada para "pass-through", y captura la entrada y la almacena en la transición de la señal de la compuerta a "hold". La salida permanecerá estable independientemente de la señal de entrada mientras la compuerta esté configurada para "hold". En el ejemplo siguiente, el nivel de "pass-through" de la compuerta sería cuando el valor de la cláusula if es verdadero, es decir, gate = 1. Esto se lee "si gate es verdadero, el din se envía a latch_out continuamente". Una vez que la cláusula if es falsa, el último valor en latch_out permanecerá y es independiente del valor de din.

// Ejemplo de pestillo transparentereg latch_out ; siempre @( gate o din ) si ( gate ) latch_out = din ; // Pasar por el estado // Tenga en cuenta que el else no es necesario aquí. La variable // latch_out seguirá el valor de din mientras gate esté // alto. Cuando gate esté 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 que se debe tener en cuenta en el ejemplo es el uso de la asignación no bloqueante. Una regla básica es utilizar <= cuando hay una declaración posedge o negedge dentro de la cláusula always.

Una variante del D-flop es una con un reinicio asincrónico; existe una convención de que el estado de reinicio será la primera cláusula if dentro de la declaración.

reg q ; siempre @( posedge clk o posedge reset ) si ( reset ) q <= 0 ; de lo contrario q <= d ;              

La siguiente variante incluye tanto una condición de reinicio asincrónica como una condición de establecimiento asincrónico; nuevamente entra en juego la convención, es decir, el término de reinicio es seguido por el término de establecimiento.

reg q ; siempre @( posedge clk o posedge reset o posedge set ) si ( reset ) q <= 0 ; de lo contrario si ( set ) q <= 1 ; de lo contrario q <= d ;                      

Nota: Si se utiliza este modelo para modelar un flip flop Set/Reset, pueden producirse errores de simulación. Considere la siguiente secuencia de eventos de prueba. 1) reset sube 2) clk sube 3) set sube 4) clk sube nuevamente 5) reset sube seguido de 6) set sube. Suponga que no hay violaciones de configuración y retención.

En este ejemplo, la instrucción always @ se ejecutaría primero cuando se produzca el flanco ascendente de reset, lo que colocaría a q en un valor de 0. La próxima vez que se ejecute el bloque always será el flanco ascendente de clk, que nuevamente mantendrá a q en un valor de 0. El bloque always se ejecuta entonces cuando set sube, lo que, como reset es alto, obliga a q a permanecer en 0. Esta condición puede ser correcta o no según el flip flop real. Sin embargo, este no es el problema principal con este modelo. Observe que cuando reset baja, ese set sigue siendo 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 por los flancos ascendentes de set y reset, no por los niveles. Puede ser necesario un enfoque diferente para los flip flops set/reset.

La última variante básica es la que implementa un D-flop con un multiplexor que alimenta su entrada. El multiplexor tiene una entrada D y retroalimentación del propio 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 SUPONE 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 '''<=''' // siempre @( posedge clk ) si ( gate ) q <= d ; // el mux "else" está "implícito"       

Tenga en cuenta que no se mencionan bloques "iniciales" en esta descripción. Hay una división entre las herramientas de síntesis FPGA y ASIC en esta estructura. Las herramientas FPGA permiten bloques iniciales donde se establecen valores reg en lugar de usar una señal de "reinicio". Las herramientas de síntesis ASIC no admiten tal declaración. La razón es que el estado inicial de un FPGA es algo que se descarga en las tablas de memoria del FPGA. Un ASIC es una implementación de hardware real.

Inicial y siempre

Hay dos formas distintas de declarar un proceso Verilog. Estas son las palabras claves always e initial . La palabra clave always indica un proceso que se ejecuta libremente. La palabra clave initial indica que un proceso se ejecuta exactamente una vez. Ambas construcciones comienzan la ejecución en el tiempo de simulación 0, y ambas se ejecutan hasta el final del bloque. Una vez que un bloque always ha llegado a su final, se reprograma (de nuevo). Es un error común creer que un bloque initial se ejecutará antes que un bloque always. De hecho, es mejor pensar en el bloque initial como un caso especial del bloque always , uno que termina después de completarse por primera vez.

//Ejemplos: initial begin a = 1 ; // Asignar un valor a reg a en el tiempo 0 # 1 ; // Esperar 1 unidad de tiempo b = a ; // Asignar el valor de reg a a reg b end            siempre @( a o b ) // Cada vez que a o b CAMBIAN, se ejecuta el proceso begin if ( a ) c = b ; else d = ~ b ; end // Terminado con este bloque, ahora regresa al inicio (es decir, al control de eventos @)              siempre @( posedge a ) // Ejecutar 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 hay dos usos adicionales importantes. El más común de ellos es una palabra clave always sin la lista de sensibilidad @(...) . Es posible utilizar always como se muestra a continuación:

siempre comienza // 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 // Sigue ejecutándose — así que continúa desde el principio                

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

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

El siguiente ejemplo es funcionalmente idéntico al ejemplo anterior.

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 sentencias (o bloques) entre un par fork/join comienzan a ejecutarse simultáneamente cuando el flujo de ejecución llega al par fork . La ejecución continúa después del join cuando finaliza la sentencia o el bloque de mayor ejecución entre el par fork y el join .

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

De la forma en que se escribe lo anterior, es posible que se impriman las secuencias "ABC" o "BAC". El orden de simulación entre la primera escritura y la segunda depende de la implementación del simulador y puede ser aleatorizado intencionalmente por el simulador. Esto permite que la simulación contenga tanto condiciones de carrera accidentales como comportamiento no determinista intencional.

Tenga en cuenta que VHDL no puede generar dinámicamente múltiples procesos como Verilog. [8]

Condiciones de carrera

El orden de ejecución no siempre está garantizado en Verilog. [9] Esto se puede ilustrar mejor con un ejemplo clásico. Considere el fragmento de código a continuación:

inicial a = 0 ;   inicial b = a ;   inicial comienzo # 1 ; $display ( "Valor a=%d Valor de b=%d" , a , b ); fin    

Dependiendo del orden de ejecución de los bloques iniciales, podría ser cero y cero, o alternativamente cero y algún otro valor arbitrario no inicializado. La $displayinstrucción siempre se ejecutará después de que se hayan completado ambos bloques de asignación, debido al retraso n.° 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 VHDL competidor, existe un estándar dedicado a la lógica multivalor, el IEEE 1164, con nueve niveles. [10]

Tareas del sistema

Las tareas del sistema están disponibles para manejar E/S simples y varias funciones de medición de diseño durante la simulación. Todas las tareas del sistema tienen el prefijo $ para distinguirlas de las tareas y funciones del usuario. Esta sección presenta una lista breve de las tareas más utilizadas. No se trata de una lista exhaustiva.

Interfaz de lenguaje de programación (PLI)

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

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

Software de simulación

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

Véase también

Material adicional

Idiomas similares

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. ^ ab IEEE 1800-2023, Proyecto de norma aprobado por IEEE para SystemVerilog: lenguaje unificado de diseño, especificación y verificación de hardware, IEEE , 2023
  3. ^ "El inventor de Verilog gana el premio Kaufman de la 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 lenguaje de descripción de hardware". Actas del Simposio Internacional de Computación de 1980, Taipei, Taiwán, diciembre de 1980. págs. 772–79O. 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 la fusión de Verilog y VHDL?" (PDF) . SNUG Boston 2003.
  9. ^ Sutherland, Stuart (2002). Verilog — 2001. Boston, MA: Springer US. pág. 16. doi :10.1007/978-1-4615-1713-9. ISBN 978-1-4613-5691-2El procedimiento inicial en Verilog no se ejecuta antes de la simulación. Comienza a ejecutarse en el momento cero, cuando comienza a ejecutarse la simulación , y se ejecuta en paralelo con otros procedimientos iniciales o siempre. Cuando hay varios procedimientos iniciales, no hay un orden definido para la activación de los procedimientos.
  10. ^ Miller, D. Michael; Thornton, Mitchell A. (2008). Lógica de valores múltiples: conceptos y representaciones . Lecciones de síntesis sobre circuitos y sistemas digitales. Vol. 12. Morgan & Claypool. ISBN 978-1-59829-190-2.
  11. ^ "IEEE Standard Verilog® Hardware Description Language" (PDF) . p. 652(25.38) . Consultado el 12 de noviembre de 2023 .
  12. ^ "IEEE Standard Verilog® Hardware Description Language" (PDF) . p. 628(25.28) . Consultado el 12 de noviembre de 2023 .
  13. ^ "IEEE Standard Verilog® Hardware Description Language" (PDF) . p. 653(25.39) . Consultado el 25 de noviembre de 2023 .
  14. ^ "IEEE Standard Verilog® Hardware Description Language" (PDF) . p. 631(25.21) . Consultado el 25 de noviembre de 2023 .
Notas

Enlaces externos

Desarrollo de normas

Extensiones de lenguaje