( ESNUG 400 Item 15 ) -------------------------------------------- [10/10/02]

From: Steve Golson <sgolson@trilobyte.com>
Subject: Golson's Comparison Of Formality vs. Chrysalis Design VERIFYer

Hi, John,

I've been using formal verification for about a year to verify some very
extensive ECOs being made to a multi-million gate netlist.  (More on that
later; I plan on writing a SNUG paper about the methodology.)

We started out using Chrysalis Design VERIFYer, which was subsequently
acquired by Avanti and recently by Synopsys.  I was able to use Synopsys' own
formal verification tool Formality to re-run some of this work.  What follows
is a summary of my experience with the two tools.  I've got some critical
comparisons, and some suggestions for improvements.

I used many versions of Design VERIFYer; most recently all my work has been
with the current version v2001.3.

All my Formality work has been with 2002.05.

1. Formality has much easier setup than Design VERIFYer.  The GUI and "flow"
methodology was pretty intuitive and made it easy to get started.
(Caveat: it probably helped that I was already an experienced Design VERIFYer
user, and understood a lot of the fundamental issues with equivalence
checking.)

2. Formality has a *much* nicer schematic display.  It looks similar to
Design Vision.

3. Formality has nicer Tcl scripting.

4. Formality matching uses syntax stolen from "sed" which allows you to
easily try it out before running the tool (and without consuming a license).
Nice!

5. Design VERIFYer schematic window splits vertically as well as
horizontally.  Also there are buttons to turn off each A/B view
independently.  Very nice when you are just poking around in one netlist.

6. In the Formality schematic, when you roll over an object, the pin name
should appear.  (And when you click on it.)

7. When Formality shows a failing pattern, it doesn't do a very good job
showing equivalent nets.  You need to show the mapping somehow.  Design
VERIFYer does a good job displaying all the logically equivalent names for a
signal.

8. Formality set_equivalence should work on pins.  Also need to allow
set_invert on pins and nets.  I suppose I should just use
create_cutpoint_blackbox and turn all my pins into ports.

9. In Formality when you click the GUI button "3. Setup" button, you aren't
automatically in Setup mode.  At first I thought this was a bug, but now I'm
convinced it's a feature.  Here's a great explanation from a Formality
specialist at Synopsys:

  This is designed to save new users (or harried experienced users, or user
  who are just dumb as posts like me) from themselves.  One of the really
  nice things about Formality is that it allows the user to iterate through
  the major steps without repeating a lot of computation.  The best example
  is the compare point matching stage.  If Formality were unable to fully
  match the designs and you needed to give it help, then after giving it that
  help once you hit the run matching button the tool will only operate on the
  subset of points that were unmatched.
  
  The way Formality used to work and the way I think Design VERIFYer works
  today, if you need to give the tool some help once you matched again the
  tool would start the entire matching process from scratch.  A waste of CPU
  cycles for one thing.  In some cases people got in trouble that way.  Let's
  say they were not as good with SED as they thought they were.  The SED rule
  they applied may have farther reaching affects than planned and caused some
  points to misalign.  The odds of that are greatly reduced if the rule only
  impacts the subset of unmatched points.  Another great benefit is that it
  allows for optional automatic matching techniques to be applied with
  greater success (greatly minimizing the need to ever write a SED rule).
  There is an optional algorithm that matches based on the best subset set of
  a name.  Sometimes the best subset match is not the right match (that is
  why it is optional).  With the iterative approach this can be turned on
  after the first matching has been attempted, therefor it is only working on
  the subset of unmatched points, thus greatly improving the odds that the
  best match is the right match.
  
  OK so iterative matching is a cool thing, what does that have to do with
  the setup button that won't put me in setup mode? Well, changing setup
  variables changes the ground rules for matching, making the matching
  results invalid.  If you revert to setup mode we have to dump the matching
  data and start from scratch again.  Since you are throwing away good work
  we want to be sure that is really what you want to do.  Sometimes people
  want to go to the setup screen just to check on the setup variables, not to
  change them.  By making you forcibly put us in set up mode (by typing setup
  or punching the "revert to setup" button on the setup screen) we allow you
  check without throwing away the matching info.  Make sense? In a flow where
  you end up going back to setup to change things this seems a bit clunky at
  first, but it enables us to implement iterative steps that greatly
  facilitate verification in the normal flow of things.
  
  Did I use the word greatly enough in that explanation?

10. Formality sometimes takes several minutes to exit after the

                  "Thank you for using Formality (R)!"

message.  This is weird.  I can't figure out what it's doing.  Formality
generates a work area and deletes it after its finished (the FM_WORK
subdirectory) so maybe that's what is going on.  Very strange.

11. Formality uses signature analysis to help figure out signals that match
in the two netlists.  This is cool! It can make matching very simple, as you
don't have to specify every little flop equivalence.

12. When Formality shows failing sim patterns, it should show the pin name as
well as the instance name.  Sometimes it's QN rather than Q, and having the
pin name makes it much easier to understand what's going on.

