Cross Coverage

I think you are putting too much complexity into your covergroup. Covergroups are designed for data collection, not protocol coverage and checking. I would just write a single coverpoint that samples DATA when valid (I’m not sure what the point of covering DATA into 8 bins is, but I assume you have a reason).

There is no need for the CROSS, you just can create another coverpoint

  SOP_DATA : coverpoint av_vi.data iff(av_vi.valid == 1'b1 && av_vi.sop == 1'b1)
    {
      bins  DATA_RANGE [8]    = {[32'h0 : 32'hFFFFFFFF]};
    }

(Again, I’m not sure what the point of covering the first DATA item different from the rest of the data items in the packet, but I assume you have a reason)

You should always collect coverage assuming that all protocols are correctly checked elsewhere. If the checking fails, then you throw away the all coverage collected for the entire test. There are some situations that deal with error recovery where this is not the case.

Ideally you put protocol checking in an assertion, except that assertions are not allowed inside classes. So you would have to build a state machine to do your checking inside a class.

I would need to see more information about what requirements you are trying to cover and check before spending more time coming up with examples. For example, how do you decide when another SOP is allowed to be enabled?