In reply to chandanc9:
My project experience with another protocol shows taht any implementation like you are doing with queues etc. are ending up in a fiasco.
I’m strongly recommending to follow the example mperyer is pointing to.
https://verificationacademy.com/uvm-ovm/Driver/Pipelined
But you have to investigate how many tasks ‘do_pipelined_transfer’ you are running in the fork-join. It depends on the number of clock cycles the protocol needs and might be more than 2.
Following these recommendations gives you all the flexibility for further options.