🧩 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
vereg
yerine kullanılır — daha açık, birleşik ve güvenlidir.
🔌 Port Türleri#
Anahtar Kelime | Yönü | Açıklama |
---|---|---|
input | Modüle giriş | İçeride sadece okunabilir |
output | Modü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ör | Anlamı | Örnek |
---|---|---|
& | AND | y = a & b; |
| | OR | y = a | b; |
^ | XOR | y = a ^ b; |
~ | NOT | y = ~a; |
inside | inside | if (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 |
---|---|---|---|
assign | Kombinasyonel mantık | Sürekli (continuous) | Basit bağlantılar |
always_comb | Kombinasyonel mantık | Prosedürel (= ) | Daha temiz, güvenli |
always_ff | Sıralı mantık | Prosedürel (<= ) | Flip-flop ve register |
for (genvar i=...) | Mantık çoğaltma | Yapı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.