Release Notes for SystemC 2.3.1 =============================== Andrew C. Goodrich, Forte Design Systems Philipp A. Hartmann, OFFIS Institute for Information Technology CONTENTS ======== 1) What's new in this release? 2) Bug fixes and enhancements 3) New features 4) Incompatibitilies with previous releases 5) Expanded dynamic process support 6) Experimental features 7) Known problems 8) Fixed-point library 9) TLM Release Notes 1) What's new in this release? ============================== This version of SystemC contains the "Proof of Concept" simulator for the IEEE 1666-2011 SystemC standard. Please consult the IEEE Std 1666-2011 SystemC Language Reference Manual for details about the current SystemC standard. TLM-2.0 is merged into the main SystemC release since 2.3.0. Please see section 9) below for more details related to TLM. Compared to the 2.3.0, this release has the following new items: - New features, partly beyond the current IEEE 1666-2011 standard, see section 3. - Experimental features (disabled by default), see section 5. Testing and feedback welcome via the Accellera SystemC forums at http://forums.accellera.org/forum/9-systemc/. - Bug fixes, see section 2. - Expanded platform support, see the README. 2) Bug fixes and enhancements ============================= Following is the list of bug fixes and enhancements for this release: - For fixes and enhancements of the embedded TLM-2.0 implementation, please see section 9. - Additional changes and cleanups leading to incompatibilities with previous versions of SystemC are described in section 4. - Fix nested SC_METHOD preemptions caused by resetting a method, which throws an exception in a thread process. The control now correctly goes back to the throwing method. - Handle the case of a suppressed multiple-writer error in sc_signal (and related channels) consistently with SystemC 2.2.0 again. - The 'sc_buffer' and 'sc_buffer' channels now correctly notify their (pos|neg)edge_events, if someone is waiting on them. - Cleanup the renaming of the internal Boost namespaces. The embedded Boost implementation resides in the (renamed) top-level namespaces - sc_boost - sc_unnamed (for placeholders, part of IEEE 1666-2011) - sc_mpl_ (internal ADL barrier) - Minor fixes in sc_vector-related classes - correctly determine instantiation context - sc_vector_iter: addition/substraction operators fixed - sc_vector_assembly: add swap, fix missing return statement in assignment - WIF tracing of 64-bit integers: fix widths and masks on some 64-bit platforms. - Suppressed a warning in case of calling sc_start in case of pending delta notifications without any pending (or resulting) process activations afterwards (1666-2011 compatbility). - Fix sc_string_old implementation to handle very long strings (>1024) (known issue in <=2.3.0). Note, that sc_string_old is no longer included by default, see section 4. - Add "risc_cpu" example to Automake build system ("make check"). - Add missing files to the MS Visual C++ SystemC.vcproj project file. - Add a missing "break" statement to "scfx_utils.h" in the "SC_CSD" format parsing logic. - Fix several integer conversion warnings raised by some compilers throughout the SystemC implementation. - Fixed incorrect GCC i386/x86_64 function call stack alignment when using the QuickThreads/WinFiber-based process implementations (16-byte boundary). This avoids segmentation faults in some cases where the stricter stack requirement is implicitly assumed by the compiler. - The default stack size for threads, SC_DEFAULT_STACK_SIZE, has been increased on 64-bit platforms and is overridable at library build time (see INSTALL). - The sc_report implementation now correctly handles empty and NULL message type arguments (avoiding a segmentation fault in these cases). The sc_report default constructor is made private to follow IEEE 1666. - Missing namespace qualifiers added to all reporting macros, namely - SC_DEFAULT_*_ACTIONS - SC_REPORT_INFO_VERB to make them usable again while including instead of - VCD/WIF tracing: fix support for very long values The sc_(un)signed and sc_fxnum(_fast) data types can potentially hold longer values than 1000 bit, which used to be the fixed size of the intermediate buffers in sc_(vcd,wif)_trace for these types. - Cleanup systemc.h - Drop any in-library dependencies on the old 'sc_string' class, removing the need to provide the corresponding header externally (see section 4). - Drop explicit in-header dependencies on on Windows platforms, removing the automatic inclusion from (see section 4). - Drop inclusion of 'strstream' by default on some platforms (see section 4) - assume working C++ standard library on all platforms - assume working argument-dependent lookup on MSVC (which should be working since MSVC 2003 already) - see section 4 and INSTALL file - Improved compile/runtime check of the SystemC library config Some preprocessor switches need to be consistent between the application and the library (e.g. if sizes of classes are affected or other parts of the ABI are affected). These can now be checked at link-time. Secondly, some preprocessor switches need to be consistent between different translation units of an application, which is checked at runtime startup. - sc_context: avoid reinterpret_cast from integer to pointer - The SC_VERSION_ORIGINATOR has been renamed from "ASI" to "Accellera" to follow the naming policies of the Accellera Systems Initiative. - Cleanups of the VCD/WIF tracing implementation - Removal of internal files from the public headers (see section 4) - Report any information (infos, warnings, errors) via the SystemC reporting mechanism instead of directl printing to std::cout/cerr - Automatically unregister trace updates when closing a trace file during the simulation - Drop the 'register' storage class specifier, which has been deprecated in the C++11 standard (and therefore might cause warnings on some compilers). - Expanded naming of traced objects in VCD traces to use 5 characters rather than 3 to accommodate more signals (incomplete in 2.3.0). - Fix sc_signed/sc_unsigned conversion bug on GCC 4.8 or later, coming from its aggressive optimization in case of integer over/underflows (by avoiding the C++ undefined behaviour in the implementation). - An output stream operator<< for sc_status is added to enable pretty-printing of sc_status values (and bitwise combinations of such values). - Various minor code cleanups and compiler warning fixes - removal of some workarounds for very old versions of some compilers (e.g. MSVC < 8.0). - removal of unused variables and macros - some deduplication of redundant code paths 3) New features =============== Here is an overview of changes in 2.3.1 compared to 2.3.0. Note: These features partly add functionality beyond the current IEEE Std. 1666-2011. - Major rewrite of the Autoconf/Automake build system - better control of the installation directories - improved libtool library dependency detection, especially in cross-compilation scenarios (--host=...) - support for pkg-config for SystemC and TLM (see http://www.freedesktop.org/wiki/Software/pkg-config/) - accept arbitrary GCC-compatible compilers (e.g. Clang, Intel compiler, compiler-wrappers like scan-build) - avoid deprecation warnings, cleanup implementation - less recursive build, silent rules by default - improved "make check" test handling - Updated MS Visual C++ project and solution files to include support for Visual Studio 2012 and 64-bit builds on Windows platforms. - Improved conversion between the underlying integral time representation and sc_time objects: - Add a nested typedef "value_type" to sc_time to enable an implementation-independent use of the underlying integral time representation (see IEEE 1666-2011, 5.11.1). - Adding an inverse to the 'sc_time::value()' function to convert a plain value back to an sc_time object: static sc_time sc_time::from_value( value_type t ); - Adding modulus operators (%, %=) to compute time offsets from clock or quantum boundaries: sc_time operator%(const sc_time& lhs, const sc_time& rhs); sc_time& sc_time::operator%=(); Note: These operators are missing from IEEE 1666-2011, which make e.g. the tlm_global_quantum implementation nearly impossible within the limits of the SystemC standard. - Add function to determine the current object hierarchy: sc_object* sc_core::sc_get_current_object() Returns a pointer to the sc_object instance (or NULL) that would currently become the parent object of a newly created sc_object instance (i.e. the current module during elaboration, and the currently active process during simulation). - Add compile-time configurable default signal writer policy (see INSTALL). Defining SC_DEFAULT_WRITER_POLICY to one of the sc_writer_policy values before including systemc(.h) allows application-wide selection of the default sc_writer_policy used for signals. Defining SC_NO_WRITE_CHECK is equivalent to SC_DEFAULT WRITER_POLICY=SC_UNCHECKED_WRITERS By default, the writer policy still disallows multiple writers (SC_ONE_WRITER). - Add an sc_signal initialization which does not create an event via newly provided constructors to the signal classes: sc_signal::sc_signal( const char* name , const T& initial_value ); (similarly for sc_buffer and sc_signal_resolved) Compared to calling the "write()" function on a signal during the elaboration, these constructors will set the initial value of the signal without triggering an event at the beginning of the simulation (and therefore may avoid triggering sensitive processes). - Add a static function to sc_report_handler to query the current report handler function: static sc_report_handler_proc sc_report_handler::get_handler(); Additionally, sc_report_handler::set_handler() now returns the previously set handler (c.f. sc_report_handler::set_actions). - Improved conversion from bitvector element references to bool As it is surprising to the user that a reference to an explicit element of a sc_bv could not be used in a boolean context, a safe conversion has been added to this release. This enables the following coding style: sc_bv<8> mybits; // ... if( mybits[0] ) // no longer a compiler error here! /* do something */ ; Note: For logic vectors, the bit-references still need to be converted to bool explicitly (e.g. via the "to_bool()" function. 4) Incompatibilities with previous releases =========================================== Here is a list of known incompatibilities between this release and 2.3.0 (or earlier): - The non-standard sc_time constructors - sc_time( uint64, bool scale ) - sc_time( double, bool scale ) have been deprecated and issue a warning when being used. Use the new 'sc_time::from_value' function instead (see section 3). - The non-standard function 'sc_object::get_parent()' has been deprecated, use 'sc_object::get_parent_object()' instead. - The non-standard function 'sc_signal::get_new_value()' has been deprecated (as required by IEEE 1666-2011). - The non-standard implementation classes for the VCD and WIF tracing (vcd_trace_file, wif_trace_file) are now hidden from an application and no longer part of the public headers. Use the IEEE 1666-2011 functions - sc_trace - sc_create_[vcd|wif]_trace_file - sc_close_[vcd|wif]_trace_file - sc_trace_file::set_time_unit to set up the tracing in your application. - The non-standard header 'src/sysc/communication/sc_reset.h' is no longer part of the public headers. - The 'sc_string_old' class is no longer available by default. Define 'SC_USE_SC_STRING_OLD' before including "systemc.h", see INSTALL. - The implicit inclusion of the system-headers "windows.h" (on Windows) and (deprecated) "strstream" have been removed. See INSTALL. - The incomplete implementation of old "W_*" watching macros and the non-standard struct sc_watch have been removed. Here is a list of known incompatibilities between this release and 2.2.0: - The order that processes (SC_METHODs and SC_THREADs) are dispatched for execution may be different than the order with SystemC 2.2.0 for some SystemC programs. This is related to the new starvation policy support for the sc_start() function introduced with IEEE 1666_2011. - The various bind() functions for ports and exports are "virtual" as of IEEE 1666-2011. This leads to an incompatibility with the TLM 2.0.x release. To use SystemC 2.3 together with TLM 2.0.{0,1}, define SC_DISABLE_VIRTUAL_BIND during the build of the simulator and before including systemc.h (see INSTALL). 5) Expanded Dynamic Process Support =================================== This version implements the dynamic process extensions described in the IEEE Std 1666-2011 Language Reference Manual. Compared to SystemC 2.3.0, some bugs in corner cases of the specification have been fixed (see section 2). 6) Experimental features ======================== In this section the experimental features of this release are listed. Note: These features are not enabled in the default library configuration and need to be explicitly activated during at library build time. See INSTALL file. - Extended Simulation Phase Callbacks This release adds an optional mechanism to register callbacks to several simulation phases. This can be used to integrate custom introspection techniques in a non-invasive manner. New phases are added to the sc_status enumeration: SC_END_OF_INITIALIZATION, SC_END_OF_UPDATE, SC_BEFORE_TIMESTEP to enable a more fine-grained view to the SystemC simulation phases. When the phase callback mechanism is activated (see the INSTALL file), any sc_object can subscribe to a (set of) elaboration/simulation phases for dynamic callbacks explicitly: // trigger current object before updating the simulation time this->register_simulation_phase_callback( SC_BEFORE_TIMESTEP ); // trigger current object before returning to "sc_start" this->register_simulation_phase_callback( SC_PAUSED | SC_STOPPED ); Unsubscribing from any simulation phase is possible via the corresponding unregister_simulation_phase_callback( phase_cb_mask ) function. Both functions return the effective mask after the requested callback mask update. Therefore, querying the currently active mask can be achieved by calling the (un)registration functions with an empty mask: sc_object::phase_cb_mask current_cb_mask = this->register_simulation_phase_callback( 0u ); To enable the external (un)registration of callbacks for a user-defined sc_object class, the (un)registration functions can be made public by adding the following using directives to a 'public:' section of the class definition: using sc_core::sc_object::register_simulation_phase_callback; using sc_core::sc_object::unregister_simulation_phase_callback; When the simulation passes a phase where dynamic callbacks are registered, the subscribed objects are triggered via the function: virtual void sc_object::simulation_phase_callback(); which should then be implemented by the subscribing object's class. Within a simulation callback, the triggering phase can be determined via the IEEE 1666-2011 'sc_get_status()' function: void simulation_phase_callback() { std::cout << sc_core::sc_get_status() << std::endl; } A related feature is the triggering of sc_trace updates via these simulation phase callbacks instead of the hard-coded calls in various places of the simulation loop. This feature has to be enabled separately, see INSTALL file. - Allow creation of sc_max_time() objects before fixing the sc_time resolution Currently. IEEE 1666-2011 requires that any call to sc_core::sc_set_time_resolution( double, sc_time_unit ) happens before the construction of the first non-SC_ZERO_TIME sc_time object. This can be inconvenient in cases, where an "uninitialized sc_time value" is needed, which needs to be separate from SC_ZERO_TIME in some cases. A relaxation of the strict sc_time construction rules wrt. to the simulation time resolution can be optionally enabled via the preprocessor switch SC_ENABLE_EARLY_MAXTIME_CREATION (see INSTALL). When this option is enabled, the creation of time objects with the values SC_ZERO_TIME and 'sc_max_time()' are allowed before fixing the time resolution. The resolution is still fixed once the actual relationship between the internal time representation and the physical time units (SC_FS, SC_PS, ...) is used or observed by the application. 7) Known Problems ================= - When building the SystemC library with QuickThreads support, the resulting shared library is marked as requiring an executable stack by certain compilers/assemblers (or rather not marked as not needing one). As a result, some system security systems (like SELinux) might refuse to load the library. As a workaround for GNU (compatible) assemblers, pass the assembler flags variable with the option CCASFLAGS="-Wa,--noexecstack" to the `configure' script call before building the SystemC library. - IEEE 1666-2011 does not explicitly define the behaviour in the corner cases of attempting to create sc_time objects smaller than the time resolution or bigger than sc_max_time(). This implementation currently truncates "small" sc_time objects to SC_ZERO_TIME, while "too big" objects wrap-around sc_max_time() and lead to a value modulo the maximum time. In both cases, no warning is generated. - The sign-extension of mixed-signedness logic expressions (&,|) involving one sc_bigint<> operand and C++ builtin integral types (int, short, etc.) is inconsistent between 32-bit and 64-bit platforms in some cases. Convert both operands to sc_bigint<> first. - The definition of sc_dt::(u)int64 differs from std::(u)int64_t types on some platforms. This may lead to problems with function overloads and/or format-string placeholders. As a workaround, convert these values explicitly to the correct type before passing them to functions expecting one of these types. For sc_time, use the new nested type sc_time::value_type to hold values of the underlying representation. - Bit/logic-vector reductions (or_reduce, and_reduce, etc.) return an 'sc_logic_value_t' enum value, instead of a bool or sc_logic (as required by IEEE 1666-2011). Using the return value of these functions in a boolean context, e.g. if( lv.or_reduce() ) { /* ... */ } might lead to wrong results in case of 'X' or 'Z' bits in the vector. Avoid this by converting the result to an 'sc_logic' first and perform a safe conversion to bool: if( sc_logic( lv.or_reduce() ).to_bool() ) { /* ... */ } - The use of the DEBUG_SYSTEMC macro does not work properly with certain compilers (e.g., gcc 2.95.x) if it was not also specified when the SystemC library was built. The problem is caused by the use of the library compiled version of some inline methods. This problem does not appear to be present in the gcc 3.3, Solaris, and aCC compilers. The work-around is to specify DEBUG_SYSTEMC when the SystemC library is built. - On some recent compilers (e.g. Clang, Solaris Studio), warnings are generated about the "hidden overloaded virtual function" bind of the sc_port(_b) class templates in the 'specialized_signals' example. These warnings are caused by the introduction of the virtual bind implementation in IEEE 1666-2011. As a workaround, check your compiler documentation how to suppress the warning (e.g. 'CXXFLAGS=-Wno-overloaded-virtual') or mark the SystemC include directory as "system directory" by using '-isystem ${SYSTEMC_HOME}/include' (or equivalent) instead of the usual '-I'. This also affects the TLM-2.0 sockets, see Section 9.3. - Some paths in this release are longer than the historical 99 character limit of tar archives, and several Windows archivers (e.g. WinZip) have been reported to trip over this. The open source archiver 7-zip (http://7-zip.org) is known to work. 8) Fixed-point library ====================== SystemC contains a fixed-point datatypes package. Changes compared to SystemC 2.0.1 - support for explicit construction from "float" values - removing a conversion ambiguity by marking some constructors of sc_fxval[_fast] classes as 'explicit' Compile-time macro SC_INCLUDE_FX must be defined in order to build applications that use fixed point types. You can specify a compiler flag, e.g., g++ -DSC_INCLUDE_FX ... or use a define statement before you include systemc.h, e.g.: #define SC_INCLUDE_FX #include "systemc.h" Due to the large size of the fixed-point datatypes header files, compilation can take considerably more time. If you want to use the fixed-point data types only (i.e., not data- types sc_int, sc_uint, sc_bigint, sc_biguint), compilation time can be reduced by defining compile-time macro SC_FX_EXCLUDE_OTHER (in addition to SC_INCLUDE_FX). 9) TLM Release Notes ==================== CONTENTS ======== 1) Supported SystemC versions 2) What's changed in this kit? 3) Known issues 9.1) Supported SystemC versions =============================== SystemC 2.2.0 and 2.3.x are supported and have been tested. SystemC 2.1.v1 is still supported in principle, but has not been tested extensively. 9.2) What's changed in this kit? ================================ Compared to TLM 2.0.2 kit (part of SystemC 2.3.0), the following has changed: - The tlm_utils headers have been cleaned up to include , instead of - The convenience sockets with base-protocol NB/B conversion support now automatically define the required SC_INCLUDE_DYNAMIC_PROCESSES, if not already provided by the user (since the B/NB conversion depends on the SystemC dynamic process support). - Improve the NB/B conversion in the simple_target_socket to avoid the dynamic allocation (and deletion) of sc_event instances in the use of the spawned helper processes for the converesion. - Fix a bug in the same simple_target_socket NB/B conversion thread, where the target socket may not detect the early completion of the response phase via a "TLM_UPDATED" return value and a "TLM_END_RESP" phase (base protocol violation). - Fix the "get_base_interface()" implementation provided by the multi_passthrough_target_socket. Prior to this release, a dummy interface object has been used as a return value in case of a hierarchical bind. Return the first bound interface instead. - Fixed missing initialization of some member variables in the callback_binder_fw|bw implementations, that caused segfaults in some cases. - The implementation-defined tlm::circular_buffer class has been updated with the following changes - now provides a "clear()" member function to drop the current contents, - fix a segmentation fault due to freeing invalid memory in "resize()", which could happen in some cases, - work around a parsing error on some EDG-based C++ frontends. - tlm_global_quantum: use sc_time::operator% Instead of relying on a manual remainder calculation based on sc_time::value and the non-standard backwards conversion, the new sc_time::operator% is used to compute the remaining time in the current quantum (see section 3). - The internal tlm_array class (to hold payload extensions) has been reimplemented based on std::vector (fixes copy constructor bug). - The TLM_VERSION_ORIGINATOR has been renamed from "ASI" to "Accellera" to follow the naming policies of the Accellera Systems Initiative. 9.3) Known issues ================= a. The tlm_simple_target_socket in tlm_utils does not obey the END_REQ rule when only an nb_ call is registered, an b_ call is being handled in the socket and there is an nb_ call coming in at the same time. In this case the incoming nb_ call will be forwarded to the registered nb_ call without checking whether the earlier b_ call has passed the END_REQ timing point. b. The implementation of the PEQ 'peq_with_get' in tlm_utils does not properly distinguish between immediate notifications and delta notifications. In the case that a immediate and delta notification happen at the same simulation time both types of notifications emerge from the PEQ in the same evaluation phase. This is wrong immediate notifications should overtake delta notifications. c. On some recent compilers (e.g. Clang, Solaris Studio), warnings are generated about the "hidden overloaded virtual function" bind of the sc_port(_b) class templates when using the TLM-2.0 sockets. These warnings are caused by the introduction of the virtual bind implementation in IEEE 1666-2011. As a workaround in your application, check your compiler documentation how to suppress the warning (e.g. adding the flag -Wno-overloaded-virtual), or mark the SystemC include directory as "system directory" by using '-isystem ${SYSTEMC_HOME}/include' (or equivalent) instead of the usual '-I'.