EDA Playground'da Dene

Lab 1: Veri Paketleri

Gün 1: SystemVerilog'a Giriş ve Veri Tipleri | Ağ paketi oluşturma ve dizi metodlarını test etme

Aşağıdaki kod, egzersizin tamamlanmış halidir. Önce EDAPlayground'da kendinizi deneyin. Sonrasında buradakiyle karşılaştırabilirsiniz. Başarılar!

Kaynak Kod

// =============================================================================
// GUN 1 - Lab 1: Veri Paketleri Olusturma ve Dizi Metodlarini Test Etme
// =============================================================================
// Bu laboratuvar calismasinda:
// - Cesitli veri tipleri kullanarak bir ag paketi modeli olusturulacak
// - Paketler dizilere ve kuyruklara eklenecek
// - Dizi metodlari ile filtreleme, siralama yapilacak
// =============================================================================

module lab1_veri_paketleri;

  // Paket tipi enum
  typedef enum logic [1:0] {
    PKT_DATA   = 2'b00,
    PKT_ACK    = 2'b01,
    PKT_NACK   = 2'b10,
    PKT_CTRL   = 2'b11
  } pkt_type_e;

  // Paket yapisi
  typedef struct {
    int          id;
    pkt_type_e   pkt_type;
    logic [15:0] src_addr;
    logic [15:0] dst_addr;
    byte         payload [$];
    int          length;
    bit          valid;
  } network_packet_t;

  // Paket kuyruklari
  network_packet_t pkt_queue [$];
  network_packet_t filtered  [$];

  // Paket olusturma fonksiyonu
  function network_packet_t create_packet(
    int id, pkt_type_e ptype, 
    logic [15:0] src, logic [15:0] dst,
    int payload_len, bit valid_flag
  );
    network_packet_t pkt;
    pkt.id       = id;
    pkt.pkt_type = ptype;
    pkt.src_addr = src;
    pkt.dst_addr = dst;
    pkt.length   = payload_len;
    pkt.valid    = valid_flag;
    
    // Payload olustur
    for (int i = 0; i < payload_len; i++)
      pkt.payload.push_back(byte'(i + 'hA0));
    
    return pkt;
  endfunction

  // Paket yazdirma fonksiyonu
  function void print_packet(network_packet_t pkt);
    $display("  Paket #%0d | Tip: %-4s | Src: 0x%04h | Dst: 0x%04h | Len: %0d | Gecerli: %0b",
             pkt.id, pkt.pkt_type.name(), pkt.src_addr, pkt.dst_addr, pkt.length, pkt.valid);
  endfunction

  initial begin
    $display("============================================================");
    $display("  LAB 1: Ag Paketi Olusturma ve Dizi Metodlari Testi");
    $display("============================================================\n");

    // --- Paketleri olustur ve kuyruga ekle ---
    $display("--- 1. Paket Olusturma ---");
    pkt_queue.push_back(create_packet(1, PKT_DATA, 16'h0001, 16'h0002, 64, 1));
    pkt_queue.push_back(create_packet(2, PKT_ACK,  16'h0002, 16'h0001, 0,  1));
    pkt_queue.push_back(create_packet(3, PKT_DATA, 16'h0003, 16'h0002, 128,1));
    pkt_queue.push_back(create_packet(4, PKT_NACK, 16'h0002, 16'h0003, 0,  1));
    pkt_queue.push_back(create_packet(5, PKT_DATA, 16'h0001, 16'h0004, 32, 0)); // Gecersiz
    pkt_queue.push_back(create_packet(6, PKT_CTRL, 16'h0001, 16'hFFFF, 8,  1));
    pkt_queue.push_back(create_packet(7, PKT_DATA, 16'h0005, 16'h0002, 256,1));
    pkt_queue.push_back(create_packet(8, PKT_DATA, 16'h0003, 16'h0001, 16, 0)); // Gecersiz

    $display("  Toplam %0d paket olusturuldu.\n", pkt_queue.size());
    foreach (pkt_queue[i]) print_packet(pkt_queue[i]);

    // --- Filtreleme: Sadece DATA paketleri ---
    $display("\n--- 2. Filtreleme: Sadece DATA Paketleri ---");
    filtered = pkt_queue.find with (item.pkt_type == PKT_DATA);
    $display("  DATA paketi sayisi: %0d", filtered.size());
    foreach (filtered[i]) print_packet(filtered[i]);

    // --- Filtreleme: Gecerli paketler ---
    $display("\n--- 3. Filtreleme: Gecerli Paketler ---");
    filtered = pkt_queue.find with (item.valid == 1);
    $display("  Gecerli paket sayisi: %0d", filtered.size());
    foreach (filtered[i]) print_packet(filtered[i]);

    // --- Filtreleme: Buyuk paketler (len > 50) ---
    $display("\n--- 4. Filtreleme: Payload > 50 Byte ---");
    filtered = pkt_queue.find with (item.length > 50);
    $display("  Buyuk paket sayisi: %0d", filtered.size());
    foreach (filtered[i]) print_packet(filtered[i]);

    // --- Filtreleme: Belirli hedef adres ---
    $display("\n--- 5. Filtreleme: Hedef = 0x0002 ---");
    filtered = pkt_queue.find with (item.dst_addr == 16'h0002);
    $display("  Eslesen paket sayisi: %0d", filtered.size());
    foreach (filtered[i]) print_packet(filtered[i]);

    // --- Istatistikler ---
    $display("\n--- 6. Istatistikler ---");
    begin
      int lengths [$];
      foreach (pkt_queue[i]) lengths.push_back(pkt_queue[i].length);
      $display("  Toplam payload  = %0d byte", lengths.sum());
      $display("  Min payload     = %0d byte", lengths.min());
      $display("  Max payload     = %0d byte", lengths.max());
      
      lengths.sort();
      $display("  Sirali payload  = %p", lengths);
    end

    // --- FIFO Isleme ---
    $display("\n--- 7. FIFO Isleme ---");
    $display("  Kuyruk boyutu = %0d", pkt_queue.size());
    while (pkt_queue.size() > 0) begin
      network_packet_t p = pkt_queue.pop_front();
      $display("  Islendi: Paket #%0d (%s)", p.id, p.pkt_type.name());
    end
    $display("  Kuyruk boyutu = %0d (Tumu islendi)", pkt_queue.size());

    $display("\n============================================================");
    $display("  LAB 1 TAMAMLANDI");
    $display("============================================================");
    $finish;
  end

endmodule