Scrivere il testbench
Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 82 di 90.
Sfida
In questa lezione creerai un testbench per verificare che il controller del semaforo funzioni correttamente.
Cosa fare:
Crea un testbench che:
- Dichiara i segnali (
regper clk e reset,wireper red, yellow, green) - Istanzia il modulo
traffic_lightcon il nomeuut - Genera un clock che cambia stato ogni 1 unità di tempo
- Applica il reset per 2 unità di tempo, poi lo disattiva
- Esegue la simulazione per 100 unità di tempo
La simulazione viene verificata in base a ciò che stampa, quindi anche il blocco initial deve produrre esattamente queste righe:
- Stampa
Traffic Light Testcon$displayprima di impostare il clock e il reset - Dopo le 100 unità di tempo, stampa
Test completecon$display - Termina la simulazione con
$finish, che aggiunge una propria riga all'output
Provalo tu
module traffic_light (
input clk,
input reset,
output reg red,
output reg yellow,
output reg green
);
reg [1:0] state;
reg [5:0] counter;
// Assegnazioni delle uscite
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
// Macchina a stati con temporizzazione
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: Dichiara variabili reg per clk e reset
// TODO: Dichiara variabili wire per red, yellow, green
// TODO: Istanzia il modulo traffic_light con il nome uut
// Collega clk, reset, red, yellow, green
// TODO: Genera il clock (inverti il segnale ogni 1 unità di tempo)
initial begin
$display("Traffic Light Test");
// TODO: Inizializza clk a 0
// TODO: Applica reset (reset=1 per 2 unità di tempo, poi reset=0)
// TODO: Esegui la simulazione per 100 unità di tempo
$display("Test complete");
$finish;
end
endmoduleTutte le lezioni di Fondamenti
1Introduzione
Cos'è VerilogHardware e software a confrontoIl tuo primo moduloCommentiLivelli di astrazione della progettazione4Operatori - Parte 1
Operatori aritmeticiOperatore moduloOperatori di confrontoRiepilogo - Matematica sempliceOperatori bitwise7Assegnazioni e porte
Assegnazione continuaAssegnazioni con operatoriPrimitive di porte integratePorte AND, OR e NOTPorte XOR e XNORRiepilogo: circuito con porte logiche10Decisioni
Istruzione ifIf-ElseRiepilogo - Comparatore sempliceIstruzione caseCasex e casezRiepilogo - Progettazione di una ALU5Operatori Parte 2
Operatori logiciOperatori di riduzioneOperatori di scorrimentoOperatore di concatenazioneOperatore condizionaleRiepilogo - Sfida sugli operatori3Sistema numerico
Rappresentazione binariaNumeri con dimensione specificataNumeri senza dimensione specificataNumeri negativiValori speciali X e ZRiepilogo - Formati numerici6Moduli
Struttura di un moduloPorte di input e outputPorte InoutIstanziazione di un moduloMappatura delle porte per nomeMappatura delle porte per ordineRiepilogo - Costruire un modulo9Blocchi procedurali
Blocco alwaysBlocco initialLista di sensibilitàAssegnazione bloccanteAssegnazione non bloccanteRiepilogo: always vs initial12Progetto Multiplexer
Progettazione di un mux da 2 a 1Progettazione di un mux da 4 a 115Controllore del semaforo
Definire gli statiLogica della macchina a statiEsercitati da solo: Compilatore Verilog online