Tutorial Verilog Bloque

42
Verilog HDSE BLOQUE 2 TEMA 3: Verilog 3.1 Introducción 3.2 Estructura 3.3 Estilos de Descripción 3.4 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”

Transcript of Tutorial Verilog Bloque

Page 1: Tutorial Verilog Bloque

Verilog HDSE

BLOQUE 2

TEMA 3: Verilog

3.1 Introducción3.2 Estructura3.3 Estilos de Descripción 3.4 Modelado Estructural

Instanciado de MódulosPrimitivasPrimitivas Definidas por el Usuario

3.5 Tipos de Datos y Operadores3.6 Modelado de Comportamiento

AsignamientosControl de TemporizaciónControl de Flujo de ActividadFunciones 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”

Page 2: Tutorial Verilog Bloque

Verilog HDSE

INTRODUCCIÖN

P La compañía Gateway Design Automation desarrolló Verilog como un lenguaje desimulació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 implemen-

tan 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

Page 3: Tutorial Verilog Bloque

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 */

module contador; // modela una caja negra que contiene un reloj de 50MHz y cuenta de 0 a 7 reg clock; // declara tipo de dato reg para el reloj (clock) integer count; // declara tipo de dato entero para el contadorinitial // inicializa, se ejecuta una vez al comienzobegin

clock = 0; count = 0; // inicializa señales#340 $finish; // finaliza tras 340 unidades de tiempo, Función-tarea del sistema ($)

endalways // 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 0if (count == 7) count = 0;else

count = count + 1;$display(“time = “, $time, “ count = “, count);

endendmodule

Page 4: Tutorial Verilog Bloque

Verilog HDSE

INTRODUCCIÖN

‘timescale 1ns/1nsmodule contador;

reg clock; integer count;

initialbegin

clock = 0; count = 0;#340 $finish;

endalways

#10 clcock = ~ clock;always

begin@ (negedge clock);if (count == 7)

count = 0;else

count = count + 1;$display(“time = “, $time, “ count = “, count);

endendmodule

salida del simulador VERILOG-XL...........

time = 20 count = 1time = 40 count = 2...................................time = 300 count = 7time = 320 count = 0...........

Page 5: Tutorial Verilog Bloque

Verilog HDSE

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 Sintaxismodule 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;.......... <module_items> ......... // comportamiento o instanciado de otros modulesendmodule

suma

datoa

datob

out

8 8

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

ESTRUCTURA

Page 6: Tutorial Verilog Bloque

Verilog 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 nandNAND NAND1(in1, in2, w1);NAND NAND2(w1, w1, out);

endmodule

// modelo comportamiento de una puerta nandmodule NAND(in1, in2, out);

input in1, in2;output out;// sentencia de asignamiento continuoassign out = ~(in1 & in2);

endmodule

& &

out

in1

in2

w1

P los terminales (puertos) permiten inter-conectar modules

P los nombres de los puertos cuando se conectan pueden ser distintos al nom-bre 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

Page 7: Tutorial Verilog Bloque

Verilog HDSE

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 continuoassign {c_out, sum} = a + b + c_in;endmodule

// modelo comportamiento: flujo de datos o RTLmodule 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

// modelo comportamiento: algoritmosmodule 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; endendmodule

P el tipo de dato reg retiene su valor hasta que se hace otro asignamiento

ESTILOS DE DESCRIPCIÓN

Page 8: Tutorial Verilog Bloque

Verilog HDSE

Comportamiento: Algoritmo i

// modelo comportamiento: algoritmo// asigna valores a reg en sentencias procedurales// el comportamiento implementado puede ser combinacional o secuencialmodule 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 secuencialendmodule

ESTILOS DE DESCRIPCIÓN

Page 9: Tutorial Verilog Bloque

Verilog HDSE

Comportamiento: Algoritmo ii

module and4_algo (x_in, y_out); // puerta and de 4 entradasinput [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 <= 3; k = k + 1) if(x_in[k] == 0) begin y_out = 0; disable and_loop; // evita analizar las restantes entradas end endendmodule

ESTILOS DE DESCRIPCIÓN

Page 10: Tutorial Verilog Bloque

Verilog HDSE

MODELADO ESTRUCTURAL

Instanciado de Modules

P las declaraciones de módulos son “plantillas” (“templates”) a partir de los cuales se crean las instancias P los módulos se instancian dentro de otros módulosP la excepción es el módulo del nivel más alto que es su propia instanciaP no se pueden instanciar modules en procedimientos

