About Interface

I have tried this code and trying to interface with design but I’m getting error.

interface absum;
  logic  [3:0]a;
  logic [3:0]b;
  logic clk;
  logic [4:0]s;
   modport DRV (input a,b, input s,clk);
  
endinterface   

class transaction;
 randc bit [3:0] a;
 randc bit [3:0] b;
  bit [4:0]s;
  function void display();
    $display("a : %0d \t b: %0d sum: %0d", a,b,s);
  endfunction
  
  function transaction copy();
    copy = new();
    copy.a = this.a;
    copy.b = this.b;
  endfunction
  
endclass
 
 
 
class generator;
  virtual absum ab;  

  transaction trans;
  mailbox #(transaction) mbx;
  int i = 0;
  
  function new(mailbox #(transaction) mbx);
    this.mbx = mbx;
    trans = new();
  endfunction 
  
  task run();
    for(i = 0; i<20; i++) begin
      trans = new();
      assert(trans.randomize()) else $display("Randomization Failed");
      $display("[GEN] : DATA SENT TO DRIVER");
      trans.display();
      mbx.put(trans.copy);
    end 
  endtask
   
  
endclass
 
class driver;
  
  transaction tc;
  
virtual absum ab;  
  mailbox #(transaction) mbx;
  
  function new(mailbox #(transaction) mbx);
    this.mbx = mbx;
    tc = new();
  endfunction
  task run1();
      forever begin
    mbx.get(tc);
     @(posedge ab.clk);
     ab.a <= tc.a;
     ab.b <= tc.b;
    
    tc.display();
        $display("DRV received the values ");
      end    
  endtask
endclass

 
module tb;
  absum ab();
generator gen;
driver drv;
mailbox #(transaction) mbx;
  
 sum dut(.a(ab.a),.b(ab.b),.clk(ab.clk),.s(ab.s)); 
  
  initial begin
    ab.clk = 0;
    mbx = new();
    gen = new(mbx);
    drv = new(mbx);
    gen.ab = ab;
    fork
    gen.run();
    drv.run1();
    join
    end
 always #10 ab.clk = ~ab.clk;
  
endmodule

module sum(
  input [3:0]a,b,
  input clk,
  output reg [4:0]s);
  
  
    assign s = a + b;
      
endmodule

You set the virtual interface of the generator (gen), instead of the driver(drv). You also need to $finish the simulation.