13. Design VERIFYer displays a *VERY* nice comparison of internal nets in rtl
mode!  For example, here's a snippet from a Design VERIFYer log_verify file:

      Equivalence #3787  - The two groups are equivalent.
      ->   NSB        +1 17258     A.$371
                      +1 17258     A.make_it_idle

                      +1 5324      B.n15216
                      -1 13346     B.n15221
                      -1 13346     B.X14130.Z
      ->   NSB        +1 5324      B.X14251.Z

So now I know that my internal rtl signal "make_it_idle" appears on netlist
wire "n15216" and an inverted version on "n15221".  This is great when you
are trying to hack in a gate-level ECO.

Formality doesn't seem to do this (at least I never figured out how).
Perhaps this is because VERIFYer often splits logic cones on non-state point
boundaries (NSB) while Formality mostly uses state points (i.e. flops).  From
the Design VERIFYer manual:

  Non-State Boundaries (NSBs) are intermediate pseudo-statepoints that are
  occasionally used within a logic cone to help manage comparisons between
  usually large logic cones.

My Synopsys specialist tells me:

  On the topic of splitting things on non-state boundaries, Formality can do
  that also.  It happens under the hood sometimes for the same reason noted
  in the Design VERIFYer manual (making large cones more manageable).  As the
  user you can also insert this points in the cone if you want to.  What you
  are doing is inserting a single input/single output black box in the logic
  cone (create_cutpoint_blackbox is the command if memory serves).  Perhaps
  there is some additional reporting we can do in cases where we have done
  this under the hood and therefor know something about the equivalence (or
  non equivalence) of the various subcones.

It would be interesting to see if Design VERIFYer splits things into more
NSBs than Formality (i.e. does Formality tend to have larger logic cones).

14. Design VERIFYer requires separate "build" and "verify" steps.  This
requires two different licenses (normally you get one of each).  This allows
you to parallelize your work (you can build on one machine while you compare
on another).  Very nice.

15. Formality allows you to quickly and easily check just one output, and
ignore all the rest.  You can do this in Design VERIFYer, but it's painful.

16. Formality can read synthesis .db libraries directly, while Design
VERIFYer has to read your sim models.  This adds some time and complexity to
the Design VERIFYer runs.  "But wait!" you say.  What if there is a bug in
the synth library?  Well, simply do a comparison of the two libraries first,
then you know that both representations are equivalent.  Or you can always
have Formality read the sim libs rather than the .db library.  (Reading cell
models on demand can sometimes be more efficient than read in the whole lib
as you have to do with .db libs.) Formality has this cool "-vcs" option where
it can use the same command-line syntax as VCS for specifying files,
libraries, directories, etc.


This brings me to the old canard "Formality shares code with Design
Compiler".  Maybe this was true a long time ago (back when the earth was
still cooling), but is no more.  The *important* and *critical* code is
separate.  Separate development, separate people.

Nevertheless I think that it is a *good* thing if *some* of the code is the
same: I like having the schematic display look like Design Vision, for
example.  Also being able to read .db files is great.  (The paranoid among us
can do a library verification against your sim models to be sure.)


Finally, here's a head-to-head comparison of both tools on a variety of
netlists.  These are all gate-to-gate equivalence checks.

All runs were done with 32-bit executables under Solaris 8 running on a
750MHz Sun Blade 1000.  The CPU time for Design VERIFYer is the sum of the
two build runs plus the verify run.

The following designs are all structurally identical.  Design VERIFYer's
name-based compare mode was used.  Even for rather large designs the runs
only take a few minutes.  Design VERIFYer is consistently faster than
Formality, and also requires less memory.  It appears that Design VERIFYer's
name-based algorithm is much more efficient than Formality's algorithm.

  DV = Design VERIFYer
  FM = Formality

                              CPU time     memory        swap
                               (hours)    (Mbytes)     (Mbytes)
  Design    Cells   Flops     DV    FM    DV    FM     DV    FM
  --------------------------------------------------------------
  M5       100143   20261    0.1   0.2    411   938    449   964
  M8        89507   13128    0.1   0.2    339   897    380   923
  M9        86373   13989    0.1   0.2    369  1105    409  1131
  M11       81557   11798    0.1   0.2    291  1116    314  1142
  M12       75459   11751    0.1   0.1    261   896    291   921
  M14       73636    7745    0.1   0.2    245  1076    273  1101
  M18       58860    6891    0.1   0.1    223   879    263   904
  M20       46704   10065    0.1   0.1    195   865    235   890
  M21       46704   10065    0.1   0.2    202  1055    243  1080
  M24       38041    6224    0.1   0.1    174   868    214   893
  M26       35213    5111    0.1   0.1    155   859    196   884
  M27       32116    5804    0.1   0.2    242  1064    252  1090
  M28       31356    6422    0.1   0.1    160   858    201   883
  M29       31258    5859    0.1   0.1    155   858    196   883
  M34       27740    4120    0.0   0.2     76  1047     86  1072
  M35       26894    5033    0.0   0.1    120   859    131   883
  M39       26558    3079    0.1   0.1    169  1047    179  1072
  M40       25834    2913    0.0   0.1     92  1047    102  1072
  M41       25260    4146    0.1   0.1    130  1047    170  1072
  M44       20754    4455    0.0   0.1    100   859    110   884
  M45       20221    4877    0.0   0.1     71  1047     81  1072
  M46       17341    3083    0.0   0.1     67  1048     77  1073
  M47       16914    1259    0.0   0.1     53  1048     64  1073
  M48       15467    2979    0.0   0.1     16   859     27   884
  M49       15056    2977    0.0   0.1     69   859     79   884
  M50       15056    2977    0.0   0.1     80   859     91   884
  M51       11674    1783    0.0   0.1     16   859     27   884
  M52        9767    1143    0.0   0.1     48  1048     58  1073
  M53        7019    1293    0.0   0.1     16   859     27   884
  M55        4330     864    0.0   0.1     29  1048     39  1073
  M56        4189     575    0.0   0.1     16   860     27   884
  M57        2883     388    0.0   0.1     16   860     27   884
  M58        2529     428    0.0   0.1     16  1048     27  1073
  M60        1178     205    0.0   0.1     16  1048     27  1073
  M61         517       0    0.0   0.1     16   859     27   884
  M62         510       0    0.0   0.1     16  1048     27  1073
  M63         343       0    0.0   0.1     16  1048     27  1073

