Is it possible to let two VVC’s talk to each other?
Are there examples?
What I want is to let MY_SEQUENCER talk to MY_DRIVER which talks to the DUT
MY_SEQUENCER < – transaction interface → MY_DRIVER ← std_logic interface → DUT
MY_SEQUENCER should say:
START_TEST_1
MY_DRIVER under stands this message and executes this on the dut
it signals back to MY_SEQUENCER with a message
DONE
MY_SEQUENCER says then:
START_TEST_2
etc
In the end MY_SEQUENCER says
END_OF_TEST
This results that the MY_DRIVER stops
Is this possible within UVVM?
And what kind of transaction interface should be between the sequencer and the driver?
Is such a interface provided in the UVVM itself?
Where to define such an interface as the sequencer, as well as the driver should know the definition?
Hi Eric,
What tou are describing is pretty much how a sequencer can talk to a VVC to make it execute transactions on the DUT interface. A basic VVC would receive single interface transaction commands, but a more advanced VVC with a local sequencer could on the reception of a single command from the sequencer execute multiple interface transactions towards the DUT. You can find examples of this in for instance the UART_TX_VVC. This loops the excution of multiple transmissions, but the sequence could equally well be different interface actions in sequence.
The feedback to the sequencer that the VVC is finished would then be implicit via for instance await_completion().
If you are not using VVCs or all you want is to have MY_DRIVER like a parallel or lower level sequencer, then you will have to make your own protocol between MY_SEQUENCER and MY_DRIVER. Then you should use the inter process synchronization mechanisms in UVVM to signal back and forth between MY_SEQUENCER and MY_DRIVER.
block_flag(flag_name, msg, [already_blocked_severity, [scope]])
unblock_flag(flag_name, msg, trigger, [scope])
await_unblock_flag(flag_name, timeout, msg, [flag_returning, [timeout_severity, [scope]]]
You can find information in the Utility Library Quick reference for how to use these.
In your case you could also just set a signal in MY_SEQUENCER with the command as a string or enumerated (e.g. START_TEST_1) and have MY_DRIVER trigger on that, and the other way around. If MY_SEQUENCER and MY_DRIVER are in different entities you could use global signals.
If in fact you want two VVCs to communicate directly then you could use the global signal solution and synchronisation if needed. You could also have one VVC sending commands to another - as we do in our hierarchical VVCs