Notes8 Synthesizing The Design
Notes8 Synthesizing The Design
Following application of the synthesis constraints, we are ready to synthesize the VHDL code into
a physical netlist. All commands I discuss will work with Design Compiler.
REFERENCE much of this material was created using the Synopsys Chip Synthesis Workshop
Student Guide training notes as a guide.
Once all design constraints have been applied, the VHDL code is ready to be synthesized.
To synthesize the VHDL code, use the compile command as below.
compile map_effort medium
Although we could have specified a low or high map_effort, the first run of synthesis
should always be performed with medium map_effort. Most of the time, this will yield
good results and it is worth the trade off of what could easily be a very long CPU exercise
if map_effort high were specified on the first run.
Also, note, that there are many parameters that may be specified with the compile
command. We will discuss some of the more important ones following. Invoking compile -
help will list all possible parameters.
The result of executing this command will be a structural gate level netlist. We will be
doing this in the labs.
To generate a timing report using Synopsys DesignTime, invoke the following command
(shown with some of the more useful parameters, but not all).
report_timing [-to pin-list] [-from pin-list] [-delay min|max] [-max_paths
max_path_count] [-path short | full | only | end]
If the design has no timing constraints, the report_timing command defaults to reporting
timing for the longest path to an output port. If the design does have timing constraints, the
report_timing command defaults to reporting timing for the worst slack in each path
group (i.e. timing domain).
The next page shows an example of executing the command report_timing -delay max -
path end on my implementation of the design project.
We need to fix hold time violations. Because hold time violations are usually a result of
logic being too "fast", we switch to best case operating conditions to perform this step.
Further, we perform an "incremental" optimization on the gate level netlist, and only
permit the synthesizer to fix hold time violations without any further logic level
optimizations. To perform fixing of hold time violations, use the commands below.
set_fix_hold find( clock, clock_name)
compile map_effort high prioritize_min_paths only_design_rule -incremental
The prioritize-min-paths parameter treats min-delay and fix-hold as design rule violations,
thereby giving them higher priority.
The only-design-rule parameter takes less time then a regular compile and only design-
rule-fixing gate-level optimization is done.
Alternately, hold time fixing could be done using worst case operating conditions but the
clock uncertainty (skew) would need to be increased by the time delta between best case
and worst case operating conditions.
I suggest using the latter method for hold time fixing (that being using worst case operating
conditions and increasing the clock uncertainty by an appropriate amount), primarily
because:
a) switching between best case and worst case operating conditions is not as easy as
simply invoking a single command the operating conditions are specified in
the .synopsys_dc.setup file. And although vendors have tried to combine best case
and worst case operating conditions into a single environment to simplify hold time
fixing, it hasn't worked well in practice.
When fixing hold times, ALWAYS, ALWAYS, ALWAYS pay attention to any gate count
explosions. If the gate counts rockets, then chances are you were overly pessimistic in your
design constraints check them. The more buffers you insert into your circuit, the more
interconnect there is, and the greater the risk that there will a significant variance between
pre-layout timing results and post-layout timing results.
Final note. No hold time violation fixing should be done until AFTER scan logic is inserted.
Often, simply inserting scan logic (essentially replacing FFs with muxed FFs) fixes what
would have otherwise been hold time violations.
9.4 The Cost Function design rule constraints vs. optimization constraints
All design rule constraint and optimization constraint fixing has an associated cost cost in
terms of die area, synthesis time, etc.
Costs are computed on the basis of the difference between the actual and target constraints.
Design Compiler attempts to reduce both cost functions to zero. However, under no
circumstances will DRCs be violated, even if it means violating an optimization constraint.
The order of priority in which DC orders the cost functions and associated constraints
during synthesis is:
a) DRCs
b) MAX Delay
c) MIN Delay
d) MAX Area
Optimization stops when both cost functions reach zero, or when the DRC cost function is
zero and DC reaches a point of diminishing returns to further optimize.
a) UNIQUIFY
Makes unique copy of reference design for each instance.
Each cell is mapped to its own environment.
Likely, netlist for each referenced design component will be different.
DC will give each instance a unique instance name => likely, something like
instance-name-0, instance-name-l, etc.
b) SET-DONT-TOUCH
First, synthesize the design that will be instantiated multiple times.
Use set_dont_touch when the design environments are the same (this is usually the case, since
the designs will be fabricated in the same ASIC).
Uniquify takes more memory and CPU time than set_dont_touch. The ungroup command uses
more memory and CPU time than uniquify and set-dont-touch.