Ana içeriğe geç

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
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 16: This Article

🔌 SystemVerilog interface – Modüler Bağlantı Yapılarının Açıklaması
#

SystemVerilog’daki interface yapısı, birbiriyle ilişkili sinyalleri tek bir isim altında gruplayarak yönetmenizi sağlar. Özellikle veriyolu protokolleri, çok sayıda sinyal bağlantısı veya testbench ile DUT arasındaki iletişim gibi durumlarda modülerlik, okunabilirlik ve sürdürülebilirlik açısından büyük avantaj sağlar.


🔍 Neden interface Kullanılır?
#

Verilog’da geleneksel olarak modüller çok sayıda giriş/çıkış sinyaliyle bağlanır:

module dut(input logic clk, reset, input logic [7:0] data_in, output logic [7:0] data_out);

Interface kullanıldığında bu sinyaller bir yapı içinde kapsüllenebilir:

interface bus_if;
  logic clk;
  logic reset;
  logic [7:0] data_in;
  logic [7:0] data_out;
endinterface

Bu yapı modül portlarını sadeleştirir ve tasarımınızı daha okunabilir ve yeniden kullanılabilir hale getirir.


🧱 Temel Söz Dizimi
#

interface my_if;
  logic valid;
  logic ready;
  logic [31:0] data;
endinterface

Artık bu interface’i bir port gibi kullanabilirsiniz:

module consumer(my_if intf);
  always_ff @(posedge intf.valid) begin
    if (intf.ready)
      $display("Veri alındı: %0d", intf.data);
  end
endmodule

🔀 Interface Örneği Oluşturma
#

my_if bus();  // interface örneği

dut u_dut (.intf(bus));
  • bus örneği tüm interface sinyallerini taşır
  • Nokta notasyonu ile sinyallere erişilir: bus.data, bus.clk gibi

🔁 Interface’te Yön Belirtimi (modport)
#

modport kullanılarak sinyal yönleri tanımlanabilir:

interface bus_if;
  logic clk, rst;
  logic [7:0] data;
  logic valid, ready;

  modport master (input clk, rst, output data, valid, input ready);
  modport slave  (input clk, rst, input data, valid, output ready);
endinterface

Modüllerde kullanımı:

module master(bus_if.master bus);
  // bus.data sadece output, bus.ready sadece input olarak erişilebilir
endmodule

module slave(bus_if.slave bus);
  // Yönler enforce edilir (zorunlu hale getirilir)
endmodule

modport, yönleri kesinleştirerek hataları önler; özellikle karmaşık protokollerde büyük avantaj sağlar.


📦 Testbench’te Interface Kullanımı
#

Interface yapısı testbenchlerde yaygın olarak kullanılır:

  • DUT ile testbench arasındaki bağlantıyı sağlar
  • Sürücü (driver), gözlemci (monitor), scoreboard gibi bileşenler arası sinyal paylaşımını kolaylaştırır
  • Fonksiyonel soyutlamayı destekler
interface uart_if;
  logic tx, rx;
  clocking cb @(posedge clk);
    input rx;
    output tx;
  endclocking
endinterface

🔧 Gelişmiş Özellikler
#

  • modport ile erişim kontrolü
  • İçinde task, function, clocking block tanımlanabilir
  • Parametreli olabilir (örneğin veri yolu genişliği belirlenebilir)
  • UVM (Universal Verification Methodology) için uygundur

⏱️ Interface İçinde Clocking Block Kullanımı
#

Testbench yazarken zamanlama kontrolü çok kritiktir — özellikle senkron protokollerde. SystemVerilog, belirli bir clock kenarına göre sinyal yönünü ve zamanlamasını tek bir blokta tanımlamaya olanak sağlayan clocking block yapısını sunar.

Bir interface içinde tanımlandığında, clocking aşağıdaki avantajları sağlar:

  • DUT ile senkronizasyon kolaylığı
  • Sinyal sürme (drive) ve okuma (sample) zamanlarının ayrılması
  • Driver ve monitor bileşenlerinde yeniden kullanılabilirlik

📘 Temel Sözdizimi Örneği
#

interface uart_if(input logic clk);
  logic tx, rx;

  clocking cb @(posedge clk);
    input  rx;
    output tx;
  endclocking
endinterface

