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
endmoduleHer 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öntem | En Uygun Kullanım | Örnek |
|---|---|---|
| Ardışık atamalar | Basit testler | a = 0; b = 0; #10; |
| For döngüsü | Tüm kombinasyonları test etme | for (i = 0; i < 4; i++) |
| Repeat döngüsü | Tekrarlayan desenler | repeat (10) #5 clk = ~clk; |
| Forever döngüsü | Sürekli sinyaller | forever #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;
endYö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;
endBu ş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;
endYö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
| Kural | Açı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 ekleyin | Simülasyonu durdurmak için |
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:
- Her satırda,
xveydeğerlerini ayarlayın - Gecikme için
#10ekleyin - Sonucu yazdırmak için
$displayekleyin
<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;
endFor 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;
endRepeat döngüsü – stimulus'u N kez tekrarlayın:
repeat (10) begin
#10 a = ~a;
endForever döngüsü – saat sinyalleri gibi sürekli sinyaller:
initial begin
clk = 0;
forever #5 clk = ~clk;
endTemel Kurallar
- Stimulus sinyalleri için
regkullanın (zamanla değişirler) - DUT'un yanıt vermesine izin vermek için atamalar arasına gecikmeler (örneğin
#10) ekleyin - Simülasyonu
$finishile 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
endmoduleBu 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
4Operatörler Bölüm 1
Aritmetik OperatörlerModül OperatörüKarşılaştırma OperatörleriÖzet - Basit MatematikBitsel Operatörler7Atama ve Kapılar
Sürekli AtamaOperatörlerle AtamaYerleşik Kapı PrimitifleriAND OR NOT KapılarıXOR XNOR KapılarıÖzet - Mantık Kapısı Devresi10Karar Yapıları
If İfadesiIf - ElseÖzet - Basit KarşılaştırıcıCase İfadesiCasex ve CasezÖzet - ALU Tasarımı5Operatörler Bölüm 2
Mantıksal Operatörlerİndirgeme OperatörleriKaydırma OperatörleriBirleştirme OperatörüKoşullu OperatörÖzet - Operatör Meydan Okuması11Döngüler
For DöngüsüWhile DöngüsüRepeat DöngüsüSonsuz DöngüDevre Dışı Bırakma İfadesiÖzet - Döngü Kalıpları14Testbench Temelleri
Testbench Nedir?Stimulus OluşturmaDisplay ve MonitorDumpfile ve DumpvarsSistem Görevlerini KullanmaÖzet - Tam Testbench3Sayı Sistemleri
İkilik GösterimBoyutlandırılmış SayılarBoyutlandırılmamış SayılarNegatif SayılarÖzel Değerler X ve ZÖzet - Sayı Formatları6Modüller
Modül YapısıGiriş ve Çıkış PortlarıInout PortlarıModül Örneklendirmeİsme Göre Port EşlemeSıraya Göre Port EşlemeÖzet - Bir Modül Oluşturun9Prosedürel Bloklar
Always BloğuInitial BloğuDuyarlılık ListesiEngelleyici AtamaEngelleyici Olmayan AtamaÖzet - Always vs Initial15Trafik Işığı Kontrolcüsü
Durumları TanımlamaDurum Makinesi Mantığı