Verilog Introducción Configuración del entorno Primer programa Elementos básicos Estructura Registros Cables Valores especiales GLSI ULSI VLSI 2 Introducción l Hoy en día, es Imposible hacer el diseño de interconexión del circuito a mano (millones de transistores) l Computer Aided Digital Design: diseño ayudado por computadores 3 Introducción l l Verilog: lenguaje de descripción de hardware HDL: Hardware DescripHon Language l Lenguaje para describir un diseño al nivel de transferencia entre registros l l Los detalles (circuitería) se generan mediante herramientas automáHcas de síntesis a parHr de su descripción en un HDL También se pueden usar para simular y depurar el resultado obtenido l la elaboración de hardware sigue un proceso similar en muchos aspectos con la elaboración de soNware 4 Entorno de trabajo l Sistema operaHvo GNU/Linux l l l Muchas versiones, en clase: Ubuntu Recomendado: instalarse una versión en casa Verilog para Linux l l l GPL Cver: hUp://sourceforge.net/projects/gplcver/ Otra opción: Icarus Verilog Para instalar (ya están instalados en clase): l l l sudo apt-get install glpcver! sudo apt-get install iverilog! Editor de texto l l Se recomienda gedit Trae un resaltador de texto para Verilog 5 Primer programa en verilog • • Queremos un programa que nos salude con la frase “Hola, mundo” Abrid un fichero de texto que se llame hello.v y copiad lo siguiente /* Programa de ejemplo: hello.v */! ! module hello;! ! ! initial! // Imprimimos el mensaje y un salto de lInea! $display("Hola, mundo\n");! ! endmodule! 6 compilación y ejecución Queremos ver en pantalla “Hola, mundo” programación compilación hello.v iverilog hello.v –o hello! /* Programa de ejemplo: hello.v */ module hello; initial // Imprimimos el mensaje y un salto de lInea $display("Hola, mundo\n"); endmodule hello #! /usr/bin/vvp! :ivl_version "0.9.2 " "(v0_9_2)";! :vpi_time_precision + 0;! :vpi_module "system";! :vpi_module "v2005_math";! :vpi_module "va_math";! S_0x9010aa0 .scope module, "hello" "hello" 2 2;! .timescale 0 0;! .scope S_0x9010aa0;! T_0 ;! %vpi_call 2 5 "$display", "Hola, mundo\012";! %end;! .thread T_0;! # The file index is used to find the file name in the following table.! :file_names 3;! "N/A";! "<interactive>";! "hello.v";! ejecución ./hello! con iverilog “Hola, mundo” con cver 7 Ejercicio • Compila y ejecuta el programa “Hola, mundo” 8 Comentarios • • Notas en lenguaje natural para nosotros u otros programadores FUNDAMENTALES para entender, recordar y documentar el código /* Este es un comentario que puede abarcar ! varias líneas */! // Este tipo de comentario sólo abarca una línea! 9 Cadenas de caracteres l l l Conjunto de letras, números o símbolos En Verilog se encierran entre comillas dobles (“) Algunos caracteres se marcan de modo especial l l l l l l \n – comenzar después una nueva línea (retorno de carro) \t – tabulador %% -­‐ % \\ -­‐ \ \” – “ “Hola, mundo\n” es un ejemplo de cadena de 12 caracteres l l l l 4 caracteres para hola una coma y un espacio 5 caracteres para mundo un carácter especial \n para producir un salto a la línea siguiente 10 Constantes numéricas • Cualquier número que no esté entre comillas se interpreta como un número • Se usa el signo menos (-­‐) para los negaHvos • Se usa el punto decimal (.) para los decimales • Se usa la letra e (e) para notación ciengfica • Podemos expresar números en otras bases anteponiendo los prefijos • ‘b (binario) • ‘o (octal) • ‘h (hexadecimal) • Ejemplos • -‘hD1C! • 7.237e6! • ‘b11_1011_111_1000! 11 Variables • Elementos que conHenen valores (de momento numéricos) • Primero se declara su Hpo (puede ser real o entero) • integer i; //variable entera de nombre i! • real f; !//variable real de nombre f! • Asignación de valor: • i=4;! • f=2.7172;! • UHlización de su valor en disHntas operaciones • Por ejemplo en operaciones aritméHcas (+,-­‐,* y /) • • • • Exponenciación: ** Operación módulo: % a=b+2.88;! a=a**2;! 12 función $display • Una función nos da un resultado a parHr de una entrada parámetros de entrada cadena de texto variables función salida o resultado $display texto por pantalla $display(cadena de texto, variables)! ! $display(“i vale %d y f vale %g”, i, f)! ! i vale 4 y f vale 2.7172 • En $display, %d y %g nos dan el formato con el que imprimir el valor de las variables (como entero o como real, respecHvamente) 13 $display Formato Descripción %d! Entero en decimal %b! Entero en binario %o! Entero en octal %h! Entero en hexadecimal %c! Carácter %s! Cadena de caracteres %f! %e! %g! Real en formato decimal Real en formato ciengfico Real en el formato más corto de los dos anteriores 14 Bloques de código • Conjunto delimitado de dos o más líneas de código • Pueden tener un propósito común • O encontrarse dentro de alguna estructura superior • Comienza por begin y termina por end:! integer i;! real f;! ! initial! begin! i=4;! bloque initial f=2.7172;! $display("i vale %d y f vale %g",i,f);! end! 15 estructura del programa nombre del módulo área de definición de variables bloque “initial” área de instrucciones fin del módulo • Notas: • Las declaraciones de variables e instrucciones deben acabar en punto y coma (;) • El comienzo (module) y fin (endmodule) del módulo son obligatorios • La mayoría de esta sintaxis es muy parecida a la de C que veréis en Programación 16 Ejercicio • Modificar y ejecutar el programa “Hola, mundo”, de modo que ahora diga “Hola mundo, son las X”, donde X es la hora actual, que se debe almacenar en una variable de nombre h! • NOTA: guardad el fichero con otro nombre, por ejemplo hello2.v • Así podréis ir teniendo vuestra propia biblioteca de programas, para consultar y reuHlizar • Es importante que los nombres y los comentarios sean explicaHvos de lo que hacen los programas 17 Ejercicio 11 • Responde a las siguientes preguntas de ejemplos vistos en teoría, uHlizando Verilog: • • • • Expresa en decimal el número hexadecimal 0x1FEA Ídem para el número 10001012 Ídem para el octal 1234 Pasa a hexadecimal el binario 10100112 18 • NOTA: los números de los ejercicios corresponden a los uHlizados en las sesiones en hUp://avellano.usal.es/~compi/ Registros l l Un registro es un componente de almacenamiento dentro de la circuitería de un ordenador En verilog se simulan como vectores de uno o más bits reg reloj; /* reg [31:0] busA; /* reg signed [63:0] m; /* ! ! reloj! ! ! ! 0 1 2 3 4 5 6 7 8 9 10 11 ! 0 reloj=1'b0;! busA='hAAAABBBB;! 1 busA[7:4]=4'hC;! m=-1;! Registro de un bit */! Registro de 32 bits, sin signo */! Registro de 64 bits, con signo */! busA! … 30 31 reloj! 0 1 0 1 0 1 0 1 1 0 0 ...! 1 0 1 1 1 0 1 1 busA! 19 Ejercicio 12 • Almacenad en un registro de 16 bits el número 1025 en decimal e imprimidlo en binario, decimal y hexadecimal • Escribid en el registro de 16 bits el número más grande que se puede almacenar. ¿Cuál es en hexadedimal? ¿Y en decimal? 20 Redes y cables • Hay un Hpo especial de variables en Verilog llamadas nets (redes) de las que el Hpo más frecuente es wire (cable) • Se usan como los cables reales, para conectar elementos del circuito entre sí. • Un cable puede contener información! • Dependiendo de si pasa voltaje (1) o no (0) à 1 bit de información • Sin embargo, no pueden almacenar la información como los registros, si no que necesitan de otro elemento que se la proporcione (p. ej. un registro o la salida de un circuito) 21 Valores especiales • Un bit de un cable o registro puede tomar dos valores disHntos a los normales (0 y 1) • Indefinido: se representa por x e indica que el valor puede ser 0 o 1 (no se sabe) • Si se declara un registro pero no se le da valor, todos sus bits son x! • Alta impedancia: se representa por z y Hene el significado habitual en electrónica (~ un cable desconectado) 22 Ejercicio 20 • Definid un registro de 16 bits que tenga sus cuatro bits más significaHvos a 0, los siguientes cuatro a 1, los siguientes cuatro a x y los úlHmos cuatro a z • Imprimid en binario el valor del registro. ¿Qué pasa si lo imprimís en decimal? • Realizad operaciones con él y observad los cambios 23 24