Register-Transfer Level Hardware Description with SystemC:Synthesizable Subset for SystemC
Synthesizable Subset for SystemC
All examples (except the testbenches) presented in the previous section have direct hardware correspondence and therefore they can be manually synthesized to actual hardware. Since an RTL model is usually used as an input of a synthesis tool, there are constraints that must be followed when designing at this level. Therefore, the term “nonsynthesizable design” does not imply that there is no way to convert that design to a corresponding hardware. Rather, it denotes that the design conversion is not supported by most of the existing tools, or it is very complex to be performed automatically.
In May 2001, Synopsys released a subset for synthesizable SystemC. Many CAD tools dealing with RTL SystemC rely on this subset. However, with minor revisions, a number of its constructs that are
defined as nonsynthesizable can be used in special cases for automatic synthesis. In the following section, a list of constructs that can or cannot be used in a synthesizable design is shown. For more details, the reader can refer to Ref. [3].
Nonsynthesizable SystemC Constructs
The following constructs in SystemC are not supported for RTL synthesis:
• SC_THREAD and SC_CTHREAD: SC_THREAD and SC_CTHREAD are not synthesizable since they can contain wait functions. In the previous section, most of the threads and clocked threads used in examples can be easily converted to a method (SC_METHOD), which is synthesizable.
• sc_main: it can be used only as a testbench, not a part of the design.
• sc_start
• Global and local watchings
• Tracing: creating waveforms and trace files only can be performed in testbenches.
In addition, there are several C/C++ constructs that cannot be used in a synthesizable RTL design in SystemC. The major C/C++ constructs that are not supported are:
• Local and nested class declarations
• Derived classes: the only supported classes are SystemC modules and processes
• Dynamic memory allocation
• Exception handling
• Recursive functions
• Function and operator overloading: the only exception is the classes overloaded by SystemC
• virtual functions
• Inheritance and multiple-inheritance
• public, protected, private, and friend keywords are ignored during synthesis process. All the members of a class become public
• -> operator: the only exception is in module instantiation
• Static members
• * and & operators for dereferencing
• Commas in for-loops
• Pointers: the pointers are only allowed in the instantiation part of the hierarchical modules
• User-defined template classes
• Run-time type castings and type identifications
• goto statement
• unions
• Global variables
• Member variables shared by two or more processes
• volatile variables
Nonsynthesizable Data Types
The following list shows the data types which are not supported for RTL synthesis:
• Floating-point types
• Fixed-point types (e.g., sc_fix)
• Access types (e.g., pointers)
• File types and IO streams
Except the above list, other types of SystemC and C/C++ are synthesizable.
Comments
Post a Comment