Manifesto write-up
There are many commercially available tools to perform digital
simulation and they basically work in the same way: a simulator is synthesized
by mapping the entire digital system either at the gate level or behavior
level into a piece of runnable code, then one executes the simulator to
check for the behavior of the design. We name this type of simulator synthesis
methodology as "whole circuit to one-simulator" approach.
To cope with the complexity of a large digital system, the "whole
circuit to one simulator" approach is somehow insufficient due to
its lack of organizational principal that can guide designers in formulating
the overall design. We need strategies to help us structure large systems
so that they will be modular, that is, so that they can be divided "naturally"
into coherent parts that can be separately developed and maintained.
Our proposed approach is "component based" and it is
particularly appropriate to the construction of design for a digital systems.
For each module in a digital system, we construct a corresponding computational
object called "component" which encapsulates the behavior of
that module, or in other words, a component is capable of "self-simulating".
Our hope in this approach is that extending the model to accommodate new
physical module will require no strategic changes to the overall design,
only the addition of the new symbolic analogs of those modules—components.
If we have been successful in our system organization, then to add a new
feature or debug an old one we will have work on only a localized part
of the system.
According to our current model, there are two kinds of components
in our simulation system: base components and high level components. Base
components possess behavior corresponding to the function modules at the
bottom level of the abstraction hierarchy of a physical system; they are
indivisible entities and can be thought of as the "bricks" of
the complete simulation system. If we knit these "bricks", that
is, we pack base components and regard the collective behavior of these
base components as the behavior of a single entity, we then have high level
components. However, such "abstracting" is not going to end here,
obviously, we can keep building one level of abstraction on top of another,
until we have an abstraction "pyramid". To complete the definition
of the a high level components, we claim that except the bottom part of
such a abstraction "pyramid"(certainly we call the bottom part
"base component") , components at all other levels are high level
components. In particular, the one at the peak which encapsulate the overall
behavior represents the entire design.
Components "talk" with each other. One type of interaction
occurs within the same abstraction level-- a component is "driving"
and being "driven" by its neighbors. To illustrate this, let’s
say component A, component B and component C are at the same level of abstraction,
A gets input from somewhere and computes the output; B brings in this output
and does the computation to drive C. We define the output from C as the
output of the whole system consisted of A, B and C. It is important to
point out that the topology of the system is simplistic and can be, in
reality, much more sophisticated. Another type of interaction is between
two adjacent abstraction level. In the above system, if we wrap A, B and
C into a high level component called SUPER, then SUPER must be able to
define the computation sequence: it orchestrate A, B and C when to compute
and where to look for inputs. So in every component we need a piece of
data structure called "scheduler" to serve this purpose and because
of that, every component only has the concept of "local time",
where the local time of each component is determined solely by messages
passed to it in the normal course of the simulation.
When one wants to perform simulation, one feeds the inputs to
the top level component. The top level component accepts the inputs, distributes
the inputs and scheduling messages to lower level components. Lower level
components receive their assignments and pass tasks to next lower level.
Eventually, the inputs will reach the base components and it is the base
component that does the real simulation work. All other levels of components
serve as messaging and controlling nodes.
Certainly, we keep all the components in a single machine and
run the simulation locally; however, one of the most important features
of our component based simulation is its ability to distribute the components
across the network. Components taking on many machines interconnected via
network transform the whole network into a giant multi-processor computer
and if the efficient leverage of the computing resource is realized, we
might greatly improve the simulation performance. Such kind of distributed
simulation also empower electronic designer new methodologies that was
never before available: the full-fledged design can be wrapped into a super
component and placed on the world wide web to make it available to third-party
designers or potential OEMs, designers will have the option to mix and
match different components and run click-button simulation from any remote
client machine, while the actual computation is totally done distributedly.
To conclude, component based simulation provides a more viable
methodology for digital simulation than the traditional "whole circuit
to one-simulator" approach. What we plan to offer is a working distributed
component based simulation system, a set of APIs that will facilitate the
construction of this type of simulation system and a GUI component composer
which will enable user to build and wrap component visually. Our language
of choice is Java, the language that offers cross-platform software environment
intended for distributed systems.