Bu tanım şu anlama gelir:

  • cb adında bir clocking block tanımlandı
  • rx sinyali giriş (input) olarak pozitif kenarda örneklenir
  • tx sinyali çıkış (output) olarak aynı clock kenarında sürülür

Testbench içinde bu clocking bloğa şu şekilde erişebilirsin:

initial begin
  uart_if cb_inst(clk);

  cb_inst.cb.tx <= 1'b1;
  @(cb_inst.cb);  // bir sonraki pozitif clock kenarını bekle
end

🔎 Neden clocking block kullanılır? Sinyal güncellemeleri ile clock arasındaki zamanlamayı belirgin ve tutarlı hale getirir. Bu da glitch-free ve deterministik testbench davranışı sağlar.


📘 Özet Tablosuna Ek
#

ÖzellikAçıklama
clocking blockClock bazlı sinyalleri gruplayarak yön ve zaman tanımlar
Erişim şekliintf.cb.sinyal şeklinde kullanılır
Testbench kullanımıDriver ve monitor bileşenlerinde yaygındır

🧠 Özet Tablosu
#

ÖzellikAçıklama
interfaceİlişkili sinyalleri tek bir yapı olarak gruplar
modportFarklı modüller için yön tanımlarını belirler
Nokta notasyonuintf.sinyal_ismi şeklinde sinyallere erişim
RTL + TB desteğiHem tasarım hem testbench ortamlarında kullanılabilir
UVM uyumluDriver, monitor ve DUT portlarını bağlamak için idealdir

✅ Interface Kullanmanın Faydaları
#

  • Modül portlarındaki karmaşayı azaltır
  • Sinyalleri mantıklı gruplar halinde düzenler
  • modport ile yön hatalarını önler
  • Tasarım ve testbench arasında yeniden kullanılabilir yapılar sunar
  • Protokol tabanlı sistemlerde daha iyi ölçeklenebilirlik sağlar

SystemVerilog interface yapısı, yapılandırılmış ve ölçeklenebilir donanım tasarımı ile doğrulama için vazgeçilmezdir. Sinyal iletişimini kolaylaştırır, yön kontrollerini güvenli hale getirir ve modern metodolojilerle (özellikle UVM) kusursuz şekilde entegre olur.


// Interface tanımı
interface bus_if(input logic clk);
  logic reset;
  logic [7:0] data_in, data_out;
  logic valid, ready;

  // Clocking block for testbench
  clocking cb @(posedge clk);
    input ready;
    output data_in, valid;
  endclocking

  // Modport tanımı
  modport dut_side (input clk, reset, data_in, valid,
                    output data_out, ready);
endinterface

// DUT modülü, interface ile bağlanır
module dut(bus_if.dut_side bus);
  always_ff @(posedge bus.clk or posedge bus.reset) begin
    if (bus.reset)
      bus.data_out <= 8'h00;
    else if (bus.valid && bus.ready)
      bus.data_out <= bus.data_in;
  end
endmodule

// Testbench
module tb_interface_demo;

  logic clk = 0;
  logic rst = 0;

  // Interface instance
  bus_if bus(clk);

  // Clock üretimi
  always #5 clk = ~clk;

  // Reset uygulama
  initial begin
    rst = 1;
    bus.reset = rst;
    #12;
    rst = 0;
    bus.reset = rst;
  end

  // DUT instance
  dut u_dut(bus);

  // Stimulus gönderimi (interface + clocking block ile)
  initial begin
    bus.cb.data_in <= 8'hA5;
    bus.cb.valid   <= 1'b1;
    @(bus.cb);  // Wait for one clock
    bus.cb.valid   <= 1'b0;
    $display("Sent data: %h", bus.cb.data_in);
  end

  // Alıcı taraf simülasyonu
  initial begin
    bus.ready = 1'b1;
    wait (!bus.reset);
    @(posedge clk);
    @(posedge clk);
    $display("Received data: %h", bus.data_out);
    #10 $finish;
  end

endmodule

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

Related

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 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 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
SystemVerilog Enum Veri Tipi
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Enum Durum Makinesi RTL Tasarımı Testbench Hata Ayıklama
Donanım Tasarımı Doğrulama
SystemVerilog Giriş
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Verilog RTL Tasarımı UVM Donanım Doğrulama IEEE 1800
Donanım Tasarımı Doğrulama
SystemVerilog Logic Veri Türü
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Logic RTL Tasarımı Verilog Sentezleme Net vs Değişken
Donanım Tasarımı Doğrulama