What Is A Testbench
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 73 von 90.
Ein testbench ist ein spezielles Verilog-module, das zum Testen eines anderen module verwendet wird. Es stellt deinem Design inputs bereit und prüft, ob die outputs korrekt sind.
Warum brauchen wir ein Testbench?
Wenn du ein Modul erstellst, musst du sicherstellen, dass es korrekt funktioniert. Mit einem Testbench kannst du:
- Unterschiedliche Eingabewerte auf dein Modul anwenden
- Die Ausgaben beobachten
- Überprüfe, ob die Ausgaben deinen Erwartungen entsprechen
- Führe dies automatisch ohne manuelles Testen durch
Testbench vs. Designmodul
| Designmodul | Testbench | |
|---|---|---|
| Zweck | Implementiert Hardware | Testet das Designmodul |
| Hat ports? | Ja (inputs und outputs) | Nein (eigenständig) |
| Synthetisierbar? | Ja | Nein (nur simulation) |
Einfaches Testbench-Beispiel
module testbench; // Keine Ports!
// Die Eingänge und Ausgänge kommen von dem Modul, das wir testen (dem DUT).
reg a, b; // reg für Eingänge
wire c; // wire für Ausgang
// Dies ist eine Modulinstanziierung — sie erstellt eine Kopie des and_gate-Moduls und nennt sie dut
and_gate dut ( // DUT instanziieren
.a(a),
.b(b),
.c(c)
);
// Dies ist ein initial-Block, der Testwerte auf die Eingänge des zu testenden Moduls anwendet.
initial begin // Testwerte anwenden
a = 0; b = 0; #10;
a = 0; b = 1; #10;
a = 1; b = 0; #10;
a = 1; b = 1; #10;
$finish;
end
endmoduleWichtige Punkte
- Testbench hat keine ports
regwird für signals verwendet, die sich ändern (inputs an DUT)wirewird für signals von DUT (outputs) verwendet
- Das getestete Modul heißt DUT (Design Under Test).
$finishbeendet die Simulation.
In den folgenden Lektionen werden wir das Erstellen von Stimuli, das Anzeigen von Ergebnissen und weitere Funktionen von testbench behandeln.
Aufgabe
Du erhältst ein AND-Gattermodul. Deine Aufgabe besteht darin, die fehlenden Teile zu seinem testbench hinzuzufügen.
Was zu tun ist:
Füge die folgenden Teile zum testbench hinzu:
- Deklariere
regfür die Eingängeaundb - Deklariere
wirefür den Ausgangc - Instanziiere
and_gatemit dem Namendutund verbinde die ports
Probier es selbst
module and_gate (
input a,
input b,
output c
);
assign c = a & b;
endmodule
module testbench;
// Aufgabe 1: Deklariere reg für die Eingänge a und b
// Aufgabe 2: Deklariere wire für den Ausgang c
// Aufgabe 3: Instanziiere and_gate mit dem Namen dut
// Verbinde .a(a), .b(b), .c(c)
initial begin
a = 0; b = 0; #10 $display("%d & %d = %d", a, b, c);
a = 0; b = 1; #10 $display("%d & %d = %d", a, b, c);
a = 1; b = 0; #10 $display("%d & %d = %d", a, b, c);
a = 1; b = 1; #10 $display("%d & %d = %d", a, b, c);
$finish;
end
endmoduleDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Einführung
Was ist VerilogHardware vs. SoftwareIhr erstes ModulKommentareAbstraktionsebenen des Designs4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge14Testbench Basics
What Is A TestbenchCreating StimulusDisplay And MonitorDumpfile And DumpvarsUsing System TasksRecap - Full Testbench3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicÜbe selbstständig: Online-Verilog-Compiler