Escritura del banco de pruebas
Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 82 de 90.
Desafío
En esta lección, crearás un banco de pruebas para verificar que el controlador del semáforo funciona correctamente.
Qué hacer:
Crea un banco de pruebas que:
- Declare señales (
regpara clk y reset,wirepara red, yellow, green) - Instancie el módulo
traffic_lightcon el nombreuut - Genere un reloj que cambie de estado cada 1 unidad de tiempo
- Aplique el reinicio durante 2 unidades de tiempo y después lo libere
- Ejecute la simulación durante 100 unidades de tiempo
La simulación se comprueba mediante lo que imprime, por lo que el bloque initial también debe producir exactamente estas líneas:
- Imprima
Traffic Light Testcon$displayantes de configurar el reloj y el reinicio - Después de las 100 unidades de tiempo, imprima
Test completecon$display - Finalice la simulación con
$finish, que añade su propia línea a la salida
Pruébalo tú mismo
module traffic_light (
input clk,
input reset,
output reg red,
output reg yellow,
output reg green
);
reg [1:0] state;
reg [5:0] counter;
// Asignaciones de salida
always @(*) begin
case (state)
0: begin green = 1; yellow = 0; red = 0; end
1: begin green = 0; yellow = 1; red = 0; end
2: begin green = 0; yellow = 0; red = 1; end
default: begin green = 0; yellow = 0; red = 1; end
endcase
end
// Máquina de estados con temporización
always @(posedge clk or posedge reset) begin
if (reset) begin
state <= 2;
counter <= 0;
end else begin
if (counter == 0) begin
case (state)
0: begin
state <= 1;
counter <= 10;
end
1: begin
state <= 2;
counter <= 40;
end
2: begin
state <= 0;
counter <= 30;
end
endcase
end else begin
counter <= counter - 1;
end
end
end
endmodule
module testbench;
// TODO: Declarar reg para clk y reset
// TODO: Declarar wire para red, yellow, green
// TODO: Instanciar el módulo traffic_light con el nombre uut
// Conectar clk, reset, red, yellow, green
// TODO: Generar el reloj (alternar cada 1 unidad de tiempo)
initial begin
$display("Traffic Light Test");
// TODO: Inicializar clk a 0
// TODO: Aplicar reset (reset=1 durante 2 unidades de tiempo, luego reset=0)
// TODO: Ejecutar la simulación durante 100 unidades de tiempo
$display("Test complete");
$finish;
end
endmoduleTodas las lecciones de Fundamentos
1Introducción
Qué es VerilogHardware frente a softwareTu primer móduloComentariosNiveles de abstracción del diseño4Operadores, parte 1
Operadores aritméticosOperador móduloOperadores de comparaciónRepaso: matemáticas simplesOperadores bit a bit7Asignaciones y compuertas
Asignación continuaAsignación con operadoresPrimitivas de compuertas integradasCompuertas AND, OR y NOTCompuertas XOR y XNORRepaso: circuito de compuertas lógicas10Toma de decisiones
Sentencia IfIf - ElseRepaso - Comparador simpleSentencia CaseCasex y CasezRepaso - Diseño de ALU5Operadores, parte 2
Operadores lógicosOperadores de reducciónOperadores de desplazamientoOperador de concatenaciónOperador condicionalRepaso: desafío de operadores11Bucles
Bucle ForBucle WhileBucle de repeticiónBucle infinitoInstrucción DisableRepaso: patrones de bucles3Sistema numérico
Representación binariaNúmeros con tamañoNúmeros sin tamañoNúmeros negativosValores especiales X y ZRepaso: formatos numéricos6Módulos
Estructura de módulosPuertos de entrada y salidaPuertos inoutInstanciación de módulosAsignación de puertos por nombreAsignación de puertos por ordenRepaso: construir un módulo9Bloques procedurales
Bloque AlwaysBloque InitialLista de sensibilidadAsignación bloqueanteAsignación no bloqueanteRepaso: Always vs Initial15Controlador de semáforos
Definición de los estadosLógica de la máquina de estadosPractica por tu cuenta: Compilador de Verilog online