( ESNUG 414 Item 7 ) -------------------------------------------- [06/18/03]

From: Evan Lavelle <eml=user  company=riverside-machines spot calm>
Subject: The News From Those Who've Done It; Evan's Pros & Cons of SystemC

Hi John,

Some comments on SystemC's pros and cons for you.  First off, I don't use
SystemC for RTL synthesis.  I do, however, use it for architectural design:
device definition, cycle-accurate behavioural modelling, design space
exploration, HW/SW co-simulation, and verification.  SystemC does a pretty
good job in all these areas, and lets you do in *one* industry-standard
language what might otherwise require 3 languages, 3 design environments,
and 2 expensive licences.  And, of course, it's free.   In short, if you're
doing architectural design, it's pretty much a no-brainer.  That's the
summary: the details are, of course, a bit more complicated.

The first detail is that writing synthesisable code is pretty tedious.  I
don't consider this to be the end of the world, but most people don't get
beyond this point, so I've put it at the top of the list.  SystemC is simply
a C++ class library, so it can't add any syntax to C++.  This means that
basic HDL functionality, such as driving signals, creating processes and
modules, and so on, has to be shoe-horned into existing C++ syntax.  This
works pretty well, although I'm reminded of Samuel Johnson's famous remark
about dogs walking on their hind legs: "It is not done well, but you are
surprised to find it done at all."

In practice, the most significant SystemC problems are:

 1. There is no way to model continuous/concurrent assignments in SystemC.
    All signal assignments must be carried out in processes.
 2. Defining always blocks/processes is verbose in SystemC.
 3. With SystemC, the use of signals and variables is not always symmetric.
    In some cases, reading and writing signals is considerably more verbose
    than reading or writing variables of the same type.

You suffer from these whether you're writing cycle-accurate behavioural code
or synthesisable RTL code, so you can't get away from them.  However, they
should all be potentially solvable with suitable preprocessing.  (Anyone
remember Ratfor?)  You should also bear in mind that the actual time taken
to write synthesisable RTL, in the context of a complete project, is
negligible.  This has always been true (even RTL coders actually have to do
some design work), and is even more so at smaller geometries.  Jacques
Benkoski, Monterey Design's CEO, was recently quoted as saying "At 90nm
functional verification becomes an absolute nightmare.  It takes far longer
to correct RTL than write it".

On the plus side, it is very easy to write highly-configurable RTL; even
more so than in VHDL (since you control model elaboration, and can do
whatever you want beforehand.)

That being said, my list of remaining SystemC pros and cons is as follows:

The SystemC Pros:
-----------------

 1. It's C++.  You can't overstate the advantages of this.  The world's full
    of C++ programmers, for all those bits that aren't RTL.  You can even
    run it on Windows.  There is also a vast amount of useful software
    already written in C or C++.  As an example, my current code is
    documented with Doxygen, and uses mpatrol for memory leak detection.
    The front-end uses a parser developed in Bison and Flex, as well
    as having a Gtk GUI.  As a plus, all these tools are free.

 2. It's got a simulation kernel built into the library; so you don't need
    another HDL to run a simulation.  This can make running SystemC together
    with Verilog or VHDL tricky, but some tools do integrate SystemC
    co-simulation (NC-Sim, for one).

 3. SystemC has a (beta) verification support library (SCV), based on
    Cadence's TestBuilder.  This gives you introspection, transaction
    recording, and constrained randomisation.  There's nothing to stop you
    writing your own, or course.

 4. You can do everything from random stimulus generation, through
    transaction-level modelling, right down to RTL-level modelling
    in a single tool in SystemC.

 5. The C++ STL (Standard Template Library) saves a huge amount of wheel
    re-inventing.

 6. If you're doing behavioural modelling, SystemC will do a better job
    than Verilog.  If you're doing transaction-level modelling, SystemC
    will do a better job than either Verilog or VHDL.

 7. You get the source code.  You can look up the current bugs on the
    website, and fix them yourself if you want.  Synopsys does retain some
    control, but Cadence's involvement should ensure that it stays around,
    whatever Synopsys decides to do next week.  At this stage, it looks
    (politically) as if SystemC has a better future than System Verilog.

 8. It's free.  Did I already say that? This may seem like penny-pinching,
    but consider this.  If you write your behavioural code in Verilog or
    VHDL, then you may need many licences when developing and exploring
    complex devices.  If you write your RTL in Verilog or VHDL, then you
    will certainly need many licences when verifying the RTL.

 9. SystemC has fixed-point arithmetic; very useful for DSP code.

10. It's easier to develop large applications in C++ than it is in Specman
    or VHDL (or Verilog, if you're so inclined).  Incremental compilation
    and linking is easy, as is the creation and use of shared or static
    libraries.  VHDL has some of this functionality, but not enough.

11. SystemC is relatively fast.


The SystemC Cons:
-----------------

 1. It's C++.  There's no new syntax, which makes RTL tricky (see above).
    C++ is complex, quirky, and difficult to learn.  If you only know C,
    you'll need to do some more reading before starting with SystemC,
    because all those RTL bits are fitted into C++ using things like
    class hierarchies, operator overloading, and templates.  As for the
    learning curve, my own estimates of language difficulty, rated 1 to
    20, with 20 being the hardest, are:

             C          10
             Specman    11 (excluding generation and temporals)
             Verilog    12
             VHDL       14
             Usable C++ 16
             Specman    16 (including generation and temporals)
             Expert C++ 20

 2. The SystemC verification library is not nearly as sophisticated as
    dedicated tools such as Specman.  SystemC also does not provide any
    form of temporal assertions.  However, given that it's C++, you can bet
    that someone will be offering PSL or Sugar 2.0 as an add-on in the near
    future.  You can also run Specman on top of SystemC if you require the
    extra functionality.

 3. The SystemC documentation is currently poor.  There are a couple of
    books, and a newsgroup, but the LRM won't be available for 2 or 3
    months.  C++ itself, of course, has a vast amount of documentation,
    and a couple of very good newsgroups.

 4. SystemC compiler error messages can be a problem.  Some user-level
    errors can only be detected by the compiler deep in the SystemC code
    itself, and some debugging can be challenging.  This is another
    disadvantage of not having any new syntax.

 5. If you just use the free simulator, then you're stuck with VCD dumps
    for debug.  You need the commercial tools for anything better.

I may be wrong, but I think that CoCentric is still the only synthesiser.
However, there are multiple tools for converting between SystemC and other
HDLs, as well as other simulator implementations.

    - Evan Lavelle
      Riverside Machines Ltd.                    Dereham, Norfolk, UK


 Sign up for the DeepChip newsletter.
Email
 Read what EDA tool users really think.


Feedback About Wiretaps ESNUGs SIGN UP! Downloads Trip Reports Advertise

"Relax. This is a discussion. Anything said here is just one engineer's opinion. Email in your dissenting letter and it'll be published, too."
This Web Site Is Modified Every 2-3 Days
Copyright 1991-2024 John Cooley.  All Rights Reserved.
| Contact John Cooley | Webmaster | Legal | Feedback Form |

   !!!     "It's not a BUG,
  /o o\  /  it's a FEATURE!"
 (  >  )
  \ - / 
  _] [_     (jcooley 1991)