( 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