Menu
Coddy logo textTech

Creating Stimulus

Coddy'nin Verilog Journey'sinin Temeller bölümünün bir parçası. Ders 74 / 90.

Stimulus, doğru çalışıp çalışmadığını test etmek için tasarımınıza uyguladığınız input değerlerini ifade eder. inputs değerlerini değiştirip çıkışları gözlemleyerek tasarımınızın beklendiği gibi davrandığını doğrulayabilirsiniz.

Bunu bir makineyi test etmek gibi düşün: farklı düğmelere (stimulus) basar ve ne olduğunu (çıktılar) izlersin. İyi bir stimulus oluşturmak, bir testbench yazmanın önemli bir parçasıdır.

Örneğin, aşağıdaki testbench içindeki stimulus'a bakın:

module testbench;
  reg a, b;
  wire c;
  
  and_gate dut (
    .a(a),
    .b(b),
    .c(c)
  );

  initial begin
    // STIMULUS BURADA BAŞLAR
    
    // Test durumu 1: Her iki giriş de 0
    a = 0; b = 0; #10;
    
    // Test durumu 2: a=0, b=1
    a = 0; b = 1; #10;
    
    // Test durumu 3: a=1, b=0
    a = 1; b = 0; #10;
    
    // Test durumu 4: Her iki giriş de 1
    a = 1; b = 1; #10;

    // STIMULUS BURADA BİTER
    
    $finish;
  end
endmodule

Her uyarıcı uygulanır, ardından bir sonraki uyarıcıdan önce 10 zaman birimi (#10) bekleriz. Bu, DUT'ye bir çıktı üretmesi için zaman tanır.

stimulus Oluşturma Yöntemleri

YöntemEn Uygun Olduğu AlanÖrnek
Sıralı atamalarBasit testlera = 0; b = 0; #10;
For döngüsüTüm kombinasyonları test etmefor (i = 0; i < 4; i++)
Repeat döngüsüDesenleri tekrarlamarepeat (10) #5 clk = ~clk;
Forever döngüsüSürekli sinyallerforever #5 clk = ~clk;

Yöntem 1: Sıralı Atamalar

Uyarıcı oluşturmanın en basit yolu. Gecikmelerle değerleri teker teker atarsın.

initial begin
  a = 0; b = 0; #10;
  a = 0; b = 1; #10;
  a = 1; b = 0; #10;
  a = 1; b = 1; #10;
  $finish;
end

Yöntem 2: For Döngüsü

Olası tüm giriş kombinasyonlarını test etmek istediğinde kullanışlıdır.

integer i;

initial begin
  for (i = 0; i < 4; i = i + 1) begin
    {a, b} = i;
    #10;
  end
  $finish;
end

Bu, şunları test eder: 00, 01, 10, 11.

Yöntem 3: Repeat Döngüsü

Aynı stimulus'u birçok kez tekrarlamak için kullanışlıdır.

initial begin
  a = 0; b = 1;
  repeat (10) begin
    #10 a = ~a;
  end
  $finish;
end

Yöntem 4: Forever Döngüsü

Saat sinyalleri gibi sürekli sinyaller için kullanışlıdır.

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

Önemli Kurallar

KuralAçıklama
stimulus atamaları arasında gecikmeler kullanın#10 DUT'un yanıt vermesi için zaman tanır
stimulus sinyalleri için reg kullanınZaman içinde değiştikleri için
Sonuna $finish ekleyinSimülasyonu durdurmak için
challenge icon

Görev

Size bir OR kapısı modülü verilmiştir. Göreviniz, sonuçları yazdırmak için eksik stimulus ve $display ifadelerini eklemektir.

Yapılacaklar:

Dört giriş kombinasyonunun (00, 01, 10, 11) tümünü test etmek için stimulus ekleyin:

  1. Her satırda x ve y değerlerini ayarlayın
  2. Gecikme için #10 ekleyin
  3. $display kullanarak sonucu yazdırın

$display şu şekilde görünmelidir:

$display("%d %d | %d", x, y, z);

Kendin dene

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: 0 0 için stimulus ve display ekle
    
    // TODO: 0 1 için stimulus ve display ekle
    
    // TODO: 1 0 için stimulus ve display ekle
    
    // TODO: 1 1 için stimulus ve display ekle
    
    $finish;
  end
endmodule
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Temeller bölümündeki tüm dersler

Kendi başına pratik yap: Online Verilog derleyicisi