class transaction;
  rand bit [7:0] data;
  rand bit [7:0] addr;
endclass : transaction

class generator;
   task transmit_bad(input int unsigned n,
                     input mailbox #(transaction) mb);
     transaction tr;
     tr = new();
     repeat (n) begin
       if (!tr.randomize()) begin
         $error("randomization failed");
       end
       else begin
         $display("GEN: transmit_bad: after randomization tr.addr=%0h, tr.data=%0h", tr.addr, tr.data);
       end
       mb.put(tr);
     end
   endtask : transmit_bad
endclass : generator

class driver;
    task receive_bad(input mailbox #(transaction) mb);
      transaction tr;
      forever begin
        #5ns;
        mb.get(tr);
        // drive tranaction to DUT
        $display("DRV: receive_bad: Received tr.addr=%0h, tr.data=%0h", tr.addr, tr.data);
      end
    endtask : receive_bad
endclass : driver

module top();
  generator gen;
  driver drv;
  mailbox #(transaction) mb;

  initial begin
    mb = new();
    gen = new();
    drv = new();

    // Run producer and Consumer in parallel
    fork
      begin
       gen.transmit_bad (5, mb);
      end
      begin
       drv.receive_bad(mb);
      end
    join
  end
endmodule : top