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