Software programming languages, such as C/C++, have been used as means for specifying hardware for quite a while. Different design methodologies have exploited the advantages of flexibility and fast simulation of models described with programming languages. At the same time, the mismatch (of software languages) in expressing power (for hardware systems) has caused several difficulties. In the recent past, novel approaches have helped in reducing the semantic gap, and in easing the creation of design flows that support system-level specifications in C/C++.
Hardware Synthesis from C/C++ ModelsThe current and future design of electronic circuits and systems is characterized by several features and constraints. First, the system complexity is increasing, and at the same time the design time has to shrink. Thus, design methodologies and tool flows must support synthesis from highlevel specifications and fast means of verification. Second, most electronic design will target embedded systems, with an increasingly larger component of software. Efficient design and optimal implementation require exploiting hardware/software co-design strategies. Balancing the hardware and software components in the search of on optimal implementation may require the migration of software blocks to hardware or vice versa. Third, design of complex circuits and systems will leverage more and more the re-use of existing hardware and software components. Efficient component re-use requires specification at a high-level of abstraction as well as the ability of mapping the specifications to different targets. Programming language models in C/C++ can be compiled into object code for several architectures, and it is highly desirable to be able to compile them into hardware as well.Within this context, it is clearly obvious why designers write functional models of hardware/software systems, as well as of hardware circuits, using familiar programming languages. Functional models can be evaluated quickly by simulation, and can be directly compiled when a software solution is sought. At the same time, legacy models of software functions written in programming languages can be used as part of a new system design.The drawbacks of using programming languages for hardware design are a few. I shall outline the most important ones. First, hardware circuits can execute operations with a wide degree of concurrency. Conversely, software programming languages like C/C++, were conceived for uni-processor sequential execution. Second, the specifications of hardware circuits entail some structural information. For example, the interface of a circuit with the environment (and/or internal blocks) may require the definition of the input/output ports and the data formats across these ports. In addition, a designer may want to express hints (or constraints) on some partitions of the circuit. Such structural information and constraints are missing from programming languages. Third, detailed timing of the operations is very important in hardware, because of performance a...