In recent years, growing system complexity and shrink-ing time-to-market requirements have resulted in a strong need for new design methods and tools. In order to keep pace with the increased system complexity, designers must work at a higher level of abstraction [1]. Depending on the abstraction level (namely, the number of details used to model the system) different concerns can be addressed and solved. At each step of the design process, the key to cope with complexity is to model the systems, only with the minimum number of details needed. Abstraction hides complexity and accelerates design process. Tools support is needed throughout all steps of the design flow, from the formal specification of the system to its physical implementation.
Traditionally, the design of embedded systems has been carried out by decomposing and allocating the system to hardware and software, then allowing separate hardware and software design teams to design their respective parts, and finally integrating hardware and software. This separation of design tasks leads to the potential for initial design mistakes to be carried until the integration phase, where they are much more difficult and costly to correct. This issue has been widely addressed by development of high level languages, that describe both hardware and software, thus keeping their design flow tightly coupled.