Metodlar ve Constructor
Gün 2: Nesne Yönelimli Programlama (OOP) | Sınıf metodları (task/function), new() constructor, copy, compare
Kaynak Kod
// =============================================================================
// GUN 2 - Konu 2: Sinif Metodlari (Tasks ve Functions), new() Constructor
// =============================================================================
class ALU_Transaction;
typedef enum {ADD, SUB, MUL, DIV, AND, OR, XOR} op_e;
logic [15:0] operand_a;
logic [15:0] operand_b;
op_e operation;
logic [31:0] result;
bit done;
// Constructor: Varsayilan ve parametreli
function new(logic [15:0] a = 0, logic [15:0] b = 0, op_e op = ADD);
this.operand_a = a;
this.operand_b = b;
this.operation = op;
this.result = 0;
this.done = 0;
endfunction
// Function: Aninda sonuc doner (zaman tuketmez)
function logic [31:0] calculate();
case (operation)
ADD: result = operand_a + operand_b;
SUB: result = operand_a - operand_b;
MUL: result = operand_a * operand_b;
DIV: result = (operand_b != 0) ? operand_a / operand_b : 'hFFFF_FFFF;
AND: result = operand_a & operand_b;
OR: result = operand_a | operand_b;
XOR: result = operand_a ^ operand_b;
endcase
done = 1;
return result;
endfunction
// Task: Zaman tuketebilir (simulasyon zamani ilerleyebilir)
task execute(input int delay_ns);
#delay_ns;
void'(calculate());
$display(" [%0t] Islem tamamlandi: %s", $time, to_string());
endtask
// Function: String formatinda dondur
function string to_string();
return $sformatf("0x%04h %s 0x%04h = 0x%08h",
operand_a, operation.name(), operand_b, result);
endfunction
// Function: Paketi kopyala
function ALU_Transaction copy();
ALU_Transaction c = new();
c.operand_a = this.operand_a;
c.operand_b = this.operand_b;
c.operation = this.operation;
c.result = this.result;
c.done = this.done;
return c;
endfunction
// Function: Iki islemi karsilastir
function bit compare(ALU_Transaction other);
return (this.operand_a == other.operand_a &&
this.operand_b == other.operand_b &&
this.operation == other.operation);
endfunction
// Function: Yazdir
function void display(string prefix = "");
$display(" %s%s [done=%0b]", prefix, to_string(), done);
endfunction
endclass
module metodlar_ve_constructor;
initial begin
ALU_Transaction txn1, txn2, txn3;
$display("=== Sinif Metodlari ve Constructor ===\n");
// --- Constructor kullanimi ---
$display("--- Constructor ---");
txn1 = new(); // Varsayilan
txn2 = new(16'h000A, 16'h0005, ALU_Transaction::SUB); // Parametreli
txn3 = new(16'h00FF, 16'h0003, ALU_Transaction::MUL);
txn1.display("Varsayilan: ");
txn2.display("Parametreli: ");
// --- Function kullanimi ---
$display("\n--- Function: calculate() ---");
void'(txn2.calculate());
txn2.display("Hesaplandi: ");
void'(txn3.calculate());
txn3.display("Hesaplandi: ");
// --- Task kullanimi (zaman tuketir) ---
$display("\n--- Task: execute() ---");
txn1 = new(16'h0064, 16'h0032, ALU_Transaction::ADD);
txn1.execute(10);
txn1 = new(16'h00FF, 16'h0001, ALU_Transaction::AND);
txn1.execute(5);
// --- copy() ---
$display("\n--- Kopyalama ---");
begin
ALU_Transaction original, copied;
original = new(16'h1234, 16'h5678, ALU_Transaction::XOR);
void'(original.calculate());
copied = original.copy();
$display(" Orijinal:");
original.display(" ");
$display(" Kopya:");
copied.display(" ");
copied.operand_a = 16'hAAAA;
$display(" Kopya degistirildi - Orijinal etkilenmez:");
original.display(" Orijinal: ");
copied.display(" Kopya: ");
end
// --- compare() ---
$display("\n--- Karsilastirma ---");
begin
ALU_Transaction a, b;
a = new(16'h10, 16'h20, ALU_Transaction::ADD);
b = new(16'h10, 16'h20, ALU_Transaction::ADD);
$display(" a == b ? %s", a.compare(b) ? "EVET" : "HAYIR");
b.operation = ALU_Transaction::SUB;
$display(" a == b ? %s (op degisti)", a.compare(b) ? "EVET" : "HAYIR");
end
$display("\n=== Sinif Metodlari Sonu ===");
$finish;
end
endmodule