Criando Estímulos
Parte da seção Fundamentos do Journey de Verilog da Coddy. Lição 74 de 90.
Stimulus 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ê aperta diferentes botões (estímulo) e observa o que acontece (saídas). Criar bons estímulos é uma parte essencial da escrita de um testbench.
Por exemplo, observe 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 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: Laço 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;
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 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 dá tempo para o DUT responder |
Use reg para sinais de estímulo | Porque eles mudam com o tempo |
Adicione $finish ao final | Para parar a simulação |
Desafio
Se você recebe um módulo de porta OR. Sua tarefa é adicionar os estímulos ausentes 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 $display deve ser assim:
$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 os estímulos e exiba o resultado para 0 0
// TODO: Adicione os estímulos e exiba o resultado para 0 1
// TODO: Adicione os estímulos e exiba o resultado para 1 0
// TODO: Adicione os estímulos e exiba o resultado 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