BLOQUE 2 TEMA 3: Verilog

BLOQUE 2 TEMA 3: Verilog 3.1 3.2 3.3 3.4 Introducción Estructura Estilos de Descripción Modelado Estructural Instanciado de Módulos Primitivas Primit...
3 downloads 1 Views 116KB Size
BLOQUE 2 TEMA 3: Verilog 3.1 3.2 3.3 3.4

Introducción Estructura Estilos de Descripción Modelado Estructural Instanciado de Módulos Primitivas Primitivas Definidas por el Usuario 3.5 Tipos de Datos y Operadores 3.6 Modelado de Comportamiento Asignamientos Control de Temporización Control de Flujo de Actividad Funciones y Tareas 3.7 Máquinas de Estado Finito Smith “Application-Specific Integrated Circuits” M- D. Ciletti, “Modeling, Synthesis and Rapid Prototyping with the Verilog HDL” Verilog

HDSE

INTRODUCCIÖN

P La compañía Gateway Design Automation desarrolló Verilog como un lenguaje de simulación. P En 1989 Cadence compró Gateway y en 1990 puso Verilog en dominio público. P Posteriormente se desarrollo Verilog como un standard del IEEE P Verilog es un lenguaje tipo C P Verilog permite describir diseños a distintos niveles de abstracción q nivel algoritmo (similar a un código C con construcciones if, case y loops) q nivel transferencia de registros (usa registros conectados por ecuaciones booleanas) q nivel de puertas (interconexión de puertas) q nivel de conmutadores (los conmutadores son los transistores MOS que implementan las puertas lógicas) P Verilog define construcciones para controlar la entrada y la salida de la simulación P herramientas de síntesis lógica no soportan todas las construcciones de Verilog

Verilog

HDSE

INTRODUCCIÖN

‘timescale 1ns/1ns

/* directiva de compilación (‘), define la unidad de tiempo y la precisión para el simulador. Un HDL tiene implícita una semántica de tiempos asociada a sus objetos (señales) porque modela su evolución */ // modela una caja negra que contiene un reloj de 50MHz y cuenta de 0 a 7 // declara tipo de dato reg para el reloj (clock) // declara tipo de dato entero para el contador // inicializa, se ejecuta una vez al comienzo

module contador; reg clock; integer count; initial begin clock = 0; count = 0; // inicializa señales #340 $finish; // finaliza tras 340 unidades de tiempo, Función-tarea del sistema ($) end always // sentencia always para generar el reloj, se ejecuta siempre #10 clock = ~ clock; always // sentencia always para la cuenta, concurrente con la otra sentencia always begin @ (negedge clock); // espera hasta que clock pasa de 1 a 0 if (count == 7) count = 0; else count = count + 1; $display(“time = “, $time, “ count = “, count); end endmodule Verilog

HDSE

INTRODUCCIÖN

‘timescale 1ns/1ns module contador; reg clock; integer count;

salida del simulador VERILOG-XL ........... time = 20 count = time = 40 count = ................................... time = 300 count = time = 320 count = ...........

initial begin clock = 0; count = 0; #340 $finish; end always #10 clcock = ~ clock; always begin @ (negedge clock); if (count == 7) count = 0; else count = count + 1; $display(“time = “, $time, “ count = “, count); end endmodule Verilog

1 2 7 0

HDSE

ESTRUCTURA

P el module es la entidad de diseño principal en verilog P el module representa un bloque hardware: desde puertas simples hasta un sistema completo P la descripción de cada module puede ser q comportamiento: usando construcciones de lenguajes de programación: if, asignaciones... q estructural: interconexión jerárquica de submódulos. En el nivel más bajo de la jerarquía las componentes deben ser primitivas de verilog o especificarse tipo comportamiento P un sistema digital puede definirse como un conjunto de modules P Sintaxis module nombre_modulo (lista_de_terminales); // especifica nombre y terminales (puertos) input [msb:lsb] lista_terminales_entrada; // especifica tipo y número de bits de cada terminal output [msb:lsb] lista_terminales_salida; inout [msb:lsb] lista_terminales_bidireccionales; .......... ......... // comportamiento o instanciado de otros modules endmodule suma datoa 8 datob Verilog