The following designs are structurally different, requiring much more
computation.  Design VERIFYer was run in "rtl" mode.

                              CPU time     memory        swap
                               (hours)    (Mbytes)     (Mbytes)
  Design    Cells   Flops     DV    FM    DV    FM     DV    FM
  --------------------------------------------------------------
  M1      1282859  165728    ---   3.9    --   2287    --   2622
  M2      1026971  157077    ---   1.4    --   1670    --   1819
  M3       108025   16890  202.2*  0.6   1036  1286   1088  1315
  M4       104761   10388    3.0   0.3   1153  1188   1192  1216
  M6        91340    7403   12.9   0.4   1132  1073   1170  1105
  M7        90412   13862   19.5   1.0   1259  1178   1303  1207
  M10       84832    9167    0.8   0.2    943  1152    983  1181
  M13       73829    5920    0.2   0.2    445  1123    485  1148
  M15       71201    9339    3.8   0.2    611   917    651   943
  M16       66820    5927    3.7   0.3   1021  1254   1058  1283
  M17       64583    7592    4.9   0.1    828   883    867   908
  M19       47202    7346    0.1   0.2    297  1060    335  1085
  M22       43428    6569    0.2   0.2    392  1058    432  1083
  M23       38342    5785    1.0   0.2   1241  1068   1281  1093
  M25       35337    4748    2.9   0.5    736  1126    775  1154
  M30       30390    2811    0.2   0.1    233   898    272   922
  M31       29165    4298    0.4   0.2    356   867    394   892
  M32       28405    5275    0.1   0.1    262   887    300   912
  M33       28281    3911    0.6   0.2    348   920    387   946
  M36       26878    2652    1.1   0.2    986  1047   1025  1072
  M37       26780       0    ---   0.6     --  1145     --  1174
  M38       26780       0    ---   0.7     --  1145     --  1174
  M42       21116    3833    0.1   0.1    268   860    307   884
  M43       20768    2967    0.1   0.1    146   859    187   884
  M54        5912     729    0.0   0.1     17   859     27   884
  M59        1423     393    0.0   0.1     16  1048     27  1073

* Design M3 did not successfully complete when run under Design VERIFYer
(some endpoints had "timeouts").  I was unable to resolve this problem.  Note
that Formality was able to complete this design in under an hour.

Designs M37 and M38 never completed when run under Design VERIFYer (I killed
it after 531 hours).  Designs M1 and M2 were not attempted under Design
VERIFYer.

However Formality had no problem with any of the designs, even the largest
which has over 1.2 million instances.  The Formality run time is much much
less than Design VERIFYer, with all runs (except the largest) taking under an
hour.

In short, Formality capacity is outstanding.  It handles multi-million gate
designs with ease.

Memory usage is similar betweeen the two tools.

Notice that the size of the design (number of cells, number of flops) is
*not* a perfect predictor of how long the run will take.  As always, your
mileage may vary.  The underlying complexity of the design has a huge impact
on the ability of the tool to successfully complete.

My hope is that now that Synopsys owns both Design VERIFYer and Formality,
the strengths of each will be combined into one really outstanding formal
verification tool.

    - Steve Golson
      Trilobyte Systems                          Carlisle, MA


============================================================================
 Trying to figure out a Synopsys bug?  Want to hear how 14,488 other users
  dealt with it?  Then join the E-Mail Synopsys Users Group (ESNUG)!
 
     !!!     "It's not a BUG,               jcooley@TheWorld.com
    /o o\  /  it's a FEATURE!"                 (508) 429-4357
   (  >  )
    \ - /     - John Cooley, EDA & ASIC Design Consultant in Synopsys,
    _] [_         Verilog, VHDL and numerous Design Methodologies.

    Holliston Poor Farm, P.O. Box 6222, Holliston, MA  01746-6222
  Legal Disclaimer: "As always, anything said here is only opinion."
 The complete, searchable ESNUG Archive Site is at http://www.DeepChip.com

 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)