🕒 Clocking Block Nedir?#
SystemVerilog’taki clocking block yapısı, testbench ile DUT (Design Under Test) arasındaki senkronizasyonu ve zamanlamayı sadeleştirmek için tasarlanmış özel bir yapıdır. İlgili sinyalleri bir grup altında toplar ve bu sinyallere belli bir clock kenarında erişim kurallarını tanımlar.
clocking cb @(posedge clk);
input data_out;
output data_in;
endclocking
🎯 Neden Clocking Block Kullanılır?#
Clocking Block Olmadan | Clocking Block ile |
---|---|
Manuel @clk takibi gerekiyor | Otomatik clock kenarına hizalanmış erişim |
Yarış koşulları oluşabilir | ❌ Yarış koşulları büyük ölçüde önlenir |
#delay kullanımı gerekebilir | ✅ Temiz ve okunabilir zamanlama modeli |
Kodun modülerleştirilmesi zor | ✅ Zamanlama davranışı kapsüllenebilir |
🔧 Clocking block, zamanlama mantığını fonksiyonellikten ayırır — bu da UVM testbench’lerinde yeniden kullanılabilirliği artırır.
🧱 Temel Söz Dizimi ve Anlamı#
interface bus_if(input logic clk);
logic [7:0] data;
logic valid;
clocking cb @(posedge clk);
input data;
output valid;
endclocking
endinterface
clocking cb
: Clocking block ismiyle tanımlanır@(posedge clk)
: Bu block’un clock sinyalidirinput
/output
: Testbench’in bakış açısından yön tanımlarıdır
🔁 Clocking Block Sinyallerine Erişim#
Clocking block içindeki sinyallere nokta (.
) notasyonu ile erişilir:
bus_if bus();
bus.cb.data <= 8'hA5; // doğru zamanda sürülür
value = bus.cb.valid; // clock kenarıyla hizalı örneklenir
- Output atamalar aktif clock kenarında gerçekleşir
- Input okuma işlemleri, clock kenarıyla hizalanarak yarış koşullarını önler
🧪 Testbench’te Kullanım Örneği#
initial begin
bus.cb.data <= 8'hF0; // posedge clk öncesi veriyi sür
@(bus.cb); // clocking block olayını bekle
$display("Gelen veri: %0h", bus.cb.valid);
end
✅
@(cb)
ifadesi,@(posedge clk)
ifadesine denktir ancak clocking block kurallarına uygun olarak çalışır.
🧰 Gelişmiş Özellikler#
Varsayılan Clocking Block: Interface veya modül içinde bir block varsayılan olarak tanımlanabilir:
default clocking cb;
Yön Desteği:
input
,output
,inout
yönleri desteklenir.Gecikme Tanımlama (Skew): Clocking block içindeki sinyallere gecikme atanabilir:
clocking cb @(posedge clk); input #1ns data_out; // clk'ten 1ns sonra örnekle output #2ns data_in; // clk'ten 2ns sonra sür endclocking
🚨 Yaygın Hatalar#
Hatalı Kullanım | Açıklama |
---|---|
Hem cb.signal hem signal kullanımı | Zamanlama tutarsızlığına neden olur |
@cb yazmayı unutmak | İşlemler senkron olmayabilir |
input sinyali sürülmeye çalışılır | Clocking block içindeki input’lar sadece okunur |
@posedge tanımlanmamış | Clocking block tanımsız kalır veya yok sayılır |
✅ Özet#
Özellik | Sağladığı Avantaj |
---|---|
clocking block | Zamanlama davranışının net tanımı |
Senkronizasyon | Uyarıların clock kenarıyla hizalanması |
Yeniden kullanılabilirlik | UVM bileşenleriyle doğrudan uyumlu |
Skew desteği | Gerçekçi zamanlama modellemesi |
Clocking block, SystemVerilog’un testbench yapılarında yarış koşullarını önleyen, okunabilirliği artıran ve zamanlamayı modülerleştiren güçlü bir aracıdır. Testbench’ten DUT’a senkron veri göndermek ya da gözlemlemek istiyorsan, clocking block senin temel aracın olmalı.