Ana içeriğe geç

SystemVerilog Modülleri – Yapı, Örnekleme ve RTL İçin En İyi Uygulamalar

· loading · loading · ·
Donanım Tasarımı SystemVerilog Modül RTL Tasarımı Always_ff Parametre Modül Çağırma
Donanım Tasarımı
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 7: This Article

🧩 SystemVerilog’ta Modül Nedir?
#

SystemVerilog’ta bir modül, RTL (Register Transfer Level) tasarımının temel yapı taşıdır.
Verilog’daki gibi çalışır ancak daha güçlü, daha tip güvenli ve daha sürdürülebilir bir sözdizimine sahiptir.
Bir modül, mantık, alt modüller, parametreler ve sentezlenebilir donanım tanımını kapsayabilir.


📦 Modül Yapısı
#

Modüller; hiyerarşik tasarım, yeniden kullanılabilirlik ve test edilebilirlik sağlar.

🧱 Örnek Modül
#

module and_gate (
  input  logic a,
  input  logic b,
  output logic y
);
  assign y = a & b;
endmodule

logic, wire ve reg yerine kullanılır — daha açık, birleşik ve güvenlidir.


🔌 Port Türleri
#

Anahtar KelimeYönüAçıklama
inputModüle girişİçeride sadece okunabilir
outputModülden çıkışİçeriden atanır, genellikle logic
inoutÇift yönlüOrtak veri yolu / üç durumlu destek

🧱 Modül Örnekleme (Instantiation)
#

Bir modülü başka bir modül içinde kullanmak için örnekleme yapılır.

🔹 Pozisyonel Bağlama (⚠️ Önerilmez)
#

and_gate u1 (a, b, y);  // Sıra uyuşmak zorunda!

❗ Sıra değişirse fark edilmeden yanlış bağlanabilir.

🔹 İsimle Bağlama ✅ (Tercih Edilen)
#

and_gate u1 (
  .a(in1),
  .b(in2),
  .y(out)
);

✅ Daha güvenli, okunabilir ve büyük modüllerde gereklidir.

ya da sinyal ve port ismi aynı ise onları otomatik eşleştirmek için .* kullan,

and_gate u1 (.*);

🔁 Çoklu Örnekleme
#

Aynı modülü farklı bağlantılarla tekrar tekrar kullanabilirsiniz:

and_gate u1 (.a(a1), .b(b1), .y(y1));
and_gate u2 (.a(a2), .b(b2), .y(y2));

Özellikle bit-paralel işlemler, veri yolu parçalama veya modül dizileri için kullanılır.


⚙️ Parametreler ile Özelleştirme
#

Modüller parametrelerle özelleştirilebilir:

module mux #(parameter WIDTH = 8) (
  input  logic [WIDTH-1:0] in0, in1,
  input  logic sel,
  output logic [WIDTH-1:0] out
);
  assign out = sel ? in1 : in0;
endmodule

Örnekleme:

mux #(16) u_mux (.in0(a), .in1(b), .sel(sel), .out(result));

🔁 Döngü Tabanlı Çoğaltma (generate Gerekmeden)
#

SystemVerilog’ta generate bloğu zorunlu değildir. for döngüsü içinde doğrudan genvar tanımlayabilirsiniz:

module bitwise_and (
  input  logic [3:0] a, b,
  output logic [3:0] y
);
  for (genvar i = 0; i < 4; i++) begin
    assign y[i] = a[i] & b[i];
  end
endmodule

generate...endgenerate olmadan daha sade ve okunaklı.


🧪 Sürekli Atama (assign)
#

assign y = a & b;
  • Kombinasyonel mantık için kullanılır
  • Giriş değiştiğinde otomatik güncellenir

🧬 Prosedürel Bloklar
#

⏱️ Sıralı Mantık: always_ff
#

always_ff @(posedge clk or posedge rst) begin
  if (rst)
    q <= 0;
  else
    q <= d;
end
  • Non-blocking (<=) atama kullanılır
  • Flip-flop/register üretimi için uygundur

⚙️ Kombinasyonel Mantık: always_comb
#

always_comb begin
  case (sel)
    2'b00: y = a;
    2'b01: y = b;
    default: y = 0;
  endcase
end
  • Blocking (=) atama kullanılır
  • Sensitivity list otomatik olarak oluşturulur

🧬 Operatörler & Söz Dizimi Geliştirmeleri
#

Bit Bazlı Operatörler
#

OperatörAnlamıÖrnek
&ANDy = a & b;
|ORy = a | b;
^XORy = a ^ b;
~NOTy = ~a;
insideinsideif (val inside {[1:5], 8, 10})

Birleştirme & Tekrarlama
#

assign bus = {addr, data};             // Birleştirme
assign all_ones = {8{1'b1}};           // Tekrarlama
assign combo = {addr, 4{1'b1}, data};  // Her ikisi

📊 Özet Tablosu
#

YapıKullanım AmacıMantık TürüÖnerilen Durum
assignKombinasyonel mantıkSürekli (continuous)Basit bağlantılar
always_combKombinasyonel mantıkProsedürel (=)Daha temiz, güvenli
always_ffSıralı mantıkProsedürel (<=)Flip-flop ve register
for (genvar i=...)Mantık çoğaltmaYapısal (structural)generate olmadan loop

✅ En İyi Uygulamalar
#

  • ✅ Port bağlantısında isimli eşleştirme tercih edin (.a(a))
  • ✅ Tüm sinyallerde logic kullanın
  • always_ff, always_comb ile yapı netliğini artırın
  • 🚫 Aynı always bloğu içinde = ve <= kullanmayın
  • 🚫 Sentezlenebilir modüllerde initial, $display gibi yapıları kullanmayın

SystemVerilog modülleri, ölçeklenebilir, sentezlenebilir RTL tasarımı için temel oluşturur. Gelişmiş tip sistemi (logic), sade sözdizimi ve genvar, always_ff, parameter gibi yapılar ile modern tasarımların belkemiğidir.


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

Related

SystemVerilog always_ff, always_comb ve always_latch Farkları – Güvenli RTL Kodlama
· loading · loading
Donanım Tasarımı SystemVerilog Always_ff Always_comb RTL Tasarımı Sıralı Mantık Latch Yapısı
Donanım Tasarımı
SystemVerilog Interface – modport ve Clocking Block ile Modüler Bağlantı
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Interface Modport Testbench RTL Tasarımı Bağlantı
Donanım Tasarımı Doğrulama
SystemVerilog Struct, Union ve Typedef Kullanımı – Kullanıcı Tanımlı Veri Tipleri
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Struct Union Typedef Veri Modelleme RTL Tasarımı
Donanım Tasarımı Doğrulama
SystemVerilog Boyutsuz Literaller
· loading · loading
Donanım Tasarımı SystemVerilog Literal RTL Tasarımı Başlatma Sentezleme Reset Mantığı
Donanım Tasarımı
SystemVerilog Clocking Block – Testbench Zamanlama Kontrolü
· loading · loading
Doğrulama Donanım Tasarımı SystemVerilog Clocking Block RTL Tasarımı Testbench UVM Zamanlama
Doğrulama Donanım Tasarımı
SystemVerilog Döngüler ve Kontrol Akışı – for, while, foreach, repeat, break
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Döngüler Kontrol Akışı Testbench RTL Tasarımı Break/Continue
Donanım Tasarımı Doğrulama