
TLM 2.0 provides a utility class for threads to keep track of their
thread global quantum, local quantum and local time offset. This is
in the tlm_utils namespace (like the convenience
sockets) with a header in
tlm_utils/tlm_quantumkeeper.h.
A module will instantiate one quantum keeper for each thread that uses temporal decoupling, initializing them in the constructor.
Two functions are provided to manage the thread global quantum:
set_global_quantum to set the value and
get_global_quantum. Typically a module
constructor will get the system global quantum
with a call to the singleton
tlm_global_quantum and immediately use that
to set the thread global quantum for each thread's quantum
keeper.
One function is provided to manage the local quantum. The
reset function calls
compute_local_quantum to calculate the local
quantum from the time stamp and the global quantum (which is done by
calling the compute_local_quantum in the
singleton tlm_global_quantum object) and sets
the local time offset to zero.
Typically a constructor will call reset for
each thread immediately after setting the thread global
quantum. The compute_local_quantum in the
quantum keeper is protected, so cannot be called
directly (which seems to be an omission). If the value of the local
quantum is needed, this can be obtained using the
compute_local_quantum function in the
singleton tlm_global_quantum object.
Four functions are provided to manage the local time
offset. set sets the local time offset to a
particular value, inc increments by a given
value and get_local_time returns the current
value of the local time
offset. get_current_time computes the local
effective time, i.e. the SystemC time stamp plus the local time
offset[10]. The intention is that a thread advances model time, it
will call set and inc
to update the local decoupled view of time.
Two functions are provided to handle synchronization. The test
need_sync returns true if the local time offset
exceeds the local quantum. sync calls
wait for the local time offset, synchronizing
the thread with the global SystemC view of time, and allowing
other threads to catch up. It then calls reset
to update the local quantum and zero the local time
offset. sync should always be called when
need_sync is true, but may be called at any
other time if required.
[10]
The naming is not
consistent. get_local_time should have
been just get for consistency with
set and
inc.
get_current_time would be better named
get_effective_time, to match its
description in the standard.
