The put/get communication we have seen earlier typically require a corresponding export to supply the implementation. The idea behind having an analysis port is that a component like monitor should be able to generate a stream of transactions regardless of whether there is a target actually connected to it.
The advantage lies in the fact that an analysis port may be connected to zero, one or many analysis exports and allows a component to call
write() method without depending on the number of connected exports. Also it's worth to note that
write() is a void function and hence will always complete within the same simulation delta cycle.