I am working on USB project where currently we have 1 Host and 1 Device .
Here’s how the current TB Architecture is ::
Both Host and Device has 3 Layers : L1 ( Top-most Layer ) , L2 ( Middle Layer ) and L3 ( Phy Layer ) .
So currently we run a test via “default_sequence” through uvm_config_db#(uvm_object_wrapper) .
The test starts a Host sequence and Device Sequence in main_phase() .
There are 2 drivers in the env :: Host_driver and device_driver which drive transactions to L1 at host and device end respectively .
The host sequence body() starts ( unblocks ) when the an attachment is detected at Host .
Now we need to add support of N-Host Phy so that we can connect N-Devices . Ideally the host can independently communicate with N-devices at a time
(1) Is there a need for more than 1 Driver-Sequence pair at both end ? ( Currently there is only 1 pair at each end )
(2) For N-Phy if I go ahead with Single Driver-Sequencer at each end ,
I have thought of driving the transaction on the appropriate port interface ( via adding a property to user_sequence_item )
to which a device has been attached .
The property ( port_number ) would tell the host_driver which Interface ( Out of N-L1’s ) to drive it to
(3) How can I run N- default_sequences via test ?
All N-Phy would be same host_sequence and device_sequence . So depending on which port the device attaches to ,
the appropriate host_sequence body() task would unblock ( on device attach being detected )
At present I start default_sequence via ::
// In connect_phase of uvm_test_top
uvm_config_db#(uvm_object_wrapper)::set(null,"*seqr_host*.main_phase","default_sequence",host_sequence::type_id::get() ) ;
uvm_config_db#(uvm_object_wrapper)::set(null,"*seqr_device*.main_phase","default_sequence",device_sequence::type_id::get() ) ;
Simply writing ::
// In connect_phase of uvm_test_top
repeat(N)
uvm_config_db#(uvm_object_wrapper)::set(null,"*seqr_host*.main_phase","default_sequence",host_sequence::type_id::get() ) ;
repeat(N)
uvm_config_db#(uvm_object_wrapper)::set(null,"*seqr_device*.main_phase","default_sequence",device_sequence::type_id::get() ) ;
This doesn't work , any suggestions ? Is it possible via default_sequence ?