out 8

module suma_resta(suma, datoa, datob, out); input suma; //por defecto wire input [7:0] datoa, datob; wire datoa, datob; output [7:0] out; reg out; ....................sentencias ................... endmodule HDSE

ESTILOS DE DESCRIPCIÓN

Estructural / Comportamiento /* modelo estructural de una and construida con dos nands*/ module MIAND(in1, in2, out); input in1, in2; output out; wire w1; // dos instancias del module nand NAND NAND1(in1, in2, w1); NAND NAND2(w1,. w1, out); endmodule

// modelo comportamiento de una puerta nand module NAND(in1, in2, out); input in1, in2; output out; // sentencia de asignamiento continuo assign out = ~(in1 & in2); endmodule

Verilog

in1 in2

w1 &

& out

P los terminales (puertos) permiten interconectar modules P los nombres de los puertos cuando se conectan pueden ser distintos al nombre de la declaración del module P asignamiento continúo asigna un valor a un wire se ejecutan continuamente similar a una puerta real conectada al cable son concurrentes

HDSE

ESTILOS DE DESCRIPCIÓN

Comportamiento: Flujo de datos / Algoritmo /* modelo comportamiento RTL o flujo de datos*/ module suma_4_RTL(a, b, c_in, sum, c_out); input [3:0] a, b; input c_in; output [3:0] sum; output c_out; // asignamiento continuo assign {c_out, sum} = a + b + c_in; endmodule // modelo comportamiento: flujo de datos o RTL module comp_RTL (menor, mayor, igual, A1, A0, B1, B0); input A1, A0, B1, B0; output menor, mayor, igual; assign menor = ({A1,A0} < {B1, B0}); assign mayor = ({A1,A0} >{B1, B0}); assign igual = ({A1,A0} == {B1, B0}); endmodule Verilog

// modelo comportamiento: algoritmos module comp_algo (menor, mayor, igual, A, B); input [1:0] A, B; output menor, mayor, igual; reg menor, mayor, igual; always @ (A or B) begin menor=0; mayor = 0; igual = 0; if (A==B) igual=1; else if (A > B) mayor = 1; else menor = 1; end endmodule P el tipo de dato reg retiene su valor hasta que se hace otro asignamiento

HDSE

ESTILOS DE DESCRIPCIÓN

Comportamiento: Algoritmo i // modelo comportamiento: algoritmo // asigna valores a reg en sentencias procedurales // el comportamiento implementado puede ser combinacional o secuencial module comp_algo (menor, mayor, igual, A, B); // describe un comparador de dos bits input [1:0] A, B; output menor, mayor, igual; reg menor, mayor, igual; always @ (A or B) // procedimiento always su bloque secuencial asociado se ejecuta // siempre que en A o B ocurra un evento begin // comienza el bloque secuencial. La lista de sentencias procedurales // hasta el end se ejecuta secuencialmente menor = 0; mayor = 0; igual = 0; if (A == B) igual = 1; else if (A > B) mayor = 1; else menor = 1; end // termina el bloque secuencial endmodule

Verilog

HDSE

ESTILOS DE DESCRIPCIÓN

Comportamiento: Algoritmo ii module and4_algo (x_in, y_out); // puerta and de 4 entradas input [3:0] x_in; output y_out; reg y_out; integer k; always @ (x_in) // procedimiento always. Se ejecuta si cambia una o más entradas begin: and_loop //bloque secuencial con etiqueta y_out = 1; for (k = 0; k (Desplazar a la derecha) + (Suma) - (Resta) * (multiplicación) / (división) % (módulo) Operadores unarios: ! ~ & ~& | ~| ^ ~^ + -

Verilog

HDSE

OPERADORES

Operador

Descripción

!

Negación Lógica

!1’b1 es 1‘b0

~

Negación bit a bit

~1’b10xz es 1’b01xx

Reducción AND (NAND)unaría

& 4’b1111 es 1’b1, &2’bx1 es 1’bx

