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 conforme o esperado.
Pense nisso como testar uma máquina: você pressiona botões diferentes (estímulo) e observa o que acontece (saídas). Criar um bom estímulo é uma parte essencial da escrita de um testbench.
Por exemplo, observe o estímulo no testbench a seguir:
module testbench;
reg a, b;
wire c;
and_gate dut (
.a(a),
.b(b),
.c(c)
);
initial begin
// 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;
// ESTÍMULO TERMINA AQUI
$finish;
end
endmoduleCada estímulo é aplicado e, em seguida, 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 | Ideal para | Exemplo |
|---|---|---|
| Atribuições sequenciais | Testes simples | a = 0; b = 0; #10; |
| Laço for | Testar todas as combinações | for (i = 0; i < 4; i++) |
| Laço repeat | Repetir padrões | repeat (10) #5 clk = ~clk; |
| Laço 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ê quer 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;
endIsto testa: 00, 01, 10, 11.
Método 3: Loop de repetição
Ú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 infinito
Útil para sinais contínuos, como relógios.
initial begin
clk = 0;
forever #5 clk = ~clk;
endRegras importantes
| Regra | Explicação |
|---|---|
| Use atrasos entre as atribuições de estímulos | #10 permite que o DUT responda |
Use reg para sinais de estímulo | Porque eles mudam ao longo do tempo |
Adicione $finish ao final | Para interromper 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ímulos para testar todas as quatro combinações de entrada (00, 01, 10, 11):
- Em cada linha, defina os valores de
xey - Adicione
#10para um atraso - Adicione
$displaypara imprimir o resultado
O <strong>$display</strong> deve ser semelhante a isto:
$display("%d %d | %d", x, y, z);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: Adicione estímulo e display para 0 0
// TODO: Adicione estímulo e display para 0 1
// TODO: Adicione estímulo e display para 1 0
// TODO: Adicione estímulo e display 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. SoftwareSeu primeiro móduloComentáriosNíveis de abstração de projeto4Operadores Parte 1
Operadores aritméticosOperador móduloOperadores de comparaçãoRecapitulação - Matemática simplesOperadores bit a bit7Atribuições e Portas
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ões
Declaração IfIf - ElseRevisão - Comparador SimplesDeclaração CaseCasex e CasezRevisão - Projeto de ALU2Tipos de Dados
Tipo WireTipo RegInteiro e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores - Parte 2
Operadores lógicosOperadores de reduçãoOperadores de deslocamentoOperador de concatenaçãoOperador condicionalRevisão - Desafio de operadores14Fundamentos de Testbench
O Que É um TestbenchCriando EstímulosExibição e MonitoramentoDumpfile e DumpvarsUsando Tarefas do SistemaRecapitulação — Testbench Completo3Sistema Numérico
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRevisão - Formatos Numéricos6Módulos
Estrutura de MódulosPortas de Entrada e SaídaPortas InoutInstanciação de MódulosMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação — Construindo um MóduloPratique por conta própria: Compilador de Verilog online