Sistema Verilog | |
---|---|
clase de idioma | diseño estructural); orientado a objetos (verificación) |
Apareció en | 2002 |
Autor | Instituto de Ingenieros Eléctricos y Electrónicos |
extensión de archivo | .sv |
Liberar | IEEE 1800-2009 (2009-12-18) |
sistema de tipos | estático, débil |
sido influenciado | Verilog , Vera |
SystemVerilog es un lenguaje de descripción y verificación de hardware que es una extensión del lenguaje Verilog .
SystemVerilog se construyó sobre los lenguajes Superlog (Accellera, 2002). Gran parte de la funcionalidad relacionada con la verificación se ha tomado del lenguaje OpenVera ( Synopsys ). [1] En 2005, se adoptó SystemVerilog como estándar IEEE 1800-2005. [2]
En 2009, el estándar 1800-2005 se fusionó con el estándar de lenguaje Verilog (IEEE 1364-2005) y se adoptó la versión actual de SystemVerilog, el estándar IEEE 1800-2009.
SystemVerilog se puede utilizar para describir RTL como una extensión del lenguaje Verilog-2005 . Para la verificación, se utiliza un modelo de programación orientado a objetos .
SystemVerilog admite todos los tipos de datos disponibles en Verilog y agrega muchos tipos de datos nuevos.
Tipos de datos enteros . SystemVerilog proporciona nuevos tipos de datos:
Estos tipos de datos toman dos estados: 0 y 1. A diferencia de los tipos de Verilog correspondientes (por ejemplo, reg o entero ), no pueden tomar los valores 'X' y 'Z', lo que permite una simulación más rápida.
Una matriz empaquetada multidimensional es una extensión y generalización de la memoria en Verilog:
lógica [ 1 : 0 ][ 2 : 0 ] my_pack [ 32 ];Un tipo enumerado le permite dar nombres a constantes numéricas, por ejemplo:
typedef enum logic [ 2 : 0 ] { ROJO , VERDE , AZUL , CYAN , MAGENTA , AMARILLO } color_t ; color_t mi_color = VERDE ; $pantalla inicial ( "El color es %s" , mi_color . nombre ());Este ejemplo usa logic[2:0] como tipo base.
Las estructuras y uniones se usan de la misma manera que en C. Además de Verilog, SystemVerilog agrega dos nuevos atributos: empaquetado y etiquetado . El atributo empaquetado significa que todos los miembros de la estructura se almacenan de forma compacta en la memoria, sin espacios (es decir, el compilador no puede hacer su alineación ):
typedef struct empaquetado { bit [ 10 : 0 ] expo ; signo de bit ; bit [ 51 : 0 ] mant ; } FP ; FP cero = 64 'b0 ;El atributo etiquetado permite controlar qué miembro de la unión se usa en un momento dado durante la ejecución del programa.
Verilog proporciona un proceso siempre en bloque que, según el contexto, puede describir diferentes tipos de hardware. Para describir explícitamente el tipo de hardware, SystemVerilog agrega 3 nuevos bloques de proceso: always_comb , always_ff y always_latch .
El bloque always_comb le permite modelar la lógica combinacional . La lista de sensibilidad de bloque contiene todas las variables utilizadas dentro del bloque.
always_comb comenzar tmp = b * b - 4 * a * c ; sin_raíz = ( tmp < 0 ); finalEl bloque always_ff le permite describir la lógica secuencial síncrona , como los disparadores :
always_ff @( posedge clk ) q <= restablecer ? 0 : re ;Los flip-flops de una sola etapa controlados por estática (latches) se describen usando bloques always_latch :
always_latch si ( activar ) q <= d ;Para sistemas pequeños, las conexiones externas del módulo se describen de forma compacta utilizando puertos Verilog. Sin embargo, los bloques grandes dentro de un sistema grande suelen contener varios miles de puertos. SystemVerilog proporciona un mecanismo de interfaz para agrupar puertos y evitar la duplicación al definir puertos. Además, las interfaces pueden contener una construcción modport que especifica la dirección de las conexiones. Por ejemplo:
interfaz intf ; lógica a ; lógica b ; modport en ( entrada a , entrada b ); modport out ( salida a , salida b ); interfaz final parte superior del módulo ; intfi ( ); u_a m1 ( .i1 ( i )); u_b m2 ( .i2 ( i )); módulo final módulo u_a ( intf . en i1 ); asignar x = i1 . un ; asigne y = i1 . segundo ; módulo final módulo u_b ( intf . out i2 ); asignar i2 . un = 1 _ asignar i2 . b = 0 _ módulo finalLas siguientes construcciones no son sintetizables . Se utilizan para implementar entornos de prueba, aserciones en el código bajo prueba y para verificar la cobertura del código .
El tipo de cadena se puede usar para manejar cadenas de longitud variable, por ejemplo:
cadena s1 = "Hola" ; cadena s2 = "mundo" ; cadena p = ".?!" ; cadena s3 = { s1 , ", " , s2 , p [ 2 ]}; // concatenación de cadenas $display ( "[%d] %s" , s3 . len (), s3 ); // Imprimirá: "[13] ¡Hola, mundo!"