module_nameinstance_name_1 (lista_conexiones_terminales), instance_name_2 (lista_conexiones_terminales);

wire [3:0] in1, in2;wire [3:0] o1, o2;// C1 es una instancia del module and4// los términales de C1 referenciados por posición

and4 C1(in1, in2, o1);

// C2 es otra instancia del modulo and4// los terminales de C2 referenciados por nombre

and4 C2(.c(o2), .a(in1), .b(in2));

// DEFINICIÖN DEL MÓDULOmodule and4(a, b, c);

input [3:0] a, b;output [3:0] c;assign c=a&b;

endmodule

sintaxis

Page 11: Tutorial Verilog Bloque

Verilog HDSE

MODELADO ESTRUCTURAL

Módulos Parametrizables P los parámetros permiten que una constante se pueda utilizar simbólicamenteP se pueden definir módulos parametrizables y especificar el valor del parámetro para cada

instancia

parameter par_1 = valor,par_2= valor, .......;parameter [range] par_3=valor;

parameter n=4;/* registro de cuatro bits cuya longitud se fija con el parámetro n */reg [n-1:0] out;

// DEFINICIÓN MODULOmodule despl_n(it, ot);

input [7:0] it;output [7:0] ot;

// el valor por defecto de n es 2parameter n=2;

// desplaza it a la izquierda n vecesassign ot = (it << n);endmodule// INSTANCIADOwire [7:0] in1, ot1, ot2, ot3;despl_n c1(in1, ot1),// n=2

#(3) c2(in1, ot2),// n= 3#(5) c3(in1, ot3);// n = 5

P sintaxis parámetros

module_name #(valores_parámetros)instance_name_1 (lista_conexiones_terminales);

P instanciado módulos parametrizables

Page 12: Tutorial Verilog Bloque

Verilog HDSE

MODELADO ESTRUCTURAL

PrimitivasP puertas lógicas que son parte del lenguaje verilogP se pueden especificar retraso y fuerza lógica q Puertas básicas: una salidaGATE: and, nand, or, nor, xor, xnorGATE (fuerza_logica) #(retrasos)nonbre_instancia_1(out1, in1,....inN);

retrasos es:#(subida, bajada) ó#subida_y_bajada ó#(subida_y_bajada)

and c1(o, a, b, c, d);// cuatro entradas c2(p, f, g);//dos entradasor #(4,3) c3(s, a, b);//subida, bajadaxor #(5) c4(m, c, d);// no es obligatorio usar identificadores // cuando se instancian primitivasxor #2.2 (o1, a, b);

q Buffers e Inversores GATE: buf o notGATE (fuerza_logica) #(retrasos)nombre_instancia_1(out1, ..., outN, in);

not #(4) not_1(a, c);buf c1(o, p, q, r, in); c2(l, m, in);

q Puertas tri-estadoGATE puede ser bufif1, bufif0, notif1, notif0// bus = a 5 unidades de tiempo después de que ctrl //se ponga a 0bufif0 #(5) c1(bus, a, ctrl);

Page 13: Tutorial Verilog Bloque

Verilog HDSE

Primitivas Definidas por el Usuario i

P se especifican usando una tabla de verdad.P el primer puerto debe ser el único puerto de salida. P No se pueden usar vectores ni puertos bidireccionales

primitive sumador(Sum, a,b);output Sum; input a, b;table//entradas : salida0 0 : 0 ;//orden entr. = orden termi.0 1 : 1 ;1 0 : 1 ;1 1 : 0 ;endtableendprimitive

primitive Dlatch(Q, CLK, D);output Q; reg Q; input CLK, D;table//entrada : estado presente : salida (prox. estado)1 0 : ? : 0 ; // ? Es un 0, 1 o x1 1 : b : 1 ; // b Es un 0, 1 1 1 : x : 1 ; // x valor lógico desconocido0 ? : ? : - ; // - La salida no cambia./*puede añadirse lo siguiente para reducir pesimis-mo en simulación */// x 0 : 0 : -;// x 1 : 1 : -;endtable

MODELADO ESTRUCTURAL

Page 14: Tutorial Verilog Bloque

Verilog HDSE

Primitivas Definidas por el Usuario ii

P Para circuitos que necesiten ser sensibles a los flancos, existe una notación especial que representa cambios. Así por ejemplo 01 significaría pasar de 0 a 1, esto es un flanco de subida.

