Dependency between interfaces

Hello,

I need a feedback on how to setup TB.

My DUT that has two interfaces. Both are very different. So I have two agents each with their own driver and sequencer. One DUT scenario requirement is that whenever a subset of transactions is driven on Interface A, a particular transaction must be driven on Interface B. I was thinking of implementing in following ways. I wanted to know which one of these is the recommended practice. Or is there another way that I have not thought of?

  1. MonitorA and DriverB implement same the interface class. MonitorA has a pointer of interface class type which has handle to DriverB class. Whenever MonitorA observes the required subset of transactions it calls an inherited function implemented in DriverB. SequenceB always generates dummy sequence item before generating actual sequence item. DriverB’s response to that dummy sequence is a request to generate a specific transaction, if any.

  2. Same as above but use TLM ports for communication between MonitorA and DriverB

  3. I read a presentation about Monitor to Sequencer communication that is helpful in writing Slave sequences. May be that is possible here for MonitorA to SequencerB communication

  4. I am not sure if a virtual sequence fits this case since the interfaces are mostly tangential except for one case.

Regards,
Rajesh C M

In reply to rajmuk01:

A few things need clarification.

  1. When you say “a subset of transactions is driven on Interface A”, What correspondence does that mean in terms of individual sequence items or sequences
  2. What kind of timing relationship is there between the subset being driven on A, and the particular B transaction?
  3. What kind of transactions are going on B when not responding to A. Do you want A to interrupt B?

In reply to dave_59:

  1. Interface A is Register Interface. Interface B is a Instruction interface. So if I drive a transaction on Interface A to change some system register, then I need to drive a special instruction on Interface B.
  2. Timing between that subset and special instruction should be randomized.
  3. No. They don’t have to stop each other. Although until that instruction is driven on Interface B, further transactions on Interface A wont be a valid use case. Design wont error them but it just does not happen at System level.

In reply to rajmuk01:

Are you driving the seq on “interface A”? If yes you know already without monitoring it under which condition randomize the stimuli to the interface B… In this case, you do not need to overcomplicate the TB as you are thinking.

Cheers,
Stef

In reply to deve91:

Yes. I i have separate sequences and drivers on both interface A and interface B. How will sequence on interface B will know without some component telling it?

In reply to rajmuk01:

An option is just to layer the sequence, you can have a higher level sequence that controls the sequence on interface B after sequence A has been randomized and started. This is pretty much the basis for the usage of a virtual sequence. some useful link: https://www.chipverify.com/uvm/virtual-sequence

You can do the same thing within the test without creating a virtual sequence but it will be less encapsulated and reusable.

Have fun! Cheers,
Stef

In reply to rajmuk01:

In reply to deve91:
Yes. I i have separate sequences and drivers on both interface A and interface B. How will sequence on interface B will know without some component telling it?

If I understand your requiremen´t correctly uvm_barriers could be used to implement this dependency.