⏱️ Gecikme Kontrolleri (Delay Controls)#
Gecikme kontrolleri, zamana bağlı veya olaya bağlı davranışları simüle etmek için kullanılır. Bu yapılar genellikle sadece testbench’lerde veya sentezlenemez kodlar içinde kullanılır.
🔹 #delay
— Zaman Gecikmesi (sadece simülasyon için)#
#10 a = 1; // 10 zaman birimi bekle, sonra ata
⛔ RTL tasarımlarda
#
gecikmesi kullanmayın — sentez sırasında hata verir.
🔹 @event
— Olay Tabanlı Kontrol#
@(posedge clk) q = d; // clk yükselen kenarına kadar bekle
@(a or b) out = a & b; // 'a' veya 'b' değişene kadar bekle
🔹 wait
— Bloklayıcı Bekleme Komutu#
wait
komutu, belirtilen koşul doğru olana kadar yürütmeyi duraklatır.
wait (ready == 1); // 'ready' sinyali 1 olana kadar bekle
a = data_in; // Daha sonra ata
🔹 Birleşik Kullanım Örneği#
always @(posedge clk) begin
wait (ready); // 'ready' sinyali 1 olana kadar bekle
a = temp; // Ardından 'temp' değerini 'a'ya ata
end
repeat
ile intra-assignment ve normal delay farkı#
Yazım Şekli | Anlamı |
---|---|
a = repeat(3) @(posedge clk) b; | b değeri hemen alınır, sonra 3 pozitif kenar beklenir, a ‘ya atanır. |
repeat(3) @(posedge clk); a = b; | 3 pozitif kenar beklenir, sonra o andaki b değeri a ‘ya atanır. |
🎯 Fark: İlki
b
‘yi başta alır, ikincisi gecikmeden sonra alır.
module tb_delay_control;
reg clk = 0;
reg ready = 0;
reg [7:0] data_in = 8'hA5, temp = 8'h3C, a, b;
// Clock generation
always #5 clk = ~clk;
// Time delay example
initial begin
#10 b = 8'hF0;
end
// Event and wait example
always @(posedge clk) begin
wait (ready == 1);
a = temp;
end
// Trigger ready after 3 cycles
initial begin
#30 ready = 1;
#50;
$stop;
end
// repeat vs delay assignment
initial begin
b = 0;
repeat(3) @(posedge clk); // delay for 3 cycles
b = data_in;
end
endmodule