Criando Estímulos
Parte da seção Fundamentos do Journey de Verilog da Coddy — lição 74 de 90.
Estímulo refere-se aos valores de entrada que você aplica ao seu projeto para testar se ele funciona corretamente. Ao alterar as entradas e observar as saídas, você pode verificar se o seu projeto se comporta como esperado.
Pense nisso como testar uma máquina: você pressiona botões diferentes (estímulos) e observa o que acontece (saídas). Criar bons estímulos é uma parte essencial da escrita de um testbench.
Por exemplo, veja o estímulo no seguinte testbench:
module testbench;
reg a, b;
wire c;
and_gate dut (
.a(a),
.b(b),
.c(c)
);
initial begin
// O ESTÍMULO COMEÇA AQUI
// Caso de teste 1: Ambas as entradas são 0
a = 0; b = 0; #10;
// Caso de teste 2: a=0, b=1
a = 0; b = 1; #10;
// Caso de teste 3: a=1, b=0
a = 1; b = 0; #10;
// Caso de teste 4: Ambas as entradas são 1
a = 1; b = 1; #10;
// O ESTÍMULO TERMINA AQUI
$finish;
end
endmoduleCada estímulo é aplicado, então esperamos 10 unidades de tempo (#10) antes do próximo estímulo. Isso dá ao DUT tempo para produzir uma saída.
Métodos para Criar Estímulos
| Método | Melhor Para | Exemplo |
|---|---|---|
| Atribuições sequenciais | Testes simples | a = 0; b = 0; #10; |
| Loop for | Testar todas as combinações | for (i = 0; i < 4; i++) |
| Loop repeat | Padrões de repetição | repeat (10) #5 clk = ~clk; |
| Loop forever | Sinais contínuos | forever #5 clk = ~clk; |
Método 1: Atribuições Sequenciais
A maneira mais simples de criar estímulos. Você atribui valores um por um com atrasos.
initial begin
a = 0; b = 0; #10;
a = 0; b = 1; #10;
a = 1; b = 0; #10;
a = 1; b = 1; #10;
$finish;
endMétodo 2: Loop For
Útil quando você deseja testar todas as combinações de entrada possíveis.
integer i;
initial begin
for (i = 0; i < 4; i = i + 1) begin
{a, b} = i;
#10;
end
$finish;
endIsso testa: 00, 01, 10, 11.
Método 3: Loop Repeat
Útil para repetir o mesmo estímulo muitas vezes.
initial begin
a = 0; b = 1;
repeat (10) begin
#10 a = ~a;
end
$finish;
endMétodo 4: Loop Forever
Útil para sinais contínuos como clocks.
initial begin
clk = 0;
forever #5 clk = ~clk;
endRegras Importantes
| Regra | Explicação |
|---|---|
| Use atrasos entre atribuições de estímulos | #10 permite tempo para o DUT responder |
Use reg para sinais de estímulo | Porque eles mudam ao longo do tempo |
Adicione $finish ao final | Para parar a simulação |
Desafio
Você recebeu um módulo de porta OR. Sua tarefa é adicionar o estímulo ausente e as instruções $display para imprimir os resultados.
O que fazer:
Adicione estímulo para testar todas as quatro combinações de entrada (00, 01, 10, 11):
- Em cada linha, defina os valores para
xey - Adicione
#10para um atraso - Adicione
$displaypara imprimir o resultado
O <strong>$display</strong> deve ser assim:
$display("%d %d | %d", x, y, z);Folha de consulta
Estímulo (Stimulus) são os valores de entrada aplicados a um DUT em um testbench para verificar o comportamento correto.
Métodos para Criar Estímulos
Atribuições sequenciais – abordagem mais simples:
initial begin
a = 0; b = 0; #10;
a = 0; b = 1; #10;
$finish;
endLoop For – testa todas as combinações de entrada:
integer i;
initial begin
for (i = 0; i < 4; i = i + 1) begin
{a, b} = i; #10;
end
$finish;
endLoop Repeat – repete o estímulo N vezes:
repeat (10) begin
#10 a = ~a;
endLoop Forever – sinais contínuos como clocks:
initial begin
clk = 0;
forever #5 clk = ~clk;
endRegras Principais
- Use
regpara sinais de estímulo (eles mudam ao longo do tempo) - Adicione atrasos (ex:
#10) entre as atribuições para permitir que o DUT responda - Encerre a simulação com
$finish
Experimente você mesmo
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: Adicionar estímulo e exibição para 0 0
// TODO: Adicionar estímulo e exibição para 0 1
// TODO: Adicionar estímulo e exibição para 1 0
// TODO: Adicionar estímulo e exibição para 1 1
$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 SoftwareNíveis de Abstração de ProjetoSeu Primeiro MóduloComentários4Operadores Parte 1
Operadores AritméticosOperador de MóduloOperadores de ComparaçãoRecapitulação - Matemática SimplesOperadores Bitwise7Atribuição e Portas Lógicas
Atribuição ContínuaAtribuição com OperadoresPrimitivas de Portas IntegradasPortas AND, OR e NOTPortas XOR e XNORRecapitulação - Circuito de Portas Lógicas10Tomada de Decisão
Instrução IfIf - ElseRecapitulação - Comparador SimplesInstrução CaseCasex e CasezRecapitulação - Projeto de ALU2Tipos de Dados
Tipo WireTipo RegInteger e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores Parte 2
Operadores LógicosOperadores de ReduçãoOperadores de DeslocamentoOperador de ConcatenaçãoOperador CondicionalRecapitulação - Desafio de Operadores14Fundamentos de Testbench
O que é um TestbenchCriando EstímulosDisplay e MonitorDumpfile e DumpvarsUsando Tarefas de SistemaRecapitulação - Testbench Completo3Sistemas de Numeração
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRecapitulação - Formatos de Números6Módulos
Estrutura de MóduloPortas de Entrada e SaídaPortas InoutInstanciação de MóduloMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação - Construa um Módulo