How To Drive Two Packets parallely Inside Driver

In reply to karan_18:


class mc_driver_c  extends uvm_driver#(mem_seq_item_c);
  
  //--------------------------------------------------------------------------------------------//
  // Internal variables dclaration //
  //--------------------------------------------------------------------------------------------//
  bit [2:0] wl;                // Write latecy
  bit [4:0] rl;                // read latecy
  bit       par;               // Parity Field
  bit       bl;                // burst length
  bit       ps_no;             // Pseudo no
  event     row_e,col_e;
  
  //--------------------------------------------------------------------------------------------//
  // Row And Column Command Queue //
  //--------------------------------------------------------------------------------------------//
  mem_seq_item_c     row_pkt_q[$]; // Queue To Store Row Packets
  mem_seq_item_c     col_pkt_q[$]; // Queue To Store Column Packets
  //--------------------------------------------------------------------------------------------//
  // Virtual interface //
  //--------------------------------------------------------------------------------------------//
  virtual mem_intf.driver mc_driver_vif; 

  //--------------------------------------------------------------------------------------------//
  // Agent Configuration class handle //
  //--------------------------------------------------------------------------------------------//
  mc_agent_config_c driver_cfg_h;

  //--------------------------------------------------------------------------------------------//
  // Analysis port declaration //
  //--------------------------------------------------------------------------------------------//
  uvm_analysis_port #(mem_seq_item_c) drv_port_mc_ps_0;
  uvm_analysis_port #(mem_seq_item_c) drv_port_mc_ps_1;
  
  //--------------------------------------------------------------------------------------------//
  // component registration //
  //--------------------------------------------------------------------------------------------//
  `uvm_component_utils(mc_driver_c)

  //--------------------------------------------------------------------------------------------//
  // Constructor //
  //--------------------------------------------------------------------------------------------//
  function new (string name,uvm_component parent);
    super.new(name,parent);
    drv_port_mc_ps_0 = new("drv_port_mc_ps_0",this);
    drv_port_mc_ps_1 = new("drv_port_mc_ps_1",this);
  endfunction :new

  //--------------------------------------------------------------------------------------------//
  // Build phase //
  //--------------------------------------------------------------------------------------------//
  function void build_phase(uvm_phase phase);
    void'(uvm_config_db#(mc_agent_config_c)::get(this,"","mc_driver_config"
    ,driver_cfg_h));
    if(!uvm_config_db#(virtual mem_intf )::get(this,"","mem_intf"
    ,mc_driver_vif))begin
      `uvm_fatal("NOVIF",{"virtual interface must be set for: ",get_type_name()
      ,".mc_driver_vif"});
    end
  endfunction :build_phase

  //--------------------------------------------------------------------------------------------//
  // run phase //
  //--------------------------------------------------------------------------------------------//
  virtual task run_phase(uvm_phase phase);    
    mem_initilization();
    fork
      get_item();
      row_pkt_collector();
      col_pkt_collector();
    join
  endtask : run_phase
  

  //--------------------------------------------------------------------------------------------//
  // Initilization //
  //--------------------------------------------------------------------------------------------//
  virtual task mem_initilization();
    bit [5:0] ra;
    bit [7:0] ca;

    `uvm_info(get_type_name(),
    $sformatf("--[  :  mem Initilization Start :  ]--"),
    UVM_MEDIUM)
  ......
  ......
  ......
    `uvm_info(get_type_name(),
    $sformatf("--[  :  mem Initilization Done:  ]--"),
    UVM_MEDIUM)
  endtask : mem_initilization
  
  //--------------------------------------------------------------------------------------------//
  // Driver Packet receive from sequencer //
  //--------------------------------------------------------------------------------------------//
  virtual task get_item();
    forever begin
      seq_item_port.try_next_item(req);
      if(req == null)begin
        if((row_pkt_q.size() == 0) && (col_pkt_q.size() == 0))begin
          rnop_cnop_comb_driver();
         end else if(row_pkt_q.size() > 0)begin
          cnop();
        end else begin
          rnop(); 
        end
      end else begin
        //Storing Packet According to Command
        if(req.cmd_e inside {RD,WR})begin
          mem_seq_item_c col_pkt;
          $cast(col_pkt,req.clone());
          col_pkt_q.push_back(col_pkt);
          -> row_e;
        end else begin
          mem_seq_item_c row_pkt;
          $cast(row_pkt,req.clone());
          row_pkt_q.push_back(row_pkt);
          -> col_e;
        end

          //Sending to score board
          `uvm_info(get_type_name(),
          $sformatf("--[  : %s PKT Arrived In Driver :  ]--",req.cmd_e.name()),
          UVM_LOW)
          if(req.pseudo_no == 0)begin
            req.dir="TX";
            drv_port_mc_ps_0.write(req);
            `uvm_info(get_type_name(),
            $sformatf("--[  : Driver Sent %s PKT To SB In PS%d :  ]--",
            req.cmd_e.name,req.pseudo_no),
            UVM_LOW)
          end else begin
            req.dir="TX";
            drv_port_mc_ps_1.write(req);
            `uvm_info(get_type_name(),
            $sformatf("--[  : Driver Sent %s PKT To SB In PS%d :  ]--",
            req.cmd_e.name,req.pseudo_no),
            UVM_LOW)
          end
        @(negedge mc_driver_vif.ck_t)
        seq_item_port.item_done();
      end
    end
  endtask : get_item
  
//--------------------------------------------------------------------------------------------//
  // Row Packet COllector //
  //--------------------------------------------------------------------------------------------//
  virtual task row_pkt_collector();
    while(1)begin
      wait(row_e.triggered);
      if(row_pkt_q.size > 0)begin
        mem_seq_item_c pkt_r;
        pkt_r = row_pkt_q.pop_front();
        row_cmd_create(pkt_r);
      end
      #1ns;
    end
  endtask : row_pkt_collector

  //--------------------------------------------------------------------------------------------//
  // Column Packet COllector //
  //--------------------------------------------------------------------------------------------//
  virtual task col_pkt_collector();
    while(1)begin
      wait(col_e.triggered);
      if(col_pkt_q.size > 0)begin
        mem_seq_item_c pkt_c;
        pkt_c = col_pkt_q.pop_front();
        col_cmd_create(pkt_c);
      end
      #1ns;
    end
  endtask : col_pkt_collector

//Other Respective task
...
...
...

endclass

hear is code. but is not working like my requirement.