Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad

Taller de Simulación con Icarus Verilog: Diseño y Verificación de Circuitos Digitales, Ejercicios de Diseño

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

2023/2024

Subido el 01/11/2024

alexander-vera-tasama
alexander-vera-tasama 🇨🇴

1 documento

1 / 8

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
TUTORIAL/TALLER DE SIMULACIÓN EN ICARUS VERILOG
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
pf3
pf4
pf5
pf8

Vista previa parcial del texto

¡Descarga Taller de Simulación con Icarus Verilog: Diseño y Verificación de Circuitos Digitales y más Ejercicios en PDF de Diseño solo en Docsity!

TUTORIAL/TALLER DE SIMULACIÓN EN ICARUS VERILOG

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;