Menu
Coddy logo textTech

Stimulus Oluşturma

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

Stimulus (uyarıcı), tasarımınızın doğru çalışıp çalışmadığını test etmek için ona uyguladığınız girdi değerlerini ifade eder. Girdileri değiştirip çıktıları gözlemleyerek, tasarımınızın beklendiği gibi davrandığını doğrulayabilirsiniz.

Bunu bir makineyi test etmek gibi düşünün: farklı düğmelere basarsınız (stimulus) ve ne olduğunu izlersiniz (outputs). İyi bir stimulus oluşturmak, bir testbench yazmanın temel bir parçasıdır.

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

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

  initial begin
    // STİMÜLUS BURADA BAŞLIYOR
    
    // 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;

    // STİMÜLUS BURADA BİTİYOR
    
    $finish;
  end
endmodule

Her bir stimulus uygulanır, ardından bir sonraki stimulus'tan önce 10 zaman birimi (#10) beklenir. Bu işlem, DUT'a bir output üretmesi için zaman tanır.

Uyarıcı (Stimulus) Oluşturma Yöntemleri

YöntemEn İyi Kullanım 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 yinelemerepeat (10) #5 clk = ~clk;
Forever döngüsüSürekli sinyallerforever #5 clk = ~clk;

Yöntem 1: Sıralı Atamalar (Sequential Assignments)

Uyarım (stimulus) oluşturmanın en basit yolu. Gecikmelerle değerleri teker teker atarsınız.

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ü

Tüm olası girdi kombinasyonlarını test etmek istediğinizde 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 Loop

Aynı stimulus'u birçok kez yinelemek 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ü

Saatler 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'ın yanıt vermesi için zaman tanır
stimulus sinyalleri için reg kullanınZaman içinde değiştiklerinden dolayı
En sona $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 tümünü (00, 01, 10, 11) test etmek için stimulus ekleyin:

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

$display ifadesi ş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