Reducción OR (NOR) unaría

| 4b’0000 es 1’b0

Reducción XOR (NXOR) unaría

^ 2b’10 es 1’b1

& (~&) | (~|) ^ (~^)

operador

Verilog

Ejemplo

argumento

resultado

aritmético

dos operandos

palabra binaria

bitwise

dos operandos, excepto ~

palabra binaria

Reducción

un operando

bit

Lógico

dos operandos booleanos, excepto !

valor booleano

Relacional

dos operandos net y reg se interpretan sin signo

valor booleano

desplazamiento

un operando

palabra binaria

Condicional

tres operandos

expresión

HDSE

OPERADORES

Ejemplos // aritmética complemento a 2 // el patrón de bits almacenado en un registro // se interpreta como un valor sin signo module arith1 (); reg [3:0] A, B; wire [4:0] sum, dif1, dif2, neg; assign sum = A + B; assign dif1 = A -B; assign dif2 = B - A; assign neg = -A initial begin #5 A = 5; B = 2; end endmodule A B sum dif1 dif2 neg 5 2 7 3 29 27 0101 0010 00111 00011 11101 11011

Verilog

// las operaciones aritméticas sobre objetos de n bits // se realizan en modulo 2n module modulo ; reg [2 : 0] siete ; initial begin #1 siete =7 ; $display (“Antes = ”, siete); #1 siete = siete +1; $display(“despues =”,siete); ........._________________________ Resultado: antes = 7 despues = 0

// multiplexor usando operadores condicionales anidados wire [1:0] select; wire [15:0] d_1, d_2, d_3, d_4; wire [15:0] bus_a = (select == 2’b00) ? d_1: (select == 2’b01) ? d_2: (select == 2’b10) ? d_3: (select == 2’b11) ? d_4;

HDSE

MODELADO COMPORTAMIENTO

los ejemplos anteriores han introducido tres tipos de comportamientos (behaviours) no estructurales en verilog: q asignamientos continuos lógica combinacional implícita estableciendo asociaciones estáticas entre expresiones y nets

q construcciones (procesos) initial flujo de actividad que se ejecuta una vez, se activa en tsim = 0 q construcciones (procesos) always flujo de actividad que se ejecuta cíclicamente, se activa en tsim = 0 proceso P evolución de los valores de variables tipo registro en un módulo P puede consistir en una sentencia o en bloque de sentencias (bloque secuencial) limitado por begin ...end P Las sentencias dentro de un bloque secuencial que es parte de un procedimiento se ejecutan secuencialmente, en el orden en que aparecen, pero en la misma unidad de tiempo de simulación si no se especifica ninguna temporización. P solo se asigna una variable tipo registro cuando se ejecuta la sentencia de asignamiento en el flujo de actividad del proceso P un módulo puede contener cualquier número de procesos P los distintos procesos se ejecutan concurrentemente

Verilog

HDSE

MODELADO COMPORTAMIENTO module secuencial_1; reg Y, clk; always begin: my_block @(posedge clk) #5 Y=1; // Espera 5 y Pone a 1 Y con el flanco de subida @(posedge clk) #5 Y=0; // Espera 5 y Pone a 0 Y al flanco siguiente end always #10 clk = ~clk ; initial Y = 0; initial clk = 0; initial $monitor(“T=%2g”, $time, “ clk = ”, clk, “ Y = “, Y); initial #70 $finish endmodule

T=0 clk T=10 clk T=15 clk T=20 clk T=30 clk T=35 clk T=40 clk T=50 clk T=55 clk T=60 clk

Verilog

=0 =1 =1 =0 =1 =1 =0 =1 =1 =0

Y=0 Y=0 Y=1 Y=1 Y=1 Y=0 Y=0 Y=0 Y=1 Y=1

.......... initial begin sig_a = 0; sig_b = 1; sig_c = 1; sig_d = 0; // asignamientos procedurales // se ejecutan secuencialmente end .......

en tsim = 0 se asignan sig_a, sig_b, sig_c y sig_d.

HDSE

MODELADO COMPORTAMIENTO. TEMPORIZACIÓN

