🔗 Concurrent Assertions Nedir?#
Concurrent assertions, temporal (zaman) bağımlı davranışları kontrol etmek için kullanılır. Bu assertion’lar bir clock veya event bazlı olarak başlatılır ve zamana yayılmış ifadelerin kontrolünü yapar. property
blokları ile tanımlanabilir veya property inline olarak da yazılabilir.
Örnek (property ile):
property p1;
@(posedge clk) req |=> ack;
endproperty
assert property(p1);
Örnek (inline property):
assert property (@(posedge clk) req |=> ack);
👉 Not: Property bloğu ayrı yazmak zorunda değilsiniz; kısa ifadeler için inline yazmak kodu sadeleştirebilir. Ancak uzun veya tekrar kullanılacak property’ler için ayrı blok yazmak okunabilirliği artırır.
🏗️ Property Blokları#
Concurrent assertions yazarken davranışlar property
blokları ile tanımlanabilir. Property, temel olarak bir temporal ifade veya ardışık koşullar zinciridir.
Örnek:
property p_ready;
@(posedge clk) (req ##1 ack);
endproperty
Bu örnekte, req
sinyali geldikten 1 cycle sonra ack
sinyalinin gelmesi beklenir.
🔖 Naming and Asserting the Property#
Property blokları isimlendirilerek tekrar kullanılabilir. Assertion çağrıları ise bu property’e referans verir.
Örnek:
property p_req_ack;
@(posedge clk) req |=> ack;
endproperty
tag_ismi :assert property(p_req_ack);
Bu sayede:
- Aynı property’yi birden fazla assertion ile kullanabiliriz.
assume
,cover
,restrict
gibi direktiflerle farklı kontrol türleri yazabiliriz.
⏲️ Clocking the Property#
Concurrent assertionlar clock sensitive çalışır ve tasarımda senkronizasyonu sağlamak için clock tanımı gerektirir. Property tanımında clock:
@(posedge clk)
veya@(negedge clk)
şeklinde yazılabilir.
Örnek:
property p_enable_check;
@(posedge clk) disable iff (reset)
(enable |-> ##1 data_valid);
endproperty
⚙️ Default Clock Statement#
Birden fazla property kullanıyorsak, her biri için clock belirtmek yerine default clocking
kullanabiliriz. Bu, testbench veya tasarım seviyesinde global clock tanımı sağlar.
Örnek:
default clocking cb @(posedge clk);
endclocking
property p_example;
req |=> ack;
endproperty
assert property(p_example);
Bu durumda p_example
property’si otomatik olarak clk
sinyali ile clocklanır ve kod daha sade olur.