ALU Interface Tanımı
Gün 6: Bitirme Projesi - Bölüm 1 | Bitirme projesi: ALU interface ve clocking block
Interface (arayüz), testbench ile DUT arasındaki tüm sinyalleri tek bir çatı altında toplayan SystemVerilog yapısıdır. ALU doğrulama mimarimizde alu_if, sınıf tabanlı testbench'in (driver, monitor) sinyal seviyesindeki DUT'a bağlanmasını sağlayan köprüdür.
Interface ve Mimarideki Yeri
Sınıf tabanlı bir testbench'te driver ve monitor nesneleri statik modül portlarına doğrudan bağlanamaz. Aradaki bağlantıyı virtual interface kurar: çevre bileşenleri alu_if'in bir referansını (handle) tutar ve sinyallere bu referans üzerinden erişir.
Bu arayüz üç temel araç sunar:
- Clocking block: Sinyallerin saate göre ne zaman örnekleneceğini/sürüleceğini tanımlar, böylece yarış koşullarını (race condition) ortadan kaldırır.
- Modport: Her bileşenin hangi sinyallere hangi yönde (giriş/çıkış) erişebileceğini kısıtlar.
- Ortak saat:
clkdışarıdan (testbench top'tan) gelir ve tüm clocking block'ları tetikler.
Clocking Block Neden Önemli
drv_cb ve mon_cb clocking block'ları @(posedge clk) ile çalışır ve default input #1 output #1 skew (kayma) değerlerine sahiptir:
#1 input skew: Sinyaller saat kenarından 1 birim önce örneklenir; yani driver'ın o çevrimde sürdüğü değerler değil, kararlı eski değerler okunur.#1 output skew: Driver çıkışları saat kenarından 1 birim sonra sürülür; bu, DUT'un girişleri kararlı şekilde görmesini sağlar.
drv_cb hem okuma hem yazma yaparken, mon_cb yalnızca okuma (input) yapar çünkü monitor pasif bir gözlemcidir ve sinyallere asla müdahale etmez.
Modport ile Erişim Kısıtlama
modport driver:drv_cbüzerinden veri sürer,rst_n'i doğrudan çıkış olarak kontrol eder.modport monitor:mon_cbüzerinden yalnızca izler; sinyallere yazamaz.modport dut: DUT'un gördüğü yön bilgisini tanımlar (girişler/çıkışlar).
Kaynak Kod
// =============================================================================
// GUN 6 - Konu 1: ALU Interface ve Clocking Block Tanimlamalari
// =============================================================================
interface alu_if(input logic clk);
// Sinyaller
logic rst_n;
logic in_valid;
logic [7:0] operand_a;
logic [7:0] operand_b;
logic [2:0] opcode;
logic out_valid;
logic [15:0] result;
logic [3:0] flags;
// Testbench clocking block
clocking drv_cb @(posedge clk);
default input #1 output #1;
output in_valid, operand_a, operand_b, opcode;
input out_valid, result, flags;
endclocking
// Monitor clocking block (sadece okuma)
clocking mon_cb @(posedge clk);
default input #1;
input in_valid, operand_a, operand_b, opcode;
input out_valid, result, flags;
endclocking
// Modport'lar
modport driver (clocking drv_cb, output rst_n, input clk);
modport monitor (clocking mon_cb, input clk, rst_n);
modport dut (
input clk, rst_n, in_valid, operand_a, operand_b, opcode,
output out_valid, result, flags
);
endinterface
Kodun Açıklaması
interface alu_if(input logic clk);: Arayüz, saatini dışarıdan parametre olarak alır. Böylece testbench top'taki tek bir saat üreteci hem DUT'u hem de tüm clocking block'ları besler.- Sinyal tanımları: DUT portlarıyla aynı isimde
rst_n,in_valid,operand_a,operand_b,opcode(girişler) veout_valid,result,flags(çıkışlar) tanımlanır. clocking drv_cb: Driver'ın kullandığı clocking block.output in_valid, operand_a, operand_b, opcodeile sürülecek sinyalleri,input out_valid, result, flagsile okunacak sinyalleri belirtir.clocking mon_cb: Monitor'ün kullandığı clocking block. Tüm sinyallerinput'tur; monitor yalnızca gözlemler, hiçbir şey sürmez.modport driver:drv_cbclocking block'unu sunar verst_n'i doğrudanoutputyapar. Driver, reset sırasındarst_n'e clocking block dışından erişebilsin diye bu ayrıcalık verilmiştir.modport monitor:mon_cbile salt-okuma erişimi sağlar.modport dut: DUT modülünün port yönlerini tanımlar; sentez/bağlantı tarafında DUT'un nasıl bağlanacağını netleştirir.
Önemli Noktalar
- Virtual interface sayesinde sınıf tabanlı bileşenler statik sinyallere erişebilir; driver
virtual alu_if.driver, monitorvirtual alu_if.monitortipinde referans tutar. - Clocking block skew (
#1) kullanımı, driver ve DUT arasındaki yarış koşullarını önler; sinyaller her zaman kararlı değerlerinden okunur/yazılır. rst_n'in clocking block dışında, doğrudanoutputolması bilinçli bir tasarımdır: reset darbesi genellikle clocking semantiğinin dışında, doğrudan kontrol edilmek istenir.- Monitor'ün tüm sinyalleri
inputolması pasifliğini garanti eder; bir monitor asla DUT girişlerini değiştirmemelidir. - Sinyal isimlerinin DUT portlarıyla aynı tutulması, top seviyesinde
.port(aif.port)bağlamayı sade ve hatasız kılar.