Ana içeriğe geç

SystemVerilog: Covergroups ve Coverage

· loading · loading · ·
Eğitim Doğrulama SystemVerilog SystemVerilog Covergroup Coverage Verification
Eğitim Doğrulama SystemVerilog
Axolot Logic
Yazar
Axolot Logic
Sayısal Tasarım Mühendisi
Table of Contents
SystemVerilog Tasarım Serisi - This article is part of a series.
Part 30: This Article

🧩 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.


SystemVerilog Tasarım Serisi - This article is part of a series.
Part 30: This Article

Related

SystemVerilog'da Nesne Yönelimli Programlama
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog OOP Nesne Yönelimli Programlama Verification Sınıflar
Eğitim Doğrulama SystemVerilog
SystemVerilog'da Mailbox Kullanımı
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog IPC Mailboxes Doğrulama Senkronizasyon
Eğitim Doğrulama SystemVerilog
SystemVerilog'da Named Events Kullanımı
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog IPC Named Events Doğrulama Senkronizasyon
Eğitim Doğrulama SystemVerilog
SystemVerilog'da Polymorphism ve Sanallık (Virtuality)
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog OOP Nesne Yönelimli Programlama Doğrulama Virtuality
Eğitim Doğrulama SystemVerilog
SystemVerilog'da Semaphores Kullanımı
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog IPC Semaphores Doğrulama Senkronizasyon
Eğitim Doğrulama SystemVerilog
SystemVerilog'da İleri Nesne Yönelimli Programlama: Yapıcılar, Handle'lar ve Statik Üyeler
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog OOP Nesne Yönelimli Programlama Doğrulama Sınıflar
Eğitim Doğrulama SystemVerilog