🔗 SystemVerilog’da Property Reuse (Yeniden Kullanım)#
SystemVerilog Assertions (SVA)’da property reuse (property’nin yeniden kullanımı), modüler, ölçeklenebilir ve bakımı kolay assertion’lar yazmak için kritik bir tekniktir. Parametreler, argümanlar ve reusable yapılar sayesinde tek bir property tanımı üzerinden birden fazla senaryo için assertion yazılabilir; bu da kod okunabilirliğini ve verimliliğini artırır.
🛠️ Property’lerin Argüman Alması#
Property’ler, tıpkı fonksiyonlar gibi input (argüman) alabilir ve bu sayede farklı clocklar, sinyaller ve koşullar için dinamik olarak uyarlanabilir.
Örnek:
property p_handshake(req, ack);
@(posedge clk) req |=> ack;
endproperty
Burada:
req
veack
property’ye argüman olarak girilir.- Aynı property, farklı sinyal çiftlerine uygulanabilir.
⚡ Property İçinde Parametre Kullanımı#
Property’ler, iç davranışı (örneğin delay süresi veya eşik değerleri) kontrol etmek için parametreler kullanabilir. Örnek olarak delay inputunun kullanımı.
Örnek:
property p_handshake(logic req, logic ack, int delay);
@(posedge clk)
req |=> ##delay @(posedge clk) ack;
endproperty
Burada:
delay
parametresi ilereq
ileack
arasındaki bekleme süresi dinamik olarak belirlenebilir.
🔄 generate
ile Property Kullanımı#
Property’yi birden fazla instance için (örneğin bus, kanal veya core) uygulamak istediğimizde generate blokları çok faydalıdır.
Örnek:
generate
genvar i;
for (i = 0; i < NUM_CHANNELS; i++) begin : gen_handshake_check
assert property (p_handshake(req[i], ack[i]));
end
endgenerate
Bu örnekte:
- Tüm kanallar için aynı assertion uygulanır.
- Kod tekrarı azaltılır ve bakım kolaylaşır.
🔗 Assertion Binding#
Assertion binding, assertion’ları tasarım modüllerine bağlamayı, RTL kaynak kodunu değiştirmeden yapmamıza olanak tanır. Böylece reusable property’leri tasarım dışında kolayca kullanabiliriz.
Örnek:
// Modül Tanımı
module my_module (
input wire clk,
input wire rst_n,
input wire [3:0] data
);
// Bir örnek sinyal
wire [3:0] internal_data;
assign internal_data = data + 1;
endmodule
// Assertion Tanımı
module assertion_module (
input wire clk,
input wire rst_n,
input wire [3:0] data,
input wire [3:0] internal_data
);
// Assertion: internal_data, data'dan bir fazla olmalı
assert property (@(posedge clk) disable iff (!rst_n)
(data + 1) == internal_data)
else $error("Assertion failed: internal_data is not equal to data + 1");
endmodule
// Bind İfadesi
module top;
bit clk;
bit rst_n;
bit [3:0] data;
// Saat sinyali oluşturma
always #5 clk = ~clk;
// Reset sinyali oluşturma
initial begin
rst_n = 0;
#10 rst_n = 1;
end
// Örnek veri sinyali
initial begin
data = 4'b0000;
#20 data = 4'b0001;
#20 data = 4'b0010;
#20 $finish;
end
// Modül örneği
my_module my_module_inst (
.clk(clk),
.rst_n(rst_n),
.data(data)
);
// Assertion'ı modüle bağlama
bind my_module_inst assertion_module assertion_inst (
.clk(clk),
.rst_n(rst_n),
.data(data),
.internal_data(my_module_inst.internal_data)
);
endmodule
Bu:
p_handshake
property’sinidut
modülününreq
veack
sinyallerine bağlar.- Tasarımın iç koduna dokunmadan assertion eklenmesine veya çıkarılmasına imkan tanır.