q control de retrasos (#) #∆t sentencia; P retrasa la ejecución de la setencia ∆t unidades de tiempo, tambien la sentencia nula. Suspende el flujo de actividad y por lo tanto afecta al tiempo de ejecución de todas las siguientes q control por ocurrencia de eventos (@) P sincroniza la ejecución de una sentencia hasta que ocurra un evento determinado P evento cambio en el valor de un identificador o una expresión que hacen referencia a un net o a un register Pcuando se alcanza @ el flujo de actividad se suspende @ (expresion_evento) sentencia; @ identificador_evento sentencia; @ (expresión_evento1 or expresión_evento2) sentencia; cualificadores predefinidos posedge : transiciones 0 -> 1, 0 -> x y x -> 1 negedge: transiciones 1 -> 0, 1 -> x y x -> 0 q sentencia wait P modela comportamiento sensible a niveles P suspende el flujo de actividad hasta que una condición es verdadera wait (expresión) sentencia; Verilog

HDSE

MODELADO COMPORTAMIENTO. TEMPORIZACIÓN module delay_controls; reg X, Y, clk, Dummy; always #1 Dummy = ! Dummy ; // Reloj Dummy usado para gráficos //Ejemplos de controles de temporización. always begin #25 X= 1; #10 X =0; #5 ; end //Ejemplo de evento always @(posedge clk) Y = X; always #10 clk = ! clk ; //El reloj real está 10 unidades de tiempo bajo //y diez en alto initial begin clk = 0; $display (“T clk x Y”); $monitor(“%2g”, $time, , ,clk, , , ,X, ,Y); $dumpvars; #100 finish; end endmodule T 0 10 20 25 30 35 40 50 60 65 Verilog

Clk 0 1 0 0 1 1 0 1 0 0

X x x x 1 1 0 0 0 0 1

Y x x x x 1 1 1 0 0 0

T 70 75 80 90

Clk 1 1 0 1

XY 1 1 0 1 0 1 0 0

// ff D con reset y set asíncronos // asyndff_1 no es un modelo correcto module asyndff_1 (d, clk, q, qbar, s, r); input d, clk, s, r; output q, qbar; reg q; assign qbar = ~q; always @ (s or r or posedge clk) begin if ( r == 0) q = 0; else if(s == 0) q = 1; else if (clk == 1) q = d; end // almacena d si s o r se desactivan con clk 1 endmodule module asyndff_2 (d, clk, q, qbar, s, r); input d, clk, s, r; output q, qbar; reg q; assign qbar = ~q; always @ (negedge s or negedge r or posedge clk) begin if ( r == 0) q = 0; else if(s == 0) q = 1; else q = d; end endmodule HDSE

MODELADO COMPORTAMIENTO. ASIGNAMIENTOS

q Asignamiento procedural (=, asigna valor a una variable registro, blocking) variable = expresión; // actualiza variable con el valor de expresión #∆t variable = expresión; // ∆t unidades de tiempo pasan antes de que se ejecute variable = #∆t (@(evento)) expresión; // la expresión se evalúa inmediatamente, // la asignación se retrasa ∆t unidades de tiempo (o hasta ocurrencia del evento) P aparecen en procesos P variable solo tipo registro P expresión cualquier expresión usando los operadores de verilog P se ejecutan secuencialmente en el orden en el que se han escrito P debe ejecutarse antes de que se puedan ejecutar las que le siguen initial begin sum[7] = b[7] ^ c[7]; // se ejecuta ahora ziltch = #15 ckz&h; // ckz&h se evalúa ahora; zlitch cambia // después de 15 unidades de tiempo #10 hat = b&c; // 10 unidades de tiempo despues de que // ziltch cambia, b&c se evalua y hat cambia

Verilog

initial begin a = 1; b = 2; c= 3; #5 a = b + c; // espera 5 unidades // y ejecuta a = b + c = 5 d = a; // d = 5 en tsim = 5 ........

HDSE

MODELADO COMPORTAMIENTO. ASIGNAMIENTOS

q Asignamiento (procedural) non-blocking (