Menu
Coddy logo textTech

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
endmodule

Cada 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étodoMelhor ParaExemplo
Atribuições sequenciaisTestes simplesa = 0; b = 0; #10;
Loop forTestar todas as combinaçõesfor (i = 0; i < 4; i++)
Loop repeatPadrões de repetiçãorepeat (10) #5 clk = ~clk;
Loop foreverSinais contínuosforever #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;
end

Mé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;
end

Isso 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;
end

Método 4: Loop Forever

Útil para sinais contínuos como clocks.

initial begin
  clk = 0;
  forever #5 clk = ~clk;
end

Regras Importantes

RegraExplicação
Use atrasos entre atribuições de estímulos#10 permite tempo para o DUT responder
Use reg para sinais de estímuloPorque eles mudam ao longo do tempo
Adicione $finish ao finalPara parar a simulação
challenge icon

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):

  1. Em cada linha, defina os valores para x e y
  2. Adicione #10 para um atraso
  3. Adicione $display para 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;
end

Loop 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;
end

Loop Repeat – repete o estímulo N vezes:

repeat (10) begin
  #10 a = ~a;
end

Loop Forever – sinais contínuos como clocks:

initial begin
  clk = 0;
  forever #5 clk = ~clk;
end

Regras Principais

  • Use reg para 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
endmodule
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos