🔄 Verilog’ta Kontrol Akışı Yapıları#
Kontrol akışı yapıları, always
, initial
veya generate
blokları içinde koşullu ve döngüsel davranışları tanımlar. RTL yazımı veya testbench geliştirme için temel bileşenlerdir.
✅ Koşullu Dallanma: if
/ else
#
Basit iki durumlu kararlar için kullanılır.
always @(posedge clk) begin
if (reset)
count <= 0;
else if (enable)
count <= count + 1;
else
count <= count;
end
📌 RTL’de güvenli yapı: Her clock kenarında belirli bir çıkış üretir.
🔄 Çoklu Seçim: case
#
Çok sayıda olası durum için if
zincirinden daha okunabilir bir yapıdır.
always @(*) begin
case (opcode)
4'b0001: alu_out = a + b;
4'b0010: alu_out = a - b;
4'b0011: alu_out = a & b;
4'b0100: alu_out = a | b;
default: alu_out = 0;
endcase
end
✅ Kombinasyonel bloklarda latch oluşumunu engellemek için
default
kullanın.
🔸 Özel Varyantlar: casez
ve casex
#
Tür | Joker Karakter | Kullanım Senaryosu |
---|---|---|
casez | z | Belirsiz bitlerle (örneğin adres) eşleşme |
casex | x , z | Don’t-care durumlarıyla eşleşme (sentezde riskli) |
casez (instr[7:0])
8'b1??_?????: result = R_type;
8'b0000_0001: result = NOP;
default: result = ILLEGAL;
endcase
⚠️
casex
, sentezde belirsizlik yaratabilir — mümkünsecasez
ya da normalcase
tercih edin.
🔁 Döngü Yapıları#
Verilog’ta döngüler genelde testbench, generate block ya da başlangıç (initial
) kodları için kullanılır.
🔁 for
Döngüsü#
Başlatma ve bellek erişimi gibi işlemlerde kullanılır.
integer i;
initial begin
for (i = 0; i < 8; i = i + 1)
mem[i] = 8'hFF;
end
✅ Sentezlenebilir, sınırları sabit olmak kaydıyla.
🔁 while
Döngüsü#
Koşul sağlandıkça çalışır. Testbenchlerde yaygındır.
initial begin
while (!done)
@(posedge clk);
$display("İşlem tamamlandı!");
end
⚠️ RTL’de kullanırken dikkatli olun, döngü uzunluğu sabit değilse sentezlenemez.
🔁 repeat
Döngüsü#
Belirli sayıda tekrarlanan işlemler için uygundur.
initial begin
repeat (10) @(posedge clk);
$finish;
end
✅ Simülasyonda clock gecikmesi oluşturmak için idealdir.
♾ forever
Döngüsü#
Sonsuz döngü. Genelde testbenchlerde veya clock üretiminde kullanılır.
initial begin
forever #5 clk = ~clk;
end
⚠️ RTL’de kesinlikle kullanılmamalıdır!
🧠 Özet Tablosu#
Yapı | RTL Uygunluğu | Testbench Kullanımı | Sentez Notları |
---|---|---|---|
if/else | ✅ | ✅ | Tamamen sentezlenebilir |
case | ✅ | ✅ | default olmadan latch oluşabilir |
for | ✅* | ✅ | *Sınırlar sabit olmalı |
while | ⚠️ | ✅ | Sentez için sınır sabit olmalı |
repeat | ❌ | ✅ | Sadece simülasyon |
forever | ❌ | ✅ | Asla RTL’de kullanılmamalı |
💡 İpucu: SystemVerilog kullanıyorsan
always_comb
,always_ff
,always_latch
gibi daha anlamlı blok türlerini kullanmayı tercih et.