Hi Davy,
I would highly recommend to avoid this. This is because, coverage is
more or less a "static" view of your verification progress and not
truly as dynamic as the transactions themselves are. I usually create
a separate coverage element and hook it up. Agreed there is some
repetition in work - especially for long transaction descriptors, but
one can automate it, write some script or use SV struct etc. to ease
the pain.
VMM also recommends some thing similar, it prefers to associate
coverage with the transactors. Another rule/guideline is "cover as
close to DUT as possible".
This is b'cos, even though a packet got generated at a high level
generator, perhaps due to the fact that particular port was in
blocking mode (a random configuration setting), the packets never went
into the DUT. This may or may not be the desired thing. By having the
transactor tell us "when to sample" we are sure that we are covering
at the correct place. Imagine creating 10K transactions, you don't
need 10K coverage objects as well - you simply need a "count" of what
kind of packets (Type, length, CRC etc.) went in and how many of them.
This is what I refer to as "pseudo-static" item in the verification
environment.
The hook up of coverage class to the transactor is an interesting
topic. In VMM one can use callbacks or vmm_channel::tee(). In AVM one
can use analysis ports to do this. Not sure of in uRM, some thing
similar exists there? If we had AOP, then that would help here as
well.
HTH
Ajeetha, CVC