The conventional approach to designing embedded systems is to delegate the production of their hardware and software components to separate teams of hardware and software engineers. This means that system partitioning must be decided early on - often a priori - and that co-simulation must be used to verify entire designs throughout their development. Furthermore, the initial partitioning must be adhered to as much as possible since late changes can require extensive re-designs: functions programmed in software may need to be re-implemented as hardware circuits (or vice versa) and the hardware/software interface updated accordingly. Yet in many projects the optimal system partitioning does not become apparent until late into development. Not surprisingly, over a third of new digital products are late to market. As design complexity continues to increase, it seems likely that the commercial success of future products will depend upon whether the electronic design community is able to resolve the incompatibility between hardware and software design methodologies.