🧩 SystemVerilog: Covergroups ve Coverage#
Bu bölümde, SystemVerilog’daki covergroup yapısı ve coverage modellemesi ele alınıyor. Bu konular, doğrulamanın yeterince kapsamlı yapıldığından emin olmak için kritik öneme sahiptir. Structural vs. functional coverage, coverpoint’ler, bins, cross coverage ve covergroup’ların sınıflar içinde nasıl kullanıldığı detaylandırılıyor. Ayrıca, toplanan coverage’ın nasıl yazdırılacağı ve yorumlanacağı da anlatılıyor.
1️⃣ Structural vs. Functional Coverage#
✅ Structural Coverage
- HDL yapılarının (örneğin: statement, branch) test edilip edilmediğini ölçer.
- Genelde simülatör tarafından otomatik olarak raporlanır.
✅ Functional Coverage
- Tasarımın işlevsel olarak ne kadar kapsamlı test edildiğini ölçer.
- covergroup ve coverpoint kullanılarak yazılır.
2️⃣ Data-Oriented ve Control-Oriented Functional Coverage#
Functional coverage şunlara odaklanabilir:
- Data-Oriented: Farklı veri değerlerini kapsar (örneğin: tüm geçerli opcode’lar).
- Control-Oriented: Tasarım durumları, koşulları ve geçişlerini kapsar (örneğin: protokol durumları).
3️⃣ Covergroup Nedir?#
Covergroup, işlevsel coverage tanımlamak için kullanılan bir SystemVerilog yapısıdır. İçinde ölçülecek değişkenleri tanımlayan bir veya daha fazla coverpoint bulunur.
Örnek:
covergroup cg @(posedge clk);
coverpoint opcode;
endgroup
4️⃣ Coverpoint ve Bins#
Coverpoint, kapsanacak bir değişken veya ifadeyi belirtir. Varsayılan olarak, SystemVerilog her olası değer için otomatik olarak bins oluşturur (değişken tipine göre).
- Implicit Bins: Olası tüm değerler için otomatik oluşturulur.
- Explicit Bins: Belirli değer veya aralıklar için kullanıcı tarafından tanımlanır.
Örnek:
covergroup cg @(posedge clk);
coverpoint opcode {
bins ALU = {4'h0, 4'h1};
bins BRANCH = {4'h2, 4'h3};
}
endgroup
5️⃣ Cross Coverage#
Cross, iki veya daha fazla coverpoint’in kombinasyonlarını ölçmek için kullanılır.
Örnek:
covergroup cg @(posedge clk);
coverpoint opcode;
coverpoint state;
cross opcode, state;
endgroup
- Implicit Cross Bins: Tüm olası kombinasyonlar için otomatik olarak oluşturulur.
- Illegal ve Ignore Bins: Geçersiz veya ilgilenilmeyen kombinasyonları işaretlemek için kullanılır.
Örnek:
cross opcode, state {
illegal_bins invalid = binsof(opcode) intersect {4'hF};
}
6️⃣ Sınıflar İçinde Covergroup Kullanımı#
Covergroup’lar sınıfların içinde tanımlanabilir ve runtime’da oluşturulabilir. Bu, nesne tabanlı testbench mimarileri için çok önemlidir.
Örnek:
class Transaction;
rand bit [3:0] opcode;
covergroup cg @(posedge clk);
coverpoint opcode;
endgroup
function new();
cg = new();
endfunction
endclass
Bu örnekte covergroup her bir Transaction nesnesine bağlıdır ve nesne bazında coverage toplar.
7️⃣ Coverage Nasıl Yazdırılır ve Yorumlanır?#
✅ Simülasyon tamamlandıktan sonra toplanan coverage’ı yazdırmak ve analiz etmek için simülatör komutlarını veya SystemVerilog fonksiyonlarını kullanabilirsiniz.
Simülatör Konsolunda Coverage Yazdırmak:
initial begin
$display("Coverage = %0.2f%%", $get_coverage());
end
Bu kod, genel coverage yüzdesini simülatör konsoluna yazdırır.
✅ Detaylı Coverage Raporu:
- Çoğu simülatör, covergroup’lar, coverpoint’ler, bins ve cross coverage detaylarını gösteren HTML raporları sağlar.
- Bu raporlar test edilmemiş senaryoları bulmanıza ve testbench kalitesini artırmanıza yardımcı olur.
✅ Coverage’ı Yorumlamak:
- %100 coverage, tanımlanan tüm bins ve cross bins’lerin vurulduğu anlamına gelir.
- %100’ün altındaki coverage, bazı senaryoların test edilmediğini gösterir—testbench veya tasarım gözden geçirilip coverage artırılabilir.
📖 Sonuç#
Covergroup ve coverage modelleme, tasarımınızın gerçekten yeterince test edildiğinden emin olmak için çok önemlidir. Coverpoint, bins, cross coverage, yazdırma ve analiz süreçlerini öğrenmek; corner case’leri yakalamak ve tasarımın standarda uygunluğunu sağlamak için gereklidir.