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