🧪 Verilog’ta initial
Bloğu Nedir?
#
initial
bloğu yalnızca simülasyonda kullanılan bir yapıdır ve yalnızca t = 0 anında bir kez çalışır. Genellikle testbench içinde stimulus üretimi, değişken başlatma ve hata ayıklama için kullanılır.
🎯 Temel Özellikler #
Özellik | Açıklama |
---|---|
Çalışma Şekli | t=0 anında bir kez çalışır |
Sentezlenebilirlik | ❌ FPGA/ASIC için sentezlenemez (bazı istisnalar hariç) |
Paralellik | Birden fazla initial blok paralel çalışır |
Kullanım Alanları | Stimulus üretimi, dump/log, değişken/memory başlatma |
🛠️ Örnek 1: Testbench Stimulus #
initial begin
clk = 0;
rst = 1;
#50 rst = 0;
#1000 $finish;
end
always #10 clk = ~clk; // 20ns clock
📥 Örnek 2: ROM Başlatma #
reg [7:0] rom [0:255];
initial begin
$readmemh("rom.hex", rom);
end
✅ Sentez notu: $readmemh
ile ROM başlatma çoğu FPGA aracında desteklenir.
🧾 Örnek 3: Debug ve Dump İşlemleri #
initial begin
$display("Zaman = %0t", $time);
$monitor("a = %b, b = %b", a, b);
$dumpfile("wave.vcd");
$dumpvars(0, testbench);
end
❗ Örnek 4: Birden Fazla Initial #
initial a = 0;
initial b = a; // Paralel çalıştığı için b değeri tanımsız olabilir
⚠️ Sık Yapılan Hatalar #
- ❌
#10
gibi gecikmeler sentezde desteklenmez - ❌
$display
,$stop
,$finish
gibi komutlar donanımda çalışmaz - ❌
initial
blokların sırası garanti edilmez - ✅ Gerçek tasarımlarda
reset
kullanın
🧠 İyi Uygulamalar #
initial
bloklarını sadece testbench içinde kullanın- Gerçek donanım için
reset
sinyalleri tercih edin - Karmaşık stimulusları
initial begin : isim
şeklinde gruplandırın
🆚 initial
vs always
Karşılaştırması
#
Özellik | initial |
always |
---|---|---|
Çalışma Şekli | t=0’da bir kez çalışır | Olay tabanlı sürekli döngü |
Sentezlenebilir | ❌ Hayır (ROM preload hariç) | ✅ Evet |
Kullanım Alanı | Sadece testbench | RTL ve testbench |
Zaman Kontrolü | #10 , #100 gibi gecikmeler |
@(posedge clk) olayları |