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, tasarımınızın doğru çalışıp çalışmadığını test etmek için uyguladığınız giriş değerlerini ifade eder. Girişleri değiştirerek ve çıkış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 (çıktılar) izlersiniz. İ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
    // UYARAN 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;

    // UYARAN BURADA BİTİYOR
    
    $finish;
  end
endmodule

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

Stimulus Oluşturma Yöntemleri

YöntemEn Uygun KullanımÖrnek
Ardışık atamalarBasit testlera = 0; b = 0; #10;
For döngüsüTüm kombinasyonları test etmefor (i = 0; i < 4; i++)
Repeat döngüsüTekrarlayan desenlerrepeat (10) #5 clk = ~clk;
Forever döngüsüSürekli sinyallerforever #5 clk = ~clk;

Yöntem 1: Ardışık Atamalar

Uyaran oluşturmanın en basit yolu. Değerleri gecikmelerle tek tek 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 Döngüsü

Aynı uyarıcıyı 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ü

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

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

Önemli Kurallar

KuralAçıklama
Uyarıcı atamaları arasında gecikmeler kullanın#10, DUT'un yanıt vermesi için zaman tanır
Uyarıcı sinyalleri için reg kullanınÇünkü zamanla değişirler
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 uyarıcı (stimulus) ve $display ifadelerini eklemektir.

Ne yapmalı:

Dört giriş kombinasyonunun (00, 01, 10, 11) tümünü test etmek için uyarıcı 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

<strong>$display</strong> şu şekilde görünmelidir:

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

Kopya kağıdı

Stimulus (Uyarıcı), doğru davranışı doğrulamak için bir testbench'te DUT'a (Test Edilen Tasarım) uygulanan giriş değerleridir.

Stimulus Oluşturma Yöntemleri

Ardışık atamalar – en basit yaklaşım:

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

For döngüsü – tüm giriş kombinasyonlarını test edin:

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

Repeat döngüsü – stimulus'u N kez tekrarlayın:

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

Forever döngüsü – saat sinyalleri gibi sürekli sinyaller:

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

Temel Kurallar

  • Stimulus sinyalleri için reg kullanın (zamanla değişirler)
  • DUT'un yanıt vermesine izin vermek için atamalar arasına gecikmeler (örneğin #10) ekleyin
  • Simülasyonu $finish ile sonlandırın

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 uyarıcı ekle ve görüntüle
    
    // TODO: 0 1 için uyarıcı ekle ve görüntüle
    
    // TODO: 1 0 için uyarıcı ekle ve görüntüle
    
    // TODO: 1 1 için uyarıcı ekle ve görüntüle
    
    $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