Menu
CoddyTech

Uyarıcı Oluşturma

Coddy'nin Verilog Journey'sinin Temel Bilgiler 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 tasarımınıza uyguladığınız giriş değerlerini ifade eder. Girişleri değiştirip çıkışları gözlemleyerek tasarımınızın beklendiği gibi davranıp davranmadığını doğrulayabilirsiniz.

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

Örneğin, aşağıdaki test tezgâhındaki uyarıcıya bakın:

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

  initial begin
    // UYARIM 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;

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

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

Uyarıcı Oluşturma Yöntemleri

YöntemEn Uygun Olduğu DurumÖ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üKalıpları tekrarlamarepeat (10) #5 clk = ~clk;
Forever döngüsüSürekli sinyallerforever #5 clk = ~clk;

Yöntem 1: Sıralı Atamalar

Stimulus oluşturmanın en basit yolu. Değerleri gecikmelerle 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 girdi 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 şu değerleri test eder: 00, 01, 10, 11.

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

Aynı uyaranı 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: Sonsuz Döngü

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ınZaman içinde değiştikleri için
Sonuna $finish ekleyinSimülasyonu durdurmak için
challenge icon

Görev

Sana bir VEYA kapısı modülü verildi. Görevin, sonuçları yazdırmak için eksik uyartıyı ve $display ifadelerini eklemek.

Yapman gerekenler:

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

  1. Her satırda x ve y değerlerini ayarla
  2. Bir gecikme için #10 ekle
  3. Sonucu yazdırmak için $display ekle

$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 uyarım ekleyin ve sonucu görüntüleyin
    
    // TODO: 0 1 için uyarım ekleyin ve sonucu görüntüleyin
    
    // TODO: 1 0 için uyarım ekleyin ve sonucu görüntüleyin
    
    // TODO: 1 1 için uyarım ekleyin ve sonucu görüntüleyin
    
    $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.

Temel Bilgiler bölümündeki tüm dersler

Kendi başına pratik yap: Online Verilog derleyicisi