Since you are focusing on hardware(logic) simulation, here are a
couple of thoughts from an old logic guy: There is control logic, data
flow,
storage(latches, regs, memory) and time events. Events occur in time
sequence
and can be associated with a value that represents time, i,e, the
number of
clock oscillator cycles or a number representing delay time.
Evaluating
control - Boolean expressions - determines what can occur when an
event occurs
and evaluating the data flow expressions determines the new storage
values.
This of course is a subset of general DES.
In synchronous logic there is a capture/launch behavior in the storage
elements, so
saving the values of data in for each element without changing any
element allows
all storage elements to be changed for the launch. Repeat for each
clock cycle.
Asynchronous logic relies on timing the changes such that the din
values are stable
during the setup and hold times. Also there is no separate launch
phase so the
order of changes affects the time it takes to resolve the logic for
the next event. If
the next event can be triggered by any of the current changes, then
there may be a false
trigger during the resolution interval. These are the glitches that
cause most designs
to use clocked capture/launch so there is time for the circuits to
resolve.
Timing driven simulation where each circuit and wire delay is
calculated to determine the
next data in values is much more tedious (Impossible because all
physical properties that
affect timing are unknown) so static timing analysis is used to ensure
that setup and hold times are met.