EDA Playground'da Dene

typedef, enum ve struct

Gün 1: SystemVerilog'a Giriş ve Veri Tipleri | Kullanıcı tanımlı tipler: typedef, enum, struct, union

Kaynak Kod

// =============================================================================
// GUN 1 - Konu 4: Kullanici Tanimli Tipler: typedef, enum, struct
// =============================================================================

module typedef_enum_struct;

  // -------------------------------------------------------------------------
  // TYPEDEF: Mevcut tiplere yeni isim verme
  // -------------------------------------------------------------------------
  typedef logic [7:0]  byte_t;
  typedef logic [31:0] word_t;
  typedef logic [15:0] addr_t;

  // -------------------------------------------------------------------------
  // ENUM: Numaralandirilmis tipler
  // -------------------------------------------------------------------------
  typedef enum logic [1:0] {
    IDLE   = 2'b00,
    READ   = 2'b01,
    WRITE  = 2'b10,
    ERROR  = 2'b11
  } state_e;

  typedef enum logic [2:0] {
    ADD, SUB, AND, OR, XOR, NOT, SHL, SHR
  } opcode_e;

  // -------------------------------------------------------------------------
  // STRUCT: Yapilar - iliskili verileri gruplar
  // -------------------------------------------------------------------------
  typedef struct {
    addr_t     addr;
    word_t     data;
    opcode_e   op;
    bit        valid;
  } transaction_t;

  // PACKED STRUCT: Bitler ardisik saklanir, sentezlenebilir
  typedef struct packed {
    logic [3:0] tag;
    logic [7:0] payload;
    logic       parity;
  } packet_t;

  // -------------------------------------------------------------------------
  // UNION: Ayni bellegi paylasan tipler
  // -------------------------------------------------------------------------
  typedef union packed {
    logic [15:0] word;
    struct packed {
      logic [7:0] high;
      logic [7:0] low;
    } bytes;
  } reg16_t;

  // Degisken tanimlamalari
  state_e       current_state;
  opcode_e      alu_op;
  transaction_t txn;
  packet_t      pkt;
  reg16_t       register_val;

  initial begin
    $display("=== typedef, enum, struct Ornekleri ===\n");

    // --- ENUM kullanimi ---
    current_state = IDLE;
    $display("[ENUM] Durum  = %s (deger=%0b)", current_state.name(), current_state);
    
    current_state = READ;
    $display("[ENUM] Durum  = %s (deger=%0b)", current_state.name(), current_state);

    // Enum metodlari
    alu_op = ADD;
    $display("\n[ENUM Metodlari]");
    $display("  Ilk    = %s", alu_op.first().name());
    $display("  Son    = %s", alu_op.last().name());
    $display("  Sonraki= %s", alu_op.next().name());
    $display("  Eleman = %0d", alu_op.num());

    // --- STRUCT kullanimi ---
    txn.addr  = 16'hABCD;
    txn.data  = 32'hDEAD_BEEF;
    txn.op    = ADD;
    txn.valid = 1;
    $display("\n[STRUCT] Transaction:");
    $display("  Adres = 0x%04h", txn.addr);
    $display("  Veri  = 0x%08h", txn.data);
    $display("  Islem = %s", txn.op.name());
    $display("  Gecerli = %0b", txn.valid);

    // Struct literal (toplu atama)
    txn = '{addr: 16'h0010, data: 32'hCAFE_BABE, op: SUB, valid: 1};
    $display("\n[STRUCT Literal] Transaction:");
    $display("  Adres = 0x%04h, Veri = 0x%08h", txn.addr, txn.data);

    // --- PACKED STRUCT ---
    pkt = '{tag: 4'hA, payload: 8'hFF, parity: 1'b1};
    $display("\n[PACKED STRUCT] Paket:");
    $display("  Toplam bit = %0d", $bits(pkt));
    $display("  Bit dizisi = %013b", pkt);
    $display("  Tag=%h, Payload=%h, Parity=%b", pkt.tag, pkt.payload, pkt.parity);

    // --- UNION ---
    register_val.word = 16'hA5F0;
    $display("\n[UNION] Register:");
    $display("  Word = 0x%04h", register_val.word);
    $display("  High = 0x%02h, Low = 0x%02h", register_val.bytes.high, register_val.bytes.low);

    $display("\n=== typedef, enum, struct Sonu ===");
    $finish;
  end

endmodule