Creating Stimulus
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 design para testar se ele funciona corretamente. Ao alterar as entradas e observar as saídas, você pode verificar se o seu design se comporta conforme o esperado.
Pense nisso como testar uma máquina: você pressiona botões diferentes (stimulus) e observa o que acontece (outputs). Criar um bom stimulus é uma parte essencial da escrita de um testbench.
Por exemplo, observe o stimulus 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 | Melhor 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 stimulus 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 as atribuições de stimulus | #10 permite tempo para o DUT responder |
Use reg para os sinais de stimulus | 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 stimulus ausente e as instruções $display para imprimir os resultados.
O que fazer:
Adicione stimulus 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 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 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 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