




Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Los mejores documentos en venta realizados por estudiantes que han terminado sus estudios
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Descubre las mejores universidades de tu país según los usuarios de Docsity
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Este tutorial práctico se centra en la simulación de circuitos digitales utilizando icarus verilog, un simulador funcional de verilog. Los conceptos básicos de la simulación de verilog, incluyendo la creación de testbenches, la compilación y simulación de código verilog, y la visualización de señales utilizando gtkwave. Se incluyen ejemplos prácticos y ejercicios para ayudar a los estudiantes a comprender los conceptos y aplicarlos en la práctica.
Tipo: Ejercicios
1 / 8
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!
IcarusVerilog es un simulador funcional de Verilog, es decir, simula el comportamiento a nivel lógico sin considerar la tecnología de fabricación o simulación a nivel de transistores. Este tipo de simulación es un paso importante en el ciclo de diseño porque permite verificar el funcionamiento lógico de un proyecto sin entrar en detalle en problemas que puedan residir por imposiciones de tiempos de propagación de las diferentes compuertas. Ese tipo de simulación se explorará con otra herramienta. Es importante tener en cuenta que, para la simulación de sistemas digitales descritos en un HDL, es conveniente diseñar el banco de pruebas o testbench también descrito en HDL. Para ello, con base en el esquema de la Figura 1, es necesario crear una instancia del módulo diseñado o descrito y que requiere ser verificado mediante simulación. En el testbench, esta instancia suele denominase Unidad bajo prueba ( UUT – Unit Under Test ), aunque también se le puede identificar como SUT ( System Under Test ), MUT ( Model Under Test ), DUT ( Design Under Test ). Sobre las entradas de esta instancia se deben crear y aplicar estímulos que permitan verificar su funcionamiento, desde la observación de las señales de salida. 1) Compilación y simulación module ffd(input d, input clk, input rst, output reg q); //Positive clock edge. What about the rst event? always @(posedge clk, negedge rst) begin if (!rst) q <= 1'b0; else begin q <= d; end end endmodule ffd.v sistema.v … … Entradas Salidas Módulo descrito en HDL Testbench descrito en HDL sistema_tb.v sistema.v … … Entradas Salidas Unidad bajo prueba - UUT Generación de Estímulos Observación de salidas Figura 1. Modelo de un Testbench
module ffd_tb; //To the Unit Under Test inputs reg d; reg rst; reg clk; //Outputs wire q; //Unit Under Test instantiation ffd uut_ffd(.d(d),.clk(clk),.rst(rst),.q(q)); //stimuli generation always begin #4 clk=!clk; end initial begin clk=1'b0; //clock level when the system starts rst=1'b0; //rst level when the system starts //Dump results of the simulation to flipflopd.cvd $dumpfile("flipflopd.vcd"); $dumpvars; //display the values of the inputs and outputs during simulation $monitor($time, "clk=%b, rst=%b, d=%b, q=%b", clk, rst, d, q); //Generate input signals d and rst d=1'b0; #6 rst=1'b1; #3 d=1'b1; #1 d=1'b0; #1 d=1'b1; #2 d=1'b0; #1 d=1'b1; #3 rst=1'b0; //insert a rst event #2 rst=1'b1; #7 d=1'b0; #1 d=1'b1; #2 d=1'b0; #1 d=1'b1; #1 d=1'b0; #1 d=1'b1; #1 d=1'b0; #7 d=1'b1;
$finish; end endmodule ffd_tb.v
2) Visualización de Señales Para visualizar las señales almacenadas en el archivo vcd se puede usar la aplicación GTKwave , para ello en el terminal escriba: gtkwave Dentro de GTKwave escoja File > Open New Tab y seleccione el archivo flipflopd.vcd (Ver Figura 3). Para cargarlo de clic en el botón Open que aparece al lado izquierdo. Figura 3. Carga del Archivo VCD en GTKWave
Ahora, hay que incluir las señales que serán visualizadas. Para ello en el panel de la izquierda de la ventana de GTKWave, expanda el módulo de testbench, ffd_tb (1) para seleccionar la unidad bajo prueba o instancia, uut_ffd (2), eso hace que aparezcan las señales en la parte inferior del panel izquierdo (3) como se muestra en la Figura 4-Paso 1. Posteriormente, seleccione las señales que desea visualizar (Ver Figura 4-Paso 2) (4), y de clic en el botón Insert (5). Inmediatamente aparecerán las señales en el panel derecho. Debe cambiar la escala de tiempo dando clic en el botón – o + para hacer Zoom (6), también puede utilizar el botón Zoom Fit (Ver Figura 4-Paso 3). 1 2 4 Paso 1 3 Paso 2 5 Paso 3 6 Figura 4. Selección de señales a visualizar en GTKwave
Actividad 2. Cree un script de verilog como aparece en el recuadro de abajo para describir el módulo ffd_syncre ( ffd_syncre.v ). Elabore el testbench de manera que se obtenga el diagrama de la Figura 7. El comportamiento de la señal de salida es coherente con los estímulos aplicados y la descripción HDL? Analice los resultados. Actividad 3. Cree un script de verilog para describir un módulo EN_Register ( EN_Register.v ), considerando los parámetros y las señales de entrada y salida descritas en el recuadro de abajo. El módulo debe corresponder a un registro de carga paralela con habilitador y reset síncronos, activos en alto, sensible a flancos positivos de reloj. El ancho de palabra para los datos está definido por el parámetro REG_WIDTH. Elabore también el testbench de manera que se pueda verificar el comportamiento de la unidad diseñada. module ffd_syncre(input d, input clk, input rst, input en, output reg q); //Positive clock edge. What about the rst event? always @(posedge clk) begin if (!rst) q <= 1'b0; else if (en) q <= d; end endmodule Figura 7. Resultados esperados de Testbench
Actividad 4. Cree un script de verilog para describir un módulo GPR_Register ( GPR_Register.v ), considerando los parámetros y las señales de entrada y salida descritas en el recuadro de abajo. El módulo debe corresponder a un registro de propósito general que instancie el módulo creado en la actividad anterior ( EN_Register ) en una descripción estructural, de manera que, dado un dato de entrada Data_In de ancho COMM_BUS_WIDTH , su parte alta (más significativa) sea cargada en un registro y su parte baja (menos significativa) sea cargada en otro registro, controlados por las señales H_En y L_En respectivamente. El ancho de palabra para la salida de datos es el mismo de los datos de entrada ( COMM_BUS_WIDTH ). Elabore también el testbench de manera que se pueda verificar el comportamiento de la unidad diseñada. Actividad 5. Con las unidades diseñadas en las actividades 3 y 4, cree un script de verilog para describir de manera estructural un módulo GPR_BANK ( GPR_Bank.v ) que corresponde a un banco de REG_QTY registros de propósito general, con ancho COMM_BUS_WIDTH. Elabore también el testbench de manera que se pueda verificar el comportamiento de la unidad diseñada. timescale 1ns / 1ps module EN_Register( Di, EN, RST, clk, Qi); parameter REG_WIDTH=8; input EN, RST, clk; input [REG_WIDTH-1:0] Di; output reg [REG_WIDTH-1:0] Qi;
timescale 1ns / 1ps module GP_REGISTER(H_En, L_En, clk, RST, Data_In, Data_Out); parameter COMM_BUS_WIDTH = 8; input H_En, L_En, clk, RST; input [(COMM_BUS_WIDTH-1):0] Data_In; output [(COMM_BUS_WIDTH-1):0] Data_Out;