What Is A Testbench
Parte da seção Fundamentos do Journey de Verilog da Coddy. Lição 73 de 90.
Um testbench é um module especial do Verilog usado para testar outro module. Ele fornece inputs ao seu design e verifica se os outputs estão corretos.
Por que precisamos de um testbench?
Ao criar um módulo, você precisa garantir que ele funcione corretamente. Um testbench permite:
- Aplicar diferentes valores de entrada ao seu módulo
- Observar as saídas
- Verifique se as saídas correspondem ao que você espera
- Faça isso automaticamente sem testes manuais
Testbench vs Módulo de Design
| Módulo de Design | Testbench | |
|---|---|---|
| Objetivo | Implementa hardware | Testa o módulo de design |
| Possui portas? | Sim (inputs e outputs) | Não (autocontido) |
| Sintetizável? | Sim | Não (apenas simulação) |
Exemplo simples de testbench
module testbench; // Sem portas!
// As entradas e saídas vêm do módulo que estamos testando (o DUT).
reg a, b; // reg para entradas
wire c; // wire para saída
// Esta é a instanciação de módulo — ela cria uma cópia do módulo and_gate e a nomeia dut
and_gate dut ( // Instanciar DUT
.a(a),
.b(b),
.c(c)
);
// Este é um bloco initial que aplica valores de teste às entradas do módulo que está sendo testado.
initial begin // Aplicar valores de teste
a = 0; b = 0; #10;
a = 0; b = 1; #10;
a = 1; b = 0; #10;
a = 1; b = 1; #10;
$finish;
end
endmodulePontos principais
- testbench não tem ports
regé usado para signals que change (inputs para DUT)wireé usado para signals de DUT (outputs)
- O módulo que está sendo testado é chamado de DUT (Design Under Test)
$finishencerra a simulação
Nas próximas lições, abordaremos a criação de estímulos, a exibição de resultados e outros recursos de testbench.
Desafio
Você recebeu um módulo de porta AND. Sua tarefa é adicionar as partes que faltam ao testbench.
O que fazer:
Adicione as seguintes partes ao testbench:
- Declare
regpara as entradasaeb - Declare
wirepara a saídac - Instancie
and_gatecom o nomedute conecte as portas
Experimente você mesmo
module and_gate (
input a,
input b,
output c
);
assign c = a & b;
endmodule
module testbench;
// Tarefa 1: Declare reg para as entradas a e b
// Tarefa 2: Declare wire para a saída c
// Tarefa 3: Instancie and_gate com o nome dut
// Conecte .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
endmoduleEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1Introdução
O que é VerilogHardware vs. SoftwareSeu primeiro móduloComentáriosNíveis de abstração de projeto4Operators 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 LogicPratique por conta própria: Compilador de Verilog online