Creazione degli stimoli
Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 74 di 90.
Lo stimolo si riferisce ai valori di input che applichi al tuo progetto per verificare che funzioni correttamente. Modificando gli input e osservando gli output, puoi verificare che il tuo progetto si comporti come previsto.
Pensala come testare una macchina: premi diversi pulsanti (stimolo) e osserva cosa succede (output). Creare buoni stimoli è una parte essenziale della scrittura di un testbench.
Per esempio, guarda lo stimulus nel seguente testbench:
module testbench;
reg a, b;
wire c;
and_gate dut (
.a(a),
.b(b),
.c(c)
);
initial begin
// LO STIMOLO INIZIA QUI
// Caso di test 1: entrambi gli ingressi sono 0
a = 0; b = 0; #10;
// Caso di test 2: a=0, b=1
a = 0; b = 1; #10;
// Caso di test 3: a=1, b=0
a = 1; b = 0; #10;
// Caso di test 4: entrambi gli ingressi sono 1
a = 1; b = 1; #10;
// LO STIMOLO FINISCE QUI
$finish;
end
endmoduleOgni stimolo viene applicato, poi attendiamo 10 unità di tempo (#10) prima dello stimolo successivo. Questo dà al DUT il tempo di produrre un output.
Metodi per creare STIMULUS
| Metodo | Ideale per | Esempio |
|---|---|---|
| Assegnazioni sequenziali | Test semplici | a = 0; b = 0; #10; |
| Ciclo for | Testare tutte le combinazioni | for (i = 0; i < 4; i++) |
| Ciclo repeat | Ripetere schemi | repeat (10) #5 clk = ~clk; |
| Ciclo forever | Segnali continui | forever #5 clk = ~clk; |
Metodo 1: Assegnazioni sequenziali
Il modo più semplice per creare uno stimolo. Assegni i valori uno alla volta con dei ritardi.
initial begin
a = 0; b = 0; #10;
a = 0; b = 1; #10;
a = 1; b = 0; #10;
a = 1; b = 1; #10;
$finish;
endMetodo 2: Ciclo for
Utile quando vuoi testare tutte le possibili combinazioni di input.
integer i;
initial begin
for (i = 0; i < 4; i = i + 1) begin
{a, b} = i;
#10;
end
$finish;
endQuesto verifica: 00, 01, 10, 11.
Metodo 3: Ciclo repeat
Utile per ripetere lo stesso stimolo molte volte.
initial begin
a = 0; b = 1;
repeat (10) begin
#10 a = ~a;
end
$finish;
endMetodo 4: Ciclo infinito
Utile per segnali continui come gli orologi.
initial begin
clk = 0;
forever #5 clk = ~clk;
endRegole importanti
| Regola | Spiegazione |
|---|---|
| Usa ritardi tra le assegnazioni dello stimolo | #10 consente al DUT di rispondere |
Usa reg per i segnali di stimolo | Perché cambiano nel tempo |
Aggiungi $finish alla fine | Per arrestare la simulazione |
Sfida
Ti viene fornito un modulo porta OR. Il tuo compito è aggiungere lo stimolo mancante e le istruzioni $display per stampare i risultati.
Cosa fare:
Aggiungi lo stimolo per testare tutte e quattro le combinazioni di input (00, 01, 10, 11):
- Su ogni riga, imposta i valori di
xey - Aggiungi
#10per un ritardo - Aggiungi
$displayper stampare il risultato
$display dovrebbe essere così:
$display("%d %d | %d", x, y, z);Provalo tu
module or_gate (
input x,
input y,
output z
);
assign z = x | y;
endmodule
module testbench;
reg x, y;
wire z;
or_gate dut (
.x(x),
.y(y),
.z(z)
);
initial begin
$display("x y | z");
$display("---------");
// TODO: Aggiungi gli stimoli e visualizza il risultato per 0 0
// TODO: Aggiungi gli stimoli e visualizza il risultato per 0 1
// TODO: Aggiungi gli stimoli e visualizza il risultato per 1 0
// TODO: Aggiungi gli stimoli e visualizza il risultato per 1 1
$finish;
end
endmoduleQuesta lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte 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 operatori14Fondamenti del testbench
Cos'è un testbenchCreazione degli stimoliVisualizzazione e monitoraggioDumpfile e DumpvarsUso dei task di sistemaRiepilogo - testbench completo3Sistema 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 1Esercitati da solo: Compilatore Verilog online