🧪 Verilog Simülasyonu Temelleri#
Verilog simülasyonu, tasarımınızın zaman içinde çalıştırılması, davranışının gözlemlenmesi ve doğrulanması sürecidir.
💡 Temel Kavramlar:#
- Simülasyon zamanı adım adım ilerler (örn.
#10
) - Testbench girişleri uygular ve çıkışları gözlemler
- Sentez yapılmaz — tamamen sanal bir çalışmadır
🧰 Testbench Nedir?#
Testbench, Verilog modülü olup DUT’u (test edilen tasarım) örnekler, giriş sinyalleri üretir, ve opsiyonel olarak çıkışları izler.
✅ Örnek:#
module tb;
reg clk, rst;
wire out;
my_design dut (.clk(clk), .rst(rst), .out(out));
initial begin
rst = 1; #5; rst = 0;
#100 $finish;
end
endmodule
Testbench’ler sentezlenemez ve genellikle
$display
,$monitor
,$dumpvars
kullanır.
⏱️ timescale
Direktifi#
timescale
direktifi, simülasyon zaman birimi ve zaman hassasiyetini tanımlar.
✅ Söz Dizimi:#
`timescale 1ns / 1ps
Değer | Anlamı |
---|---|
1ns | 1 zaman birimi = 1 nanosecond |
/1ps | Zaman çözünürlüğü = 1 pikosaniye |
timescale
direktifini her.v
dosyasının başına eklemeyi unutmayın, özellikle testbench’lerde.
🧭 Verilog Simülasyon Zamanlama Bölgeleri#
Verilog simülasyonunda her zaman adımı, farklı zamanlama bölgelerine (simulation region) ayrılır. Bu bölgeler, kodun hangi sırayla çalıştığını belirler.
- Preponed Region (Ön Bölge)
posedge
veyanegedge
gibi olay duyarlılıkları burada yakalanır@(posedge clk)
gibi tetiklemeler bu bölgede değerlendirilir- Testbench’teki zamanlamaya bağlı trigger mekanizmaları burada işler
- Active Region (Aktif Bölge)
- Blocking (
=
) atamalar burada gerçekleşir - Continuous (
assign
) atamalar vegate/primitive
değerlendirmeleri yapılır $display
,$write
,$finish
gibi işlemler burada gerçekleştirilir- Bu bölge en öncelikli işlem bölgesidir (preponed’dan sonra)
- Blocking (
- Inactive Region (Pasif Bölge)
- Aynı zaman adımında planlanan
#0
gecikmeli atamalar bu bölgede yürütülür - Diğer aktif işlemlerden daha sonra gerçekleşir
- Aynı zaman adımında planlanan
- Nonblocking Assign Update Region
<=
kullanılarak yapılan nonblocking atamaların sağ tarafı (RHS), aktif bölgede değerlendirilir- Ama sol taraf (LHS) güncellemeleri, bu bölgede planlanır
- Yani
<=
atamaları gecikmeli olarak burada gerçekleşir - Bu bölge, blocking assignment’tan sonra çalışır
- Postponed Region (Ertelenmiş Bölge)
$monitor
,$strobe
gibi komutlar burada yürütülür- Waveform kayıtları (VCD) bu bölgede yapılır
- Tüm nonblocking atamalar uygulandıktan sonra çalışır
- Her şey güncellendikten sonra gözlem yapmak içindir
⏰ Testbench’te Clock Üretimi#
Bir clock sinyali, initial
+ forever
ya da always
ile üretilebilir.
✅ Örnek 1: always
ile#
reg clk = 0;
always #5 clk = ~clk; // 10ns clock periyodu
✅ Örnek 2: initial
ile#
initial begin
clk = 0;
forever #5 clk = ~clk;
end
forever
yapısı yalnızca testbench içindir — sentezlenebilir kodlarda kullanmayın.
- Başlangıç değeri:
clk = 0
(veya1
) şeklinde saat sinyalini başlatmak her zaman iyi bir pratiktir. Aksi halde simülasyonun başlangıcında tanımsız (x
) bir değer oluşabilir. - Periyot tanımı:
#5
ifadesi yarım periyodu belirtir. Yani#5
gecikmesiyle üretilen saat sinyali toplamda 10ns periyoda sahip olur. - Çalışma oranı (Duty cycle): %50 duty cycle elde etmek için yüksek ve düşük sürelerin eşit olması gerekir (
#5
–#5
). Örneğin, %30–%70 gibi farklı oranlar için#3
ve#7
gibi asimetrik değerler kullanılabilir. - Çoklu saat sinyalleri: Eğer tasarımda birden fazla saat alanı (clock domain) varsa, her biri için farklı periyoda sahip ayrı saat üretim blokları tanımlanmalıdır.
🔄 Tipik Simülasyon Akışı#
initial
blokları zaman 0’da başlarassign
/always
mantığı sinyal değişimlerine tepki verir- Zaman
#
gecikmeleri veya olaylarla ilerler $monitor
,$dumpvars
gibi komutlar çıkışları kaydeder
İşte bu kapsamlı bölümün Türkçe çevirisi:
🧪 Verilog’da Davranışsal ve Kapı Seviyesi Simülasyon#
🔹 Davranışsal (Behavioral) Simülasyon#
- RTL (Register Transfer Level) seviyesinde çalışır
always
,assign
,initial
gibi yapılarla amaçlanan fonksiyonelliği tanımlar- Hızlıdır ve erken işlevsel testler için idealdir
- Gerçek kapı yapısı veya gecikmeler içermez
🔹 Kapı Seviyesi (Gate-Level) Simülasyon#
- Sentezlenmiş netlist üzerinden simülasyon yapar — lojik kapılar, flip-floplar, mux’lar vb.
- Gerçek donanım davranışını yansıtır; zaman gecikmeleri ve fan-out etkileri dahil
- Yavaştır, ancak son doğrulama için gereklidir
- ASIC akışlarında SDF (Standard Delay Format) dosyaları kullanılır