Driver Modülü
Gün 6: Bitirme Projesi - Bölüm 1 | Transaction'ları DUT pin seviyesine süren modül
Kaynak Kod
// =============================================================================
// GUN 6 - Konu 4: Driver - Uyariciyi DUT'ye Suren Modul
// =============================================================================
class ALU_Driver;
virtual alu_if.driver vif;
mailbox #(ALU_Transaction) gen2drv;
mailbox #(ALU_Transaction) drv2scb;
int driven_count = 0;
function new(virtual alu_if.driver vif,
mailbox #(ALU_Transaction) in_mbx,
mailbox #(ALU_Transaction) out_mbx);
this.vif = vif;
this.gen2drv = in_mbx;
this.drv2scb = out_mbx;
endfunction
task run();
ALU_Transaction txn;
$display("[Driver] Baslatildi");
forever begin
gen2drv.get(txn);
drive_transaction(txn);
drv2scb.put(txn.copy()); // Scoreboard'a kopya gonder
driven_count++;
end
endtask
task drive_transaction(ALU_Transaction txn);
@(vif.drv_cb);
vif.drv_cb.in_valid <= 1;
vif.drv_cb.operand_a <= txn.operand_a;
vif.drv_cb.operand_b <= txn.operand_b;
vif.drv_cb.opcode <= txn.opcode;
@(vif.drv_cb);
vif.drv_cb.in_valid <= 0;
endtask
task reset();
$display("[Driver] Reset baslatiliyor...");
vif.rst_n = 0;
vif.drv_cb.in_valid <= 0;
vif.drv_cb.operand_a <= 0;
vif.drv_cb.operand_b <= 0;
vif.drv_cb.opcode <= 0;
repeat(5) @(vif.drv_cb);
vif.rst_n = 1;
@(vif.drv_cb);
$display("[Driver] Reset tamamlandi");
endtask
endclass