Module based coverage vs class based coverage

I wanted to know differences between module based coverage using bind and adding covers through UVM class in terms of performance, elab time etc.
Please let me know if there is a recommended way.


In reply to kushal_reddy:

You may be using terminology local to your design and verification team. By “module based coverage” I assume you mean coverage collected by assert and cover directives in a module, or a covergroup instantiated directly in a module, and that module bound into your DUT by a bind directive. And by class based coverage, I assume you mean a covergroup embedded in a UVM class connected via an analysis port.

If that’s the case then the answer to your question is: “it depends”.

In general, cover and assert directives are better at analyzing temporal events, i.e. things that happened over a period of time. Whereas covergroups are better at sampling snapshots of data and intersecting that data with other sample points. But a lot depends on how readily accessible is the information you want to cover in form you can model in any one of those constructs.

You may want to look at our Coverage Cookbook for examples of different ways of collecting functional coverage for different requirements.