Reset testing is a crucial element of functional sign-off for any chip.
The architectural components of the entire verification environment need to be
correctly synchronized to be made aware of the reset condition. Scoreboards,
drivers and monitors need to be tidied up, and the complex stimulus generation
needs to be killed gracefully.
As we know, in UVM, there are twelve phases parallel to run_phase:
- pre_reset_phase(), reset_phase(), post_reset_phase(): Phases involved in reset activity.
- pre_configure_phase(), configure_phase(), post_configure_phase(): Phases involved in configuring DUT.
- pre_main_phase(), main_phase(), post_main_phase(): Phases involved in driving main stimulus to the DUT.
- pre_shutdown_phase(), shutdown_phase and post_shutdown_phase(): Phases involved in settling down the DUT after driving main stimulus.
Using these phases instead of using only run_phase, we can achieve
synchronization between all components of verification environment also easily
test reset functionality.
In reset testing, user drives random sequence to the DUT and in between
data transmission, reset is applied followed by driving restart sequence. We
will see how the reset functionality could be easily tested using phases
parallel to run_phase and phase jump feature of UVM.
Let’s go through complete example to understand how it is achieved
using UVM phases and Phase jump feature.
----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
As shown in above code,
Driver is waiting for Reset to be asserted (in reset_phase) by raising
objection and then perform action which user want on assertion of Reset signal
and at last drop the objection and move to post_reset_phase. In post_reset_phase
driver is waiting for Reset to de-assert and then move to main_phase. In
main_phase driver drives stimulus on interface and in parallel to that wait for indication
from agent about assertion of reset.
Components such as monitors that attach to signaling interfaces should
be designed to be phase independent because they are intended to mimic other
real devices in the system. These components should watch the reset signal
associated with their interface and reset themselves accordingly.
You may find that the driver, the sequencer, and their currently
running sequences will squawk with errors if they are not synchronized
properly. UVM requires that the sequencer first stop its sequences and then the
driver must be certain to not call item_done on any outstanding sequences. However, the order that a simulator executes
threads in the various components is indeterminate. To synchronize these
operations, the containing agent has a pre_reset_phase such as the above.
----------------------------------------------------------------------
----------------------------------------------------------------------
When test enters main_phase initially first time at that time run_count
is 0, so on assertion of Reset test will do phase.jump method and move to
pre_reset_phase from main_phase.
When test enters main_phase second time at that time run_count is 1, so
at that time it will not do phase jumping.
Note: It is not good to use a phase jumping feature in case any of the
components of testbench don’t use the sub-phases of UVM.
Reference:
but some modification may be require in this code like we can use virtual my_interface instead of my_vif in some files
ReplyDeleteEx top file.
why we need agent.config.vif, we can instead use virtual interface in driver and drive on that?
ReplyDelete