Abreviaturas para transiciones

* (??)

r (01)

f (10)

p (01), (x1), (0x)

n (10), (1x), (x0)

primitive DFF(Q, CLK,D);output Q; reg Q; input CLK, D;initial Q = 0; // se le da un valor inicialtable//entrada : estado presente : salida (prox. estado)r 0 : ? : 0 ; //Flanco de subidar 1 : ? : 1; //Flanco de subida(0x) 0 : 0 : 0 ; //Flanco de subida(0x) 1 : 1 : 1; //Flanco de subida(?0) ? : ? : -; //Flanco de bajada, no hay cambio? (??) : ? : -; //No hay flanco, no hay cambio// la tabla debe ser tan completa como sea posibleendtableendprimitive

MODELADO ESTRUCTURAL

Page 15: Tutorial Verilog Bloque

Verilog HDSE

EJEMPLO

q Descripción estrcutural de un sumador de propagación de acarreo de 16 bits con la siguiente descomposición jerárquica

sumador de propagaión de acarreo de 16 bits sumador de propagación de acarreo de 4 bits sumador completo semisumador

a) sin vectores de instanciasb) con vectores de instancias

Page 16: Tutorial Verilog Bloque

Verilog HDSE

P verilog es sensible a minúsculas y mayúsculas. Las palabras claves son minúsculasP identificadores: pueden utilizar letras (mayúsculas y minúsculas) dígitos (no al prin-

cipio), _ , $P las directivas de compilación comienzan por ‘P las funciones y tasks del sistema comienzan por $

P Valores lógicosVerilog tiene predefinido un conjunto de 4 valores lógicos: {1, 0, x, z}. Se usa x para valores desconocidos o no inicializados mientras que z define un estado de alta impedancia

P Números <size>’<base><número>

<size> valor decimal que especifica cuantos bits representan el valor almacenado, opcional<base> decimal (d o D), hex (h o H), octal (o ó O) y binary( b o B), decimal por defecto<numero> valor en la base indicada

número #bits Base equivalente dec. almacenado2’b10 2 binaria 2 103’d5 3 decimal 5 1013’b5 no valido‘ha - hexadecimal 10 depende de la máquina

BASES DEL LENGUAJE

Page 17: Tutorial Verilog Bloque

Verilog HDSE

tipos de datos

nets( conectividad estruc-tural )tipo_net [msb:lsb] [#delay] identifica-dor;input, output, inout

wiresupply0supply1triwand ............

análogo a un cable en un circuitono almacenan un dato, por defecto escalar, pueden definirse vectoresnets no explícitamente declarados son wirese les puede asociar un retrasopueden ser asignados implícitamente por módu-los puede ser asignado en un asignamiento continuoo un force...release

wire y1, z_5;wire [7:0] data_bus;wire A= B + C;wire #2 y;

registros (almacenamiento)se asignan en senten-cias procedurales, fun-ciones o taskssolo output

reg almacena un valor lógicodebe usarse para modelar latches, ffs y memoriasno siempre se sintetiza un elemento de memoriapor defecto escalar, pueden definirse vectores

reg a:reg [7:0] tom;reg [5:0] a, b;reg [31:0] cce [0:1023]; 1024 palabras de 32-bit

conservan su valor hasta la siguiente asignación

integer variables de proposito general, signedpueden definirse vectores

integer a;integer arr[1:100];

real almacena valores (retrasos) como números reales

time 64 bits unsigned, no soportado en síntesis, tsim

TIPOS DE DATOS

Page 18: Tutorial Verilog Bloque

Verilog HDSE

Operador Descripción

:? (condicional) Es un operador ternario, una forma especial de <expresion>

| | Operación OR, operando de un bit

&& Operación AND, operando de un bit

| (~|) OR (NOR) bit a bit

^ (~^) XOR (XNOR) bit a bit

& AND bit a bit

== (Igualdad) != (Desigualdad) === (Igualdad en case) !=== (Desigualdad en case)

< (Menor) <= (Menor o igual) > (Mayor) >= (Mayor o igual)

<< (Desplazar a la izquierda) >> (Desplazar a la derecha)

+ (Suma) - (Resta)

* (multiplicación) / (división) % (módulo)

Operadores unarios: ! ~ & ~& | ~| ^ ~^ + -

OPERADORES

Page 19: Tutorial Verilog Bloque

Verilog HDSE

Operador Descripción Ejemplo

! 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 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 operandosnet y reg se interpretan sin signo

valor booleano

desplazamiento un operando palabra binaria

Condicional tres operandos expresión

OPERADORES

Page 20: Tutorial Verilog Bloque

Verilog HDSE

OPERADORES

Ejemplos

// aritmética complemento a 2// el patrón de bits almacenado en un registro // se interpreta como un valor sin signomodule 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 = -Ainitial

begin#5 A = 5; B = 2; end

endmoduleA B sum dif1 dif2 neg5 2 7 3 29 270101 0010 00111 00011 11101 11011

// 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 = 7despues = 0

// multiplexor usando operadores condicionales anidadoswire [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;

Page 21: Tutorial Verilog Bloque

Verilog HDSE

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 expre-siones y nets

q construcciones (procesos) initialflujo de actividad que se ejecuta una vez, se activa en tsim= 0

q construcciones (procesos) alwaysflujo de actividad que se ejecuta cíclicamente, se activa en tsim= 0

procesoP evolución de los valores de variables tipo registro en un móduloP puede consistir en una sentencia o en bloque de sentencias (bloque secuencial)

limitado por begin ...endP 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 asig-namiento en el flujo de actividad del proceso

P un módulo puede contener cualquier número de procesosP los distintos procesos se ejecutan concurrentemente

MODELADO COMPORTAMIENTO

Page 22: Tutorial Verilog Bloque

Verilog HDSE

module secuencial_1; reg Y, clk; alwaysbegin: 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 siguienteendalways #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 =0 Y=0 T=10 clk =1 Y=0 T=15 clk =1 Y=1 T=20 clk =0 Y=1 T=30 clk =1 Y=1 T=35 clk =1 Y=0 T=40 clk =0 Y=0 T=50 clk =1 Y=0 T=55 clk =1 Y=1 T=60 clk =0 Y=1

MODELADO COMPORTAMIENTO

..........initial

beginsig_a = 0;

sig_b = 1;sig_c = 1;sig_d = 0;

// asignamientos procedurales// se ejecutan secuencialmenteend

.......

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

Page 23: Tutorial Verilog Bloque

Verilog HDSE

q control de retrasos (#)#∆t sentencia;P retrasa la ejecución de la setencia ∆t unidades de tiempo, tambien la sen-tencia 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 deter-minadoP evento cambio en el valor de un identificador o una expresión que hacen

referencia a un net o a un registerPcuando se alcanza @ el flujo de actividad se suspende@ (expresion_evento) sentencia;@ identificador_evento sentencia;@ (expresión_evento1 or expresión_evento2) sentencia;

cualificadores predefinidosposedge : transiciones 0 -> 1, 0 -> x y x -> 1negedge: transiciones 1 -> 0, 1 -> x y x -> 0

q sentencia waitP modela comportamiento sensible a nivelesP suspende el flujo de actividad hasta que una condición es verdaderawait (expresión) sentencia;

MODELADO COMPORTAMIENTO. TEMPORIZACIÓN

Page 24: Tutorial Verilog Bloque

Verilog HDSE

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 eventoalways @(posedge clk) Y = X; always #10 clk = ! clk ;//El reloj real está 10 unidades de tiempo bajo//y diez en altoinitial begin clk = 0;

$display (“T clk x Y”);$monitor(“%2g”, $time, , ,clk, , , ,X, ,Y);$dumpvars; #100 finish; end

endmoduleT Clk X Y0 0 x x10 1 x x20 0 x x25 0 1 x30 1 1 135 1 0 140 0 0 150 1 0 060 0 0 065 0 1 0

T Clk X Y70 1 1 175 1 0 180 0 0 190 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)beginif ( 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 1endmodulemodule 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)beginif ( r == 0) q = 0;else if(s == 0) q = 1;else q = d;endendmodule

MODELADO COMPORTAMIENTO. TEMPORIZACIÓN

Page 25: Tutorial Verilog Bloque

Verilog HDSE

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 ejecutevariable = #∆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 procesosP variable solo tipo registroP expresión cualquier expresión usando los operadores de verilogP se ejecutan secuencialmente en el orden en el que se han escritoP debe ejecutarse antes de que se puedan ejecutar las que le siguen

initialbegin

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........

initialbegin

sum[7] = b[7] ^ c[7]; // se ejecuta ahoraziltch = #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

MODELADO COMPORTAMIENTO. ASIGNAMIENTOS

Page 26: Tutorial Verilog Bloque

Verilog HDSE

q Asignamiento (procedural) non-blocking (<=, asigna valor a una variable tipo registro, RTL)

variable <= expresión;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 procesosP variable solo tipo registroP expresión cualquier expresión usando los operadores de verilogP no bloquea la ejecución de las sentencias que le siguenP utiles en el modelado de transferencias concurrentes en circuitos síncronos (RTL)P las sentencias en una lista de asignaciones non-blocking se ejecutan “concurrente-

mente”

initialbegin

// todos los asignamientos se ejecutan en tsim= 0a = 1; b = 0; // se ejecutan primero porque aparecen primero// RHS de las siguientes asignaciones se evalúan concurrentementea <= b; // usa b=0

b <= a; // usa a = 1

MODELADO COMPORTAMIENTO. ASIGNAMIENTOS

Page 27: Tutorial Verilog Bloque

Verilog HDSE

initialbegin

a = 1; b = 0;// no importa el orden a <= b; // usa b = 0

b <= a; // usa a = 1

initialbegin

a = 1; b = 0;// importa el orden a = b; // usa b = 0

b = a; // usa a = 0

blocking non-blocking

always @ (posedge clk)begin

// registro desplazamiento Z = Y; Y = X;

y = x ; z = y; // ffs paralelos

always @ (posedge clk)begin

// registros desplazamiento Z <= Y; Y <= X;

y <= x ; z <= y;

initialbegin

a = #10 1; b = #2 0;

c = #3 1; end

initialbegin

d <= #10 1; e <= #2 0;

f <= #3 1; end

t a b c d e f0 x x x x x x2 x x x x 0 x3 x x x x 0 110 1 x x 1 0 112 1 0 x 1 0 115 1 0 1 1 0 1

MODELADO COMPORTAMIENTO. ASIGNAMIENTOS

Page 28: Tutorial Verilog Bloque

Verilog HDSE

q Asignamiento continuo procedural: assign...(deassign)

P aparecen en procesos, asigna variables tipo registroP asociación dinámica a una variable (puede ser eliminada)P tiene efecto cuando la sentencia se ejecuta y dura hasta que se hace otro asig-

namiento al registro o se usa la sentencia deassign sobre ese registroP permiten modelar el comportamiento sensible a niveles de la lógica combin-

cional, latches y control asíncrono de componentes secuenciales

module mux4_PCA(a, b, c, d, select, y_out);input a, b, c, d;input [1:0] select;output y_out;reg y_out;

always @ (select)if (select == 0) assign y_out = a; elseif (select == 1) assign y_out = b; elseif (select == 2) assign y_out = c; elseif (select == 3) assign y_out = d; elsey_out = 1’bx;

endmodule

module ff_PCA(pr, cl, q, clk, d);input pr, cl, clk, d;output q;reg q;

always @ (negedge clk)q = d;

always @ (cl or pr)beginif (!cl) assign q = 0; elseif (!pr) assign q = 1; elsedeassign q;

endendmodule // ff con clear y preset asíncrono

MODELADO COMPORTAMIENTO. ASIGNAMIENTOS

Page 29: Tutorial Verilog Bloque

Verilog HDSE

q Asignamiento continuo procedural: force...release

P aparecen en procesos, asigna variables tipo registro o netsP cuando se asigna un net con force tiene prioridad sobre los asignamientos con-

tinuos y construcciones estructurales hasta que se ejecuta releaseP cuando se asigna un registro con force tiene prioridad sobre los asignamientos

procedurales y construcciones assign...deassign hasta que se ejecuta release

Modos de asignamiento

output primitive/module

asignamiento continuo

asignamiento procedural

assign...deassign tsim

net si si no no si

registro comb noseq si

no si si si

MODELADO COMPORTAMIENTO. ASIGNAMIENTOS

Page 30: Tutorial Verilog Bloque

Verilog HDSE

.....@ (event_A) begin

......@ (event_B) begin

.....end

end

si event_A ha ocurrido pero no event_B, el compor-tamiento se suspende en el segundo control porocurrencia de eventos. Si event_A ocurre de nuevomientras el proceso está suspendido se ignora.Mientras está suspendido, otros procesos puedenejecutarse

module data_slip () ; reg clk, D, Q1, Q2;// Circuito secuencial mal hechoalways @(posedge clk) Q1 = D; // Q1 = #1 D;always @(posedge clk) Q2 = Q1; // Q2 = #1 Q1//Esto es un data slip (deslizamiento)initial begin clk = 0; D =1; end always #50 clk = ! clk ;initial begin

$display (“T clk D Q1 Q2”);$monitor(“%3g”, $time, , clk, , , ,D, ,Q1, , , ,Q2);

endinitial #400 $finish; //corre por 8 ciclosinitial $dumpvars;endmodule

T Clk D Q1 Q20 0 1 x x50 1 1 1 1100 0 1 1 1150 1 1 1 1200 0 1 1 1250 1 1 1 1300 0 1 1 1350 1 1 1 1

T Clk D Q1 Q20 0 1 x x50 1 1 x x51 1 1 1 x100 0 1 1 x150 1 1 1 x151 1 1 1 1200 0 1 1 1250 1 1 1 1300 0 1 1 1350 1 1 1 1

MODELADO COMPORTAMIENTO. OTROS EJEMPLOS

Page 31: Tutorial Verilog Bloque

Verilog HDSE

qoperador condicional (?...:)expresion_condicional = expresión ? expresion_verdadera : expresión falsaP se usa tanto en asignamientos continuos como procedurales

qsentencia condicional (if...else)if (expresión) sentencia1; else sentencia2;P selección entre sentencias alternativas en función del valor booleano de una expresiónP sentencia puede ser una sentencia simple, un bloque secuencial o la sentencia nula (;)P si todas las posibilidades no están especificadas en síntesis infiere un latch

module mux_bev(y_out, clk, r, sel, a, b);input clk, r, sel;input [15:0] a, b;output [15:0] y_out;reg [15:0] y_out;always @ (posedge clk or negedge r) if( r == 0) y_out = 0; else y_out = (sel) ? a + b : a -b;endmodule

.....if (a == b) begin x = 1; ot = 4’b1111; end..........

P se infieren latches para x y para ot. Mantienen su antiguo valor si a != b

MODELADO COMPORTAMIENTO. CONTROL

Page 32: Tutorial Verilog Bloque

Verilog HDSE

q sentencia case (case)case (expresión) case1: sentencia1;

case2: sentencia2; ....... default sentenciad; endcase

module mux4_case(a, b, c, d, select, y_out); // multiplexor de cuatro canalesinput a, b, c, d;input [1:0] select;output y_out;reg y_outalways @(a or b or c or d or select) // un evento en los datos o en select hace que

// y_out se compute. Ineficiente para simulación.begincase (select) // en simulación se examina expresión en el sistema de cuatro valores lógicos0: y_out = a;1: y_out = b;2: y_out = c;3: y_out = d;default y_out = 1’bx;endcaseendmodule

MODELADO COMPORTAMIENTO. CONTROL

Page 33: Tutorial Verilog Bloque

Verilog HDSE

q loopsq construcción repeatP ejecuta una sentencia o un bloque de sentencias un número determinado de vecesrepeat (expresión) sentencia;

q construcción forP ejecuta una sentencia o un bloque de sentencias repetidamente, bajo la condición de que

una expresión sea verdaderaq construcción whileP ejecuta una sentencia o un bloque de sentencias repetidamente mientras una expresión

sea verdaderaq construcción foreverP ejecuta una sentancia repetidamente y de forma incondicional sujeto a disable

// inicializa un array de memoriaword_address = 0;repeat (memory_size)beginmemory[word_adress] = 0;word_address = word_address + 1;end.......

.........for (K = 4; K ; K = K -1;)begindemo_register [K + 10] = 0;demo_register [[K + 2] = 1;end// posiciones asignadas: 14, 13, // 12, 11, 6, 5, 4, 3

begin: count_1reg [7:0] temp_reg;count = 0;temp_reg = reg_a;while (temp_reg)begincount= count + temp_reg[0];temp_reg = temp_reg >> 1;endend.....

MODELADO COMPORTAMIENTO. CONTROL

Page 34: Tutorial Verilog Bloque

Verilog HDSE

q sentencia disabletermina prematuramente un bloque secuencial etiquetado, sentencia procedural o task;

q flujo de actividad paralelo (fork...join)forksentencia1;sentencia2;....join

......parameter half_cycle = 50;initial

begin: clock_loopclock = 0;forever

begin#half_cycle clock = 1;#half_cycle clock = 0;

endend

initial#350 disable clock_loop;....

// implementa tiempo absoluto en un generador de señal.....fork // tsim = 0

#50 sig_wave = ´b1;#100 sig_wave = ’b0;#150 sig_wave = ‘b1;#300 sig_wave = ‘b0; // se ejecuta en tsim= 300

join...... // mismo resultado si se cambia orden

.....begin // bloque secuencial

#50 sig_wave = ‘b1;#100 sig_wave = ’b0;#150 sig_wave = ‘b1;#300 sig_wave = ‘b0; // se ejecuta en tsim= 600

end...... // resultado distinto si se cambia el orden

MODELADO COMPORTAMIENTO. CONTROL

Page 35: Tutorial Verilog Bloque

Verilog HDSE

P Una tarea es un tipo de procedimiento, que es llamado en una sentencia procedural. Lastareas tienen entradas y salidas pero no devuelven ningún valor. Una tarea puede llamar aotra tarea o a una función.

P Una función es un procedimiento que es usado en lugar de una expresión. Tiene al menosuna entrada, ninguna salida, y devuelve un único valor.

P Las tareas pueden incluir controles temporales, no así las funciones.

Ilustramos las diferencias entre una tarea y una función:

LLama_a_una_tarea_y_espera (Input1,Input2,Output);

Resultado_inmediato=Llama_a_una_función(All_Inputs);

begincount = 0; temp_reg = reg_a;while (temp_reg)begincount= count + temp_reg[0];temp_reg = temp_reg >> 1;endendendtaskendmodule

module bit_counter(data_w, bit_count);input [7:0] data_w;output [3:0] bit_count;reg [3:0] bit_count;always @ (data_w)count_ones(data_w, bit_count);

task count_ones;input [7:0] reg_a;output [3:0] count;reg [3:0] count;reg [7:0] temp_reg;

module Func_compara;reg [2:0] A, B,C, D, E, F;initial begin A=1; B=0; D=2; E=3;C=compara(A,B); F=compara(D, E);$display(“A B C D E F”); $display(A, ,B, ,C, ,D, ,E, ,F ); endfunction [2:0] compara; input [2:0] a, b;begin if (a<=b) compara=a; else compara=b; endendfunction

A B C D E F1 0 0 2 3 2

MODELADO COMPORTAMIENTO. FUNCIONES y TAREAS

Page 36: Tutorial Verilog Bloque

Verilog HDSE

q module el_diseñoq Declaraciones de puertosq Declaración de parámetrosq Declaración de tiposq Asignamientos continuosq Instanciado de primitivasq Instanciado de módulosq Declaración de tareasq Declaración de funcionesq Comportamientos

initialalwaysAsignamientos proceduralesAsignamientos non-blockingAsignamientos procedurales continuosBucles (for, repeat, while, forever)Control de flujo (if, condicional, case, wait, disable)Funciones y tareas del sistemaLlamadas funciones y tareas

q endmodule

CONTENIDOS MODULE

Page 37: Tutorial Verilog Bloque

Verilog HDSE

module FSM_estilo1(....);input ...;output ....;parameter size = ...;reg [size-1:0] state, next_state;assign the_outputs = ...// una funcion de las entradas y el estadoassign next_state = ... // una funcion de las entradas y el estadoalways @(negedge reset or posedge clk) if (reset == 1’b0) state <= start_state;else state <= next_state;endmodule

module FSM_estilo2(....);input ...;output ....;parameter size = ...;reg [size-1:0] state, next_state;always @ (state or entradas)begin// decodifica next_state con case o ifendalways @(negedge reset or posedge clk) if (reset == 1’b0) state <= start_state;else beginstate <= next_state;the_outputs <= algún_valor(entradas, next_state)// asignamiento síncrono de las salidasendmodule

P se trata de descripciones explícitasP otros estilos intermedios son posiblesP tambien es posible una descripción más abstracta sin declaración explícita de registros de estado (descripción implícita)

DESCRIPCIÓN FSMs

Page 38: Tutorial Verilog Bloque

Verilog HDSE

// explícitamodule speed_machine (clock, acelarador, freno, velocidad, dyn_ind)input clock, acelerador, freno;output [1:0] velocidad, dyn_ind;reg [1:0] state, next_state;parameter parado = 2’b00;parameter V_baja = 2’b01, desacelarando = 0;parameter V_media = 2’b10, velocidad_constante = 1;parameter V_alta = 2’b11, acelerando = 2;assign velocidad = state;assign dyn_ind = freno ? (state == parado) ? velocidad_constante : desacelerando:acelerador ? (state == V_alta) ? velocidad_constante: acelerando: velocidad_constante;always @(posedge clock) // síncrono gobierna las transiciones de estadostate <= next_state;always @ (state or acelerador or freno) // asíncrono combinacionalif (freno == 1’b1) case (state)parado: next_state <= parado;V_baja: next_state <= parado;V_media: next_state <= V_baja;V_alta: next_state <= V_media;default : parado;endcaseelse if (acelerador == 1’b1) case (state)parado: next_state <= V_baja;V_baja: next_state <= V_media;V_media: next_state <= V_alta;V_alta: next_state <= V_alta;default: parado;endcaseelse next_state <= state;endmodule

freno/acelerador 1- 00 01

parado parado, 1 parado, 1 V_low, 2

V_baja parado, 0 V_baja, 1 V_media, 2

V_media V_baja, 0 V_media, 1 V_alta, 2

V_alta V_media, 0 V_alta, 1 V_alta, 1

DESCRIPCIÓN FSMs

Page 39: Tutorial Verilog Bloque

Verilog HDSE

// descripción implícitamodule contador_1 (clock, up_down, reset, count)input clock, reset;input [1:0] up_down;output [2:0] count;reg [2:0] count;always @(negedge clock or negedge reset)

if (reset == 0) count = 3’b0; else if (up_down == 2’b00 || up_down == 2’b11)

count = count;else if (up_down == 2’b01) count = count + 1;

else if (up_down == 2’b10) count = count - 1;endmodule

// descripción implícitamodule contador_2 (clock, up_down, reset, count)input clock, reset;input [1:0] up_down;output [2:0] count;reg [2:0] count, next_count;always @(negedge clock or negedge reset)

if (reset == 0) count = 3’b0; else count = next_count;always @ (count or up_down) begin if (up_down == 2’b00 || up_down == 2’b11)

next_count = count;else if (up_down == 2’b01) next_count = count + 1;

else if (up_down == 2’b10) next_count = count - 1; else next_count = count;

endendmodule

DESCRIPCIÓN FSMs

Page 40: Tutorial Verilog Bloque

Verilog HDSE

MODELADO DE RETRASOS

Retrasos asociados a nudos y puertas:Ya vimos como el símbolo # nos permitía retrasar

asignamientos, en realidad, con este símbolo po-demos definir retrasos típicos, máximos y míni-mos.

Para asignamientos

#(1.1 : 1.3 : 1.7 ) assign delay_a = a; // mín, típ, máx

Para wires

wire #(1.1 : 1.3 : 1.7 ) delay_a ; // mín, típ, máx

Para puertas podemos definir retrasos típicos, máxi-mos y mínimos así como retrasos asociados a lastransiciones de subida y bajada por separado.

nand #3.0 nd01(c,a,b);nand #(2.6 : 3.0 : 3.4) nd02 (c,b,a);nand #(2.8 : 3.0 : 3.3 , 2.6 : 2.9: 3.1) nd03 (c,b,a);

//(La sintáxis es ( )tsubmin :tsub

tip :tsubmax tbaj

min : tba jtip :tbaj

max,

Page 41: Tutorial Verilog Bloque

Verilog HDSE

VERILOG Y LA SÍNTESIS LÓGICA

P las herramientas de síntesis lógica no soportan todas las construcciones de VerilogP las construcciones soportadas dependen de cada herramienta

construcciones que suelen estar soportadas en síntesisdeclaración de módulos (module)puertos: input, output , inoutasociación de puertos por nombreasociación de puertos por posicióndeclaración de parámetrosnets: wire, tri, wand, wor, supply0, supply1registros: reg, integerinstanciado de módulosinstanciado de primitivasasignamientos continúosoperadores desplazamiento, condicional, concatenación, aritmético, bitwise, redución, lógico y relacionalassign...deassignbegin...endcaseif, if...else, disablebucle fortasks (no se permite control de temporizaciones)funciones

Page 42: Tutorial Verilog Bloque

Verilog HDSE

VERILOG Y LA SÍNTESIS LÓGICA

construcciones generalmente no soportadas en síntesis

construcciones para descripción a nivel de conmutador

fork...join

forever

while

wait

initial

force...release

repeat

primitive...endprimitive

table...endtable

especificaciones